Merge "Update TypeConverters API to be more explicit" into androidx-main
diff --git a/.github/workflows/presubmit.yml b/.github/workflows/presubmit.yml
index f97cf48..6bb9f22 100644
--- a/.github/workflows/presubmit.yml
+++ b/.github/workflows/presubmit.yml
@@ -87,7 +87,7 @@
id: ktlint-file-args
run: |
set -x
- KTLINT_FILES=`echo "${{ steps.changed-files.outputs.files }}" | sed 's|[^ ]* *|--file=${{ github.workspace }}/&|g' | grep -v "*.txt"`
+ KTLINT_FILES=`echo "${{ steps.changed-files.outputs.files }}" | sed 's|[^ ]* *|--file=../&|g' | grep -v "*.txt"`
echo "::set-output name=ktlint-file-args::$KTLINT_FILES"
- name: "Parse changed-files as affected files args"
diff --git a/.gitignore b/.gitignore
index 4f6dffb..75f9f9f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,7 @@
**/gen
*.iml
**/out
+build
buildSrc/build
buildSrc/lint-checks/build
buildSrc/jetpad-integration/build
diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index 653a3f8..877876f 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -259,7 +259,7 @@
<codeStyleSettings language="kotlin">
<option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
<option name="ALIGN_MULTILINE_PARAMETERS" value="false" />
- <option name="WRAP_ON_TYPING" value="1" />
+ <option name="WRAP_ON_TYPING" value="0" />
<indentOptions>
<option name="CONTINUATION_INDENT_SIZE" value="4" />
</indentOptions>
diff --git a/activity/activity-compose/api/1.4.0-beta02.txt b/activity/activity-compose/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..66989c4
--- /dev/null
+++ b/activity/activity-compose/api/1.4.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+ public final class ActivityComposeUtilsKt {
+ }
+
+ public final class ActivityResultRegistryKt {
+ method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.compose.ManagedActivityResultLauncher<I,O> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
+ }
+
+ public final class BackHandlerKt {
+ method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+ }
+
+ public final class ComponentActivityKt {
+ method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ }
+
+ public final class LocalActivityResultRegistryOwner {
+ method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+ method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+ property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+ field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+ }
+
+ public final class LocalOnBackPressedDispatcherOwner {
+ method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+ method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+ property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+ field public static final androidx.activity.compose.LocalOnBackPressedDispatcherOwner INSTANCE;
+ }
+
+ public final class ManagedActivityResultLauncher<I, O> extends androidx.activity.result.ActivityResultLauncher<I> {
+ method public androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
+ method public void launch(I? input, androidx.core.app.ActivityOptionsCompat? options);
+ method @Deprecated public void unregister();
+ }
+
+}
+
diff --git a/activity/activity-compose/api/public_plus_experimental_1.4.0-beta02.txt b/activity/activity-compose/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..66989c4
--- /dev/null
+++ b/activity/activity-compose/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+ public final class ActivityComposeUtilsKt {
+ }
+
+ public final class ActivityResultRegistryKt {
+ method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.compose.ManagedActivityResultLauncher<I,O> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
+ }
+
+ public final class BackHandlerKt {
+ method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+ }
+
+ public final class ComponentActivityKt {
+ method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ }
+
+ public final class LocalActivityResultRegistryOwner {
+ method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+ method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+ property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+ field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+ }
+
+ public final class LocalOnBackPressedDispatcherOwner {
+ method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+ method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+ property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+ field public static final androidx.activity.compose.LocalOnBackPressedDispatcherOwner INSTANCE;
+ }
+
+ public final class ManagedActivityResultLauncher<I, O> extends androidx.activity.result.ActivityResultLauncher<I> {
+ method public androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
+ method public void launch(I? input, androidx.core.app.ActivityOptionsCompat? options);
+ method @Deprecated public void unregister();
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/activity/activity-compose/api/res-1.4.0-beta02.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to activity/activity-compose/api/res-1.4.0-beta02.txt
diff --git a/activity/activity-compose/api/restricted_1.4.0-beta02.txt b/activity/activity-compose/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..66989c4
--- /dev/null
+++ b/activity/activity-compose/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,40 @@
+// Signature format: 4.0
+package androidx.activity.compose {
+
+ public final class ActivityComposeUtilsKt {
+ }
+
+ public final class ActivityResultRegistryKt {
+ method @androidx.compose.runtime.Composable public static <I, O> androidx.activity.compose.ManagedActivityResultLauncher<I,O> rememberLauncherForActivityResult(androidx.activity.result.contract.ActivityResultContract<I,O> contract, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> onResult);
+ }
+
+ public final class BackHandlerKt {
+ method @androidx.compose.runtime.Composable public static void BackHandler(optional boolean enabled, kotlin.jvm.functions.Function0<kotlin.Unit> onBack);
+ }
+
+ public final class ComponentActivityKt {
+ method public static void setContent(androidx.activity.ComponentActivity, optional androidx.compose.runtime.CompositionContext? parent, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ }
+
+ public final class LocalActivityResultRegistryOwner {
+ method @androidx.compose.runtime.Composable public androidx.activity.result.ActivityResultRegistryOwner? getCurrent();
+ method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.result.ActivityResultRegistryOwner> provides(androidx.activity.result.ActivityResultRegistryOwner registryOwner);
+ property @androidx.compose.runtime.Composable public final androidx.activity.result.ActivityResultRegistryOwner? current;
+ field public static final androidx.activity.compose.LocalActivityResultRegistryOwner INSTANCE;
+ }
+
+ public final class LocalOnBackPressedDispatcherOwner {
+ method @androidx.compose.runtime.Composable public androidx.activity.OnBackPressedDispatcherOwner? getCurrent();
+ method public infix androidx.compose.runtime.ProvidedValue<androidx.activity.OnBackPressedDispatcherOwner> provides(androidx.activity.OnBackPressedDispatcherOwner dispatcherOwner);
+ property @androidx.compose.runtime.Composable public final androidx.activity.OnBackPressedDispatcherOwner? current;
+ field public static final androidx.activity.compose.LocalOnBackPressedDispatcherOwner INSTANCE;
+ }
+
+ public final class ManagedActivityResultLauncher<I, O> extends androidx.activity.result.ActivityResultLauncher<I> {
+ method public androidx.activity.result.contract.ActivityResultContract<I,?> getContract();
+ method public void launch(I? input, androidx.core.app.ActivityOptionsCompat? options);
+ method @Deprecated public void unregister();
+ }
+
+}
+
diff --git a/activity/activity-compose/build.gradle b/activity/activity-compose/build.gradle
index 8c43fd0..f2553e3 100644
--- a/activity/activity-compose/build.gradle
+++ b/activity/activity-compose/build.gradle
@@ -45,6 +45,8 @@
lintChecks(projectOrArtifact(":activity:activity-compose-lint"))
lintPublish(projectOrArtifact(":activity:activity-compose-lint"))
+
+ samples(projectOrArtifact(":activity:activity-compose:activity-compose-samples"))
}
androidx {
diff --git a/activity/activity-compose/samples/lint-baseline.xml b/activity/activity-compose/samples/lint-baseline.xml
new file mode 100644
index 0000000..515e1b1f
--- /dev/null
+++ b/activity/activity-compose/samples/lint-baseline.xml
@@ -0,0 +1,9779 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED, but could be AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE, AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_APPEARED, AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED"
+ errorLine1=" return event.getContentChangeTypes();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="344"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Action.SEMANTIC_ACTION_NONE, Action.SEMANTIC_ACTION_REPLY, Action.SEMANTIC_ACTION_MARK_AS_READ, Action.SEMANTIC_ACTION_MARK_AS_UNREAD, Action.SEMANTIC_ACTION_DELETE, Action.SEMANTIC_ACTION_ARCHIVE, Action.SEMANTIC_ACTION_MUTE, Action.SEMANTIC_ACTION_UNMUTE, Action.SEMANTIC_ACTION_THUMBS_UP, Action.SEMANTIC_ACTION_THUMBS_DOWN, Action.SEMANTIC_ACTION_CALL"
+ errorLine1=" builder.setSemanticAction(action.getSemanticAction());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4755"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" ? remoteInput.getEditChoicesBeforeSending()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="6375"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" ? src.getEditChoicesBeforeSending()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="7408"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Action.SEMANTIC_ACTION_NONE, Action.SEMANTIC_ACTION_REPLY, Action.SEMANTIC_ACTION_MARK_AS_READ, Action.SEMANTIC_ACTION_MARK_AS_UNREAD, Action.SEMANTIC_ACTION_DELETE, Action.SEMANTIC_ACTION_ARCHIVE, Action.SEMANTIC_ACTION_MUTE, Action.SEMANTIC_ACTION_UNMUTE, Action.SEMANTIC_ACTION_THUMBS_UP, Action.SEMANTIC_ACTION_THUMBS_DOWN, Action.SEMANTIC_ACTION_CALL"
+ errorLine1=" actionBuilder.setSemanticAction(action.getSemanticAction());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+ line="390"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: LineBreaker.BREAK_STRATEGY_SIMPLE, LineBreaker.BREAK_STRATEGY_HIGH_QUALITY, LineBreaker.BREAK_STRATEGY_BALANCED"
+ errorLine1=" .setBreakStrategy(params.getBreakStrategy())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="467"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, Layout.HYPHENATION_FREQUENCY_NONE"
+ errorLine1=" .setHyphenationFrequency(params.getHyphenationFrequency())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="468"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.SOURCE_FREE_FORM_INPUT, RemoteInput.SOURCE_CHOICE"
+ errorLine1=" return android.app.RemoteInput.getResultsSource(intent);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="531"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="576"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="598"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: LineBreaker.BREAK_STRATEGY_SIMPLE, LineBreaker.BREAK_STRATEGY_HIGH_QUALITY, LineBreaker.BREAK_STRATEGY_BALANCED"
+ errorLine1=" textView.setBreakStrategy(params.getBreakStrategy());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/TextViewCompat.java"
+ line="886"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, Layout.HYPHENATION_FREQUENCY_NONE"
+ errorLine1=" textView.setHyphenationFrequency(params.getHyphenationFrequency());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/TextViewCompat.java"
+ line="887"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Callback.DISPATCH_MODE_STOP, Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE"
+ errorLine1=" super(compat.getDispatchMode());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsAnimationCompat.java"
+ line="968"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: Type.STATUS_BARS, Type.NAVIGATION_BARS, Type.CAPTION_BAR, Type.IME, Type.WINDOW_DECOR, Type.SYSTEM_GESTURES, Type.MANDATORY_SYSTEM_GESTURES, Type.TAPPABLE_ELEMENT, Type.DISPLAY_CUTOUT"
+ errorLine1=" return mController.getTypes();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsAnimationControllerCompat.java"
+ line="332"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH, WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE, WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE"
+ errorLine1=" return mImpl.getSystemBarsBehavior();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsControllerCompat.java"
+ line="275"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH, WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE, WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, but could be WindowInsetsController.BEHAVIOR_DEFAULT"
+ errorLine1=" return mInsetsController.getSystemBarsBehavior();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsControllerCompat.java"
+ line="730"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" requestRelaunchActivityMethod.invoke(activityThread,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/app/ActivityRecreator.java"
+ line="152"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" performStopActivity3ParamsMethod.invoke(activityThread,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/app/ActivityRecreator.java"
+ line="274"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" performStopActivity2ParamsMethod.invoke(activityThread,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/app/ActivityRecreator.java"
+ line="277"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (IBinder) sGetIBinderMethod.invoke(bundle, key);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/BundleCompat.java"
+ line="60"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" sPutIBinderMethod.invoke(bundle, key, binder);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/BundleCompat.java"
+ line="84"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) getMethod.invoke(systemProperties, name);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DisplayCompat.java"
+ line="135"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) sGetScriptMethod.invoke(null, args);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/ICUCompat.java"
+ line="116"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) sAddLikelySubtagsMethod.invoke(null, args);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/ICUCompat.java"
+ line="133"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (int) icon.getClass().getMethod("getType").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1104"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) icon.getClass().getMethod("getResPackage").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1132"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (int) icon.getClass().getMethod("getResId").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1161"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Uri) icon.getClass().getMethod("getUri").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1189"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) sActionBarOnMenuKeyMethod.invoke(actionBar, event);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/KeyEventDispatcher.java"
+ line="106"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" Boolean result = (Boolean) sMethodUserHandleIsAppMethod.invoke(null, uid);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ProcessCompat.java"
+ line="104"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" Boolean result = (Boolean) sMethodUserIdIsAppMethod.invoke(null, uid);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ProcessCompat.java"
+ line="142"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" sRebaseMethod.invoke(theme);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="704"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" removeItemAtMethod.invoke(menu, i);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/TextViewCompat.java"
+ line="625"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) sCreateFromFamiliesWithDefault.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java"
+ line="127"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" final Boolean result = (Boolean) sAddFontWeightStyle.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java"
+ line="138"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" final Boolean result = (Boolean) sAddFontWeightStyle.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java"
+ line="112"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) sCreateFromFamiliesWithDefault.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java"
+ line="124"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mAddFontFromAssetManager.invoke(family,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="140"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mAddFontFromBuffer.invoke(family,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="155"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) mCreateFromFamiliesWithDefault.invoke(null /* static method */,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="171"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mFreeze.invoke(family);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="183"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mAbortCreation.invoke(family);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="194"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) mCreateFromFamiliesWithDefault.invoke(null /* static method */,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="51"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) sIsProjectedDrawableMethod.invoke(mDrawable);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/WrappedDrawableApi21.java"
+ line="131"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="PrivateConstructorForUtilityClass"
+ message="Utility class is missing private constructor"
+ errorLine1="public class NotificationCompat {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="82"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `parent` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getParent() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2164"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2179"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`CollectionInfoCompat`) and setter parameter type (`Object`) getter and setter methods for property `collectionInfo` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public CollectionInfoCompat getCollectionInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2988"
+ column="33"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2998"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`CollectionItemInfoCompat`) and setter parameter type (`Object`) getter and setter methods for property `collectionItemInfo` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public CollectionItemInfoCompat getCollectionItemInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3021"
+ column="37"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3007"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `labelFor` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabelFor() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3262"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3225"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `labeledBy` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabeledBy() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3318"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3276"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getCanOpenPopup` such that `canOpenPopup` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean canOpenPopup() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3331"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `traversalBefore` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalBefore() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3533"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3555"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `traversalAfter` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalAfter() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3598"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3620"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `source` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getSource() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="159"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="97"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `setLongpressEnabled` such that (along with the `isLongpressEnabled` getter) Kotlin code can access it as a property (`longpressEnabled`); see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public void setIsLongpressEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="555"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getShouldShowIcon` such that `shouldShowIcon` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean shouldShowIcon() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="150"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getMipMap` such that `mipMap` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean hasMipMap() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="181"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getAntiAlias` such that `antiAlias` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean hasAntiAlias() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="205"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 2, "r", in androidx.core.os.HandlerCompat.postDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" @Nullable Object token, long delayMillis) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/HandlerCompat.java"
+ line="181"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 1, "component", in androidx.core.view.KeyEventDispatcher.dispatchKeyEvent) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" @Nullable View root, @Nullable Window.Callback callback, @NonNull KeyEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/KeyEventDispatcher.java"
+ line="79"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 1, "callable", in androidx.core.provider.SelfDestructiveThread.postAndWait) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" public <T> T postAndWait(final Callable<T> callable, int timeoutMillis)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="169"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityNodeInfoCompat nodeInfoCompat, int clickableSpanActionId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityClickableSpanCompat.java"
+ line="55"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityDelegateCompat(AccessibilityDelegate originalDelegate) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="147"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sendAccessibilityEvent(View host, int eventType) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="173"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="195"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="195"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="216"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="216"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="236"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="236"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="256"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="256"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="275"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="275"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="299"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="299"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="300"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="318"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="318"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAccessibilityAction(View host, int action, Bundle args) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="344"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAccessibilityAction(View host, int action, Bundle args) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="344"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getRecordCount(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="257"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void appendRecord(AccessibilityEvent event, AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="273"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void appendRecord(AccessibilityEvent event, AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="273"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat getRecord(AccessibilityEvent event, int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="287"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat getRecord(AccessibilityEvent event, int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="287"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat asRecord(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="308"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat asRecord(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="308"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setContentChangeTypes(AccessibilityEvent event,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="320"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getContentChangeTypes(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="342"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMovementGranularity(AccessibilityEvent event, int granularity) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="357"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMovementGranularity(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="368"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setAction(AccessibilityEvent event, int action) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="393"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getAction(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="404"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="45"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="46"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="66"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="67"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="118"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityManager manager) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="119"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="141"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityManager manager, int feedbackTypeFlags) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="142"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="155"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="166"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" TouchExplorationStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="167"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="185"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" TouchExplorationStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="186"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat(int actionId, CharSequence label) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="608"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat(int actionId, CharSequence label,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="621"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityViewCommand command) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="622"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getLabel() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="667"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean perform(View view, Bundle arguments) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="683"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean perform(View view, Bundle arguments) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="683"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat createReplacementAction(CharSequence label,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="707"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat createReplacementAction(CharSequence label,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="707"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityViewCommand command) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="708"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionInfoCompat obtain(int rowCount, int columnCount,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="777"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionInfoCompat obtain(int rowCount, int columnCount,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="799"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="898"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="923"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static RangeInfoCompat obtain(int type, float min, float max, float current) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1040"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat(Object info) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1696"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat wrap(@NonNull AccessibilityNodeInfo info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1710"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfo unwrap() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1717"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getInfo() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1727"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1738"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View source) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1738"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1752"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1752"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1766"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1777"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1777"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View source) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1786"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1812"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat findFocus(int focus) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1832"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat focusSearch(int direction) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1854"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getChild(int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1893"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addChild(View child) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1908"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addChild(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1926"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean removeChild(View child) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1946"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean removeChild(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1964"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addAction(AccessibilityActionCompat action) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2029"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean removeAction(AccessibilityActionCompat action) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2054"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAction(int action, Bundle arguments) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2091"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2143"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2143"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getParent() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2164"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setParent(View parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2179"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setParent(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2205"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getBoundsInParent(Rect outBounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2226"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBoundsInParent(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2249"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getBoundsInScreen(Rect outBounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2258"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBoundsInScreen(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2273"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getPackageName() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2617"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPackageName(CharSequence packageName) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2632"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getClassName() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2641"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setClassName(CharSequence className) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2656"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2665"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setText(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2695"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addSpansToExtras(CharSequence text, View view) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2703"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addSpansToExtras(CharSequence text, View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2703"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ClickableSpan[] getClickableSpans(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2740"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ClickableSpan[] getClickableSpans(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2740"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2801"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2831"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setViewIdResourceName(String viewId) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2876"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getViewIdResourceName() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2894"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CollectionInfoCompat getCollectionInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2988"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCollectionInfo(Object collectionInfo) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2998"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCollectionItemInfo(Object collectionItemInfo) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3007"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CollectionItemInfoCompat getCollectionItemInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3021"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RangeInfoCompat getRangeInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3036"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setRangeInfo(RangeInfoCompat rangeInfo) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3056"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityActionCompat> getActionList() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3073"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setError(CharSequence error) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3200"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getError() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3211"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabelFor(View labeled) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3225"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabelFor(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3245"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabelFor() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3262"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabeledBy(View label) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3276"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabeledBy(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3301"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabeledBy() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3318"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(String viewId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3378"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(String viewId) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3378"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Bundle getExtras() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3404"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalBefore() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3533"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalBefore(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3555"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalBefore(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3582"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalAfter() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3598"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalAfter(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3620"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalAfter(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3646"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityWindowInfoCompat getWindow() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3659"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeProviderCompat(Object provider) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="137"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getProvider() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="144"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAction(int virtualViewId, int action, Bundle arguments) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="188"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="207"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityRecordCompat(Object record) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="43"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getImpl() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="54"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="69"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="69"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat obtain() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="83"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View source) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="97"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="118"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setSource(@NonNull AccessibilityRecord record, View root,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="137"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getSource() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="159"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMaxScrollX(AccessibilityRecord record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="481"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="507"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMaxScrollY(AccessibilityRecord record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="531"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="557"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getClassName() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="623"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setClassName(CharSequence className) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="637"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<CharSequence> getText() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="650"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getBeforeText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="662"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBeforeText(CharSequence beforeText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="676"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="688"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="702"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable getParcelableData() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="714"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setParcelableData(Parcelable parcelableData) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="728"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBundle(Bundle bundle) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java"
+ line="53"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getHTMLElement() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java"
+ line="103"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java"
+ line="138"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getRoot() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="125"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityWindowInfoCompat getParent() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="139"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getBoundsInScreen(Rect outBounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="165"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityWindowInfoCompat getChild(int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="231"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="245"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getAnchor() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="258"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityWindowInfoCompat obtain() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="273"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityWindowInfoCompat obtain(AccessibilityWindowInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="289"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityWindowInfoCompat obtain(AccessibilityWindowInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="289"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionProvider(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="133"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="140"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View onCreateActionView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="149"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateActionView(MenuItem forItem) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="163"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateActionView(MenuItem forItem) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="163"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPrepareSubMenu(SubMenu subMenu) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="262"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubUiVisibilityListener(SubUiVisibilityListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="282"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setVisibilityListener(VisibilityListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="292"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PermissionCompatDelegate getPermissionCompatDelegate() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="173"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean invalidateOptionsMenu(Activity activity) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="211"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static DragAndDropPermissionsCompat requestDragAndDropPermissions(Activity activity,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="605"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" DragEvent dragEvent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="606"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Pair<View, String>... sharedElements) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+ line="206"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AutoScrollHelper setEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="235"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AutoScrollHelper setExclusive(boolean exclusive) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="263"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="465"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="465"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] getAutoSizeTextAvailableSizes();"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoSizeableTextView.java"
+ line="151"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="157"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder stereoReset(boolean stereoReset) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="176"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTextDirectionHeuristic(TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="192"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTextDirectionHeuristic(TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="192"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public BidiFormatter build() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="204"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="235"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance(boolean rtlContext) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="244"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance(Locale locale) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="253"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="253"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean isRtl(String str) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="346"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean isRtl(CharSequence str) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="357"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="390"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="390"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic, boolean isolate) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="390"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="409"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="409"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="409"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="440"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="440"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="440"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="455"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="455"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="455"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="468"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="468"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, boolean isolate) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="482"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, boolean isolate) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="482"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="493"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="493"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="505"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="505"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onStateChanged(int[] stateSet) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ComplexColorCompat.java"
+ line="107"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void putExtraData(ExtraData extraData) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="78"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T extends ExtraData> T getExtraData(Class<T> extraDataClass) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="106"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean superDispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="121"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyShortcutEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="126"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="135"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Cursor query(ContentResolver resolver,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="71"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Cursor query(ContentResolver resolver,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="71"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String sortOrder, CancellationSignal cancellationSignal) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="73"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String sortOrder, CancellationSignal cancellationSignal) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="73"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Object getWrapper();"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/CoreComponentFactory.java"
+ line="118"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String concatenateWhere(String a, String b) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="40"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String concatenateWhere(String a, String b) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="40"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String concatenateWhere(String a, String b) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="40"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="59"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="59"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="59"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void buildShortClassTag(Object cls, StringBuilder out) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/DebugUtils.java"
+ line="31"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void buildShortClassTag(Object cls, StringBuilder out) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/DebugUtils.java"
+ line="31"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DisplayCutoutCompat(Rect safeInsets, List<Rect> boundingRects) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+ line="55"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DisplayCutoutCompat(Rect safeInsets, List<Rect> boundingRects) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+ line="55"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static DragAndDropPermissionsCompat request(Activity activity, DragEvent dragEvent) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
+ line="49"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static DragAndDropPermissionsCompat request(Activity activity, DragEvent dragEvent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
+ line="49"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onDragStart(View v, DragStartHelper helper);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="87"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onDragStart(View v, DragStartHelper helper);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="87"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DragStartHelper(View view, OnDragStartListener listener) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="96"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DragStartHelper(View view, OnDragStartListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="96"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="128"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="128"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onLongClick(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="169"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getTouchPosition(Point point) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="177"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorFilter getColorFilter(@NonNull Drawable drawable) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+ line="209"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Drawable wrap(@NonNull Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+ line="306"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public EdgeEffectCompat(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="53"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="294"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Uri getUriForFile(@NonNull Context context, @NonNull String authority,"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="439"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="504"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getType(@NonNull Uri uri) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="546"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Uri insert(@NonNull Uri uri, ContentValues values) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="567"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Uri insert(@NonNull Uri uri, ContentValues values) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="567"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int update(@NonNull Uri uri, ContentValues values, @Nullable String selection,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="576"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AuthenticationResult(CryptoObject crypto) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="251"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CryptoObject getCryptoObject() { return mCryptoObject; }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="260"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAuthenticationError(int errMsgId, CharSequence errString) { }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="277"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="286"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAuthenticationSucceeded(AuthenticationResult result) { }"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="292"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getIdentifier() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontRequest.java"
+ line="156"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static @Nullable FamilyResourceEntry parse(XmlPullParser parser, Resources resources)"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="181"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static @Nullable FamilyResourceEntry parse(XmlPullParser parser, Resources resources)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="181"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<List<byte[]>> readCerts(Resources resources, @ArrayRes int certsId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="269"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<List<byte[]>> readCerts(Resources resources, @ArrayRes int certsId) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="269"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public FontInfo[] getFonts() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="399"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTypefaceRetrieved(Typeface typeface) {}"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="486"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Typeface getFontSync("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="543"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="544"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final FontRequest request,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="545"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Map<Uri, ByteBuffer> prepareFontData("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="588"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="589"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontInfo[] fonts,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="590"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CancellationSignal cancellationSignal"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="591"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="505"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="505"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="519"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="519"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="519"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="542"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnDoubleTapListener(OnDoubleTapListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="566"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void apply(int gravity, int w, int h, Rect container,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="62"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Rect outRect, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="63"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void apply(int gravity, int w, int h, Rect container,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="96"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int xAdj, int yAdj, Rect outRect, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="97"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void applyDisplay(int gravity, Rect display, Rect inoutObj, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="125"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void applyDisplay(int gravity, Rect display, Rect inoutObj, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="125"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String maximizeAndGetScript(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/ICUCompat.java"
+ line="88"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public byte[] mData = null;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="176"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable mParcelable = null;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="182"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList mTintList = null;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="206"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String mTintModeStr = null;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="216"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String mString1;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="223"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Context context, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="232"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Context context, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="232"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="243"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="243"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="243"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="270"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="270"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="285"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="285"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithData(byte[] data, int offset, int length) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="303"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithData(byte[] data, int offset, int length) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="303"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(String uri) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="320"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(String uri) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="320"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(Uri uri) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="335"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(Uri uri) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="335"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTint(@ColorInt int tint) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="496"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintList(ColorStateList tintList) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="506"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintList(ColorStateList tintList) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="506"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintMode(PorterDuff.Mode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="517"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintMode(PorterDuff.Mode mode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="517"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IBinder onBind(@NonNull Intent intent) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/JobIntentService.java"
+ line="468"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean superDispatchKeyEvent(KeyEvent event);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/KeyEventDispatcher.java"
+ line="191"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LayoutInflaterFactory getFactory(LayoutInflater inflater) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterCompat.java"
+ line="169"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LayoutInflaterFactory getFactory(LayoutInflater inflater) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterCompat.java"
+ line="169"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+ line="64"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+ line="64"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+ line="64"
+ column="84"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LocaleListCompat wrap(Object localeList) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="45"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LocaleListCompat wrap(Object localeList) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="45"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Locale get(int index) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="85"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int indexOf(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="116"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LogWriter(String tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LogWriter.java"
+ line="43"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" @Override public void write(char[] buf, int offset, int count) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LogWriter.java"
+ line="55"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMarginStart(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="41"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMarginEnd(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="60"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMarginStart(ViewGroup.MarginLayoutParams lp, int marginStart) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="79"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMarginEnd(ViewGroup.MarginLayoutParams lp, int marginEnd) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="98"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isMarginRelative(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="111"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getLayoutDirection(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="125"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="149"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void resolveLayoutDirection(ViewGroup.MarginLayoutParams lp,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="159"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setShowAsAction(MenuItem item, int actionEnum) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuCompat.java"
+ line="35"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setGroupDividerEnabled(Menu menu, boolean enabled) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuCompat.java"
+ line="45"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onMenuItemActionExpand(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="109"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onMenuItemActionCollapse(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="118"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setShowAsAction(MenuItem item, int actionEnum) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="134"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, View view) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="152"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, View view) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="152"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="152"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="174"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="174"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static View getActionView(MenuItem item) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="187"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static View getActionView(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="187"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionProvider(MenuItem item, ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="206"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionProvider(MenuItem item, ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="206"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionProvider(MenuItem item, ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="206"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ActionProvider getActionProvider(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="223"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ActionProvider getActionProvider(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="223"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean expandActionView(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="248"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean collapseActionView(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="267"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isActionViewExpanded(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="283"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setOnActionExpandListener(MenuItem item,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="300"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setOnActionExpandListener(MenuItem item,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="300"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="301"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setContentDescription(MenuItem item, CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="321"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setContentDescription(MenuItem item, CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="321"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getContentDescription(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="334"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getContentDescription(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="334"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTooltipText(MenuItem item, CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="350"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTooltipText(MenuItem item, CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="350"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getTooltipText(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="363"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getTooltipText(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="363"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setShortcut(MenuItem item, char numericChar, char alphaChar,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="395"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setNumericShortcut(MenuItem item, char numericChar, int numericModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="417"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getNumericModifiers(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="435"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setAlphabeticShortcut(MenuItem item, char alphaChar, int alphaModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="462"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getAlphabeticModifiers(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="480"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintList(MenuItem item, ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="502"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintList(MenuItem item, ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="502"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorStateList getIconTintList(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="514"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorStateList getIconTintList(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="514"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="533"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="533"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PorterDuff.Mode getIconTintMode(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="547"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PorterDuff.Mode getIconTintMode(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="547"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getActionMasked(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="464"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getActionIndex(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="476"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int findPointerIndex(MotionEvent event, int pointerId) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="487"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getPointerId(MotionEvent event, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="498"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getX(MotionEvent event, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="509"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getY(MotionEvent event, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="520"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getPointerCount(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="531"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getSource(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="543"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isFromSource(MotionEvent event, int source) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="552"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getAxisValue(MotionEvent event, int axis) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="569"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getAxisValue(MotionEvent event, int axis, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="589"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getButtonState(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="598"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onScrollChange(NestedScrollView v, int scrollX, int scrollY,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="99"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int dyUnconsumed, int[] offsetInWindow, int type) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="262"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow,"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="268"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow,"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="268"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int dyUnconsumed, int[] offsetInWindow) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="302"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="308"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="308"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="487"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="496"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="505"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="505"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="514"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="514"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="635"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onInterceptTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="732"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="844"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onGenericMotionEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1067"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void measureChild(View child, int parentWidthMeasureSpec,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1630"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1646"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1814"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void requestChildFocus(View child, View focused) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1880"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void requestChildFocus(View child, View focused) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1880"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Rect previouslyFocusedRect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1900"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean requestChildRectangleOnScreen(View child, Rect rectangle,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1927"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean requestChildRectangleOnScreen(View child, Rect rectangle,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1927"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="2072"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="2151"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Parcelable onSaveInstanceState() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="2164"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Notification.Builder getBuilder();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationBuilderWithBuilderAccessor.java"
+ line="34"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context mContext;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="892"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ArrayList<Action> mActions = new ArrayList<>();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="896"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ArrayList<String> mPeople;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="958"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews getContentView() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2445"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews getBigContentView() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2453"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews getHeadsUpContentView() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2461"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Builder mBuilder;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2529"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2575"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2591"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2591"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2599"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2599"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2607"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2607"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Bitmap createColoredBitmap(int iconId, int color) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2918"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void buildIntoRemoteViews(RemoteViews outerView,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2968"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" RemoteViews innerView) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2969"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="3106"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="3326"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="3670"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4230"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4331"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4342"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4342"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4359"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4359"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4380"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4380"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence title;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4564"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PendingIntent actionIntent;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4569"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IBinder onBind(Intent intent) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IBinder onBind(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="47"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void notify(String packageName, int id, String tag, Notification notification);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="62"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void notify(String packageName, int id, String tag, Notification notification);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="62"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void notify(String packageName, int id, String tag, Notification notification);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="62"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void cancel(String packageName, int id, String tag);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="67"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void cancel(String packageName, int id, String tag);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="67"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void cancelAll(String packageName);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="72"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OnApplyWindowInsetsListener.java"
+ line="42"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OnApplyWindowInsetsListener.java"
+ line="42"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OnApplyWindowInsetsListener.java"
+ line="42"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onViewAttachedToWindow(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OneShotPreDrawListener.java"
+ line="89"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onViewDetachedFromWindow(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OneShotPreDrawListener.java"
+ line="94"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static <T> Parcelable.Creator<T> newCreator("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompat.java"
+ line="39"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ParcelableCompatCreatorCallbacks<T> callbacks) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompat.java"
+ line="40"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" T createFromParcel(Parcel in, ClassLoader loader);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
+ line="40"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" T createFromParcel(Parcel in, ClassLoader loader);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
+ line="40"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" T[] newArray(int size);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
+ line="49"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(Path path) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="47"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(Path path) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="47"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(float controlX, float controlY) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="62"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(float controlX1, float controlY1,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="79"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Path createPathFromPathData(String pathData) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="72"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Path createPathFromPathData(String pathData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="72"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] createNodesFromPathData(String pathData) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="90"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] createNodesFromPathData(String pathData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="90"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="119"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="119"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="162"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="162"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean interpolatePathDataNodes(PathDataNode[] target, PathDataNode[] from,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="313"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean interpolatePathDataNodes(PathDataNode[] target, PathDataNode[] from,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="313"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" PathDataNode[] to, float fraction) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="314"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public float[] mParams;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="350"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void nodesToPath(PathDataNode[] node, Path path) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="368"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void nodesToPath(PathDataNode[] node, Path path) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="368"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void interpolatePathDataNode(PathDataNode nodeFrom, PathDataNode nodeTo,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="386"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void interpolatePathDataNode(PathDataNode nodeFrom, PathDataNode nodeTo,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="386"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getPointerIcon() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="115"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat getSystemIcon(Context context, int style) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="129"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat getSystemIcon(Context context, int style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="129"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat create(Bitmap bitmap, float hotSpotX, float hotSpotY) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="150"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat create(Bitmap bitmap, float hotSpotX, float hotSpotY) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="150"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat load(Resources resources, int resourceId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="179"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat load(Resources resources, int resourceId) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="179"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setBreakStrategy(int strategy) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="143"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setHyphenationFrequency(int frequency) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="161"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTextDirection(@NonNull TextDirectionHeuristic textDir) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="179"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PrecomputedTextCompat create(@NonNull CharSequence text, @NonNull Params params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="428"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Future<PrecomputedTextCompat> getTextFuture("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="644"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSpan(Object what, int start, int end, int flags) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="670"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeSpan(Object what) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="686"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> T[] getSpans(int start, int end, Class<T> type) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="704"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> T[] getSpans(int start, int end, Class<T> type) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="704"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getSpanStart(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="714"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getSpanEnd(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="719"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getSpanFlags(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="724"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int nextSpanTransition(int start, int limit, Class type) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="729"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence subSequence(int start, int end) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="749"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat mIcon;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mTitle;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="53"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mContentDescription;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="59"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PendingIntent mActionIntent;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="65"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getResultKey() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="115"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getLabel() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="122"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence[] getChoices() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="129"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Set<String> getAllowedDataTypes() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="133"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Bundle getExtras() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="170"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Map<String, Uri> getDataResultsFromIntent("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="336"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent intent, String remoteInputResultKey) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="337"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent intent, String remoteInputResultKey) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="337"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Bundle getResultsFromIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="375"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Bundle getResultsFromIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="375"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="400"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="400"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Bundle results) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="401"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addDataResultToIntent(RemoteInput remoteInput, Intent intent,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="464"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addDataResultToIntent(RemoteInput remoteInput, Intent intent,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="464"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Map<String, Uri> results) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="465"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public final void callbackSuccessAsync(final Typeface typeface, @Nullable Handler handler) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="437"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="506"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="506"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ResultReceiver(Handler handler) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="83"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void send(int resultCode, Bundle resultData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="95"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onReceiveResult(int resultCode, Bundle resultData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="120"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void writeToParcel(Parcel out, int flags) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="129"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setColorFilter(ColorFilter cf) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="288"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorFilter getColorFilter() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="294"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onBoundsChange(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="344"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setQuickScaleEnabled(Object scaleGestureDetector, boolean enabled) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="39"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ScaleGestureDetector scaleGestureDetector, boolean enabled) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="52"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isQuickScaleEnabled(Object scaleGestureDetector) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="67"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isQuickScaleEnabled(ScaleGestureDetector scaleGestureDetector) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="77"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="40"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="40"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context, Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="48"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context, Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="48"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context, Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="48"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String threadName, int priority, int destructAfterMillisec) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="83"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> void postAndReply(final Callable<T> callable, final ReplyCallback<T> reply) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="140"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> void postAndReply(final Callable<T> callable, final ReplyCallback<T> reply) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="140"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> T postAndWait(final Callable<T> callable, int timeoutMillis)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="169"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSharedElementStart(List<String> sharedElementNames,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="77"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="78"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="78"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSharedElementEnd(List<String> sharedElementNames,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="108"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="109"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="109"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onRejectSharedElements(List<View> rejectedSharedElements) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="133"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="144"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="144"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="166"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="166"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="166"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" RectF screenBounds) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="167"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateSnapshotView(Context context, Parcelable snapshot) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="256"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateSnapshotView(Context context, Parcelable snapshot) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="256"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateSnapshotView(Context context, Parcelable snapshot) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="256"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSharedElementsArrived(List<String> sharedElementNames,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="299"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, OnSharedElementsReadyListener listener) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="300"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, OnSharedElementsReadyListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="300"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static EditorCompat getInstance() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/SharedPreferencesCompat.java"
+ line="65"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ShortcutInfo toShortcutInfo() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+ line="107"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat getIcon() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+ line="325"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setIcon(IconCompat icon) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+ line="662"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract T addShortcuts(List<ShortcutInfoCompat> shortcuts);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="38"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract T removeShortcuts(List<String> shortcutIds);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="41"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<ShortcutInfoCompat> getShortcuts() throws Exception {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void addShortcuts(List<ShortcutInfoCompat> shortcuts) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="59"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void addShortcuts(List<ShortcutInfoCompat> shortcuts) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="59"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void removeShortcuts(List<String> shortcutIds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="64"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void removeShortcuts(List<String> shortcutIds) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="64"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void removeAllShortcuts() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="69"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setShowAsActionFlags(int actionEnum);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="107"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setActionView(View view);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="122"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setActionView(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="122"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setActionView(int resId);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="137"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View getActionView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="147"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setSupportActionProvider(ActionProvider actionProvider);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="162"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setSupportActionProvider(ActionProvider actionProvider);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="162"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ActionProvider getSupportActionProvider();"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="171"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setContentDescription(CharSequence contentDescription);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="220"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setContentDescription(CharSequence contentDescription);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="220"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getContentDescription();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="228"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setTooltipText(CharSequence tooltipText);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="237"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setTooltipText(CharSequence tooltipText);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="237"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getTooltipText();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="245"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="271"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setNumericShortcut(char numericChar, int numericModifiers);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="288"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="322"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintList(ColorStateList tint);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="350"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintList(ColorStateList tint);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="350"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ColorStateList getIconTintList();"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="357"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintMode(PorterDuff.Mode tintMode);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="369"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintMode(PorterDuff.Mode tintMode);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="369"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" PorterDuff.Mode getIconTintMode();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="378"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TaskStackBuilder from(Context context) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="108"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TaskStackBuilder from(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="108"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TaskStackBuilder addParentStack(ComponentName sourceActivityName) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="200"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TaskStackBuilder addParentStack(ComponentName sourceActivityName) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="200"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Intent getIntent(int index) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="233"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Iterator<Intent> iterator() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="255"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean isRtl(char[] array, int start, int count);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/TextDirectionHeuristicCompat.java"
+ line="33"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean isRtl(CharSequence cs, int start, int count);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/TextDirectionHeuristicCompat.java"
+ line="45"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long duration, StringBuilder builder) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="153"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long duration, PrintWriter pw, int fieldLen) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="162"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long duration, PrintWriter pw) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="171"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long time, long now, PrintWriter pw) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="177"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setTintList(ColorStateList tint);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java"
+ line="36"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setTintMode(PorterDuff.Mode tintMode);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java"
+ line="37"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void tagSocket(Socket socket) throws SocketException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
+ line="113"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void untagSocket(Socket socket) throws SocketException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
+ line="123"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ComplexColorCompat getNamedComplexColor(@NonNull TypedArray a,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/TypedArrayUtils.java"
+ line="137"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" @NonNull Context context, @NonNull Resources resources, int id, String path,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompat.java"
+ line="172"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromFamiliesWithDefault(Object family) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="167"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontFamilyFilesResourceEntry(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="200"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry entry, Resources resources,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="201"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry entry, Resources resources,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="201"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontInfo(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="226"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="290"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="290"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="290"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Class<?> obtainFontFamily() throws ClassNotFoundException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="315"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Constructor<?> obtainFontFamilyCtor(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="319"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Constructor<?> obtainFontFamilyCtor(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="319"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromAssetManagerMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="324"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromAssetManagerMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="324"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromBufferMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="331"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromBufferMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="331"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainFreezeMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="338"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainFreezeMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="338"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAbortCreationMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="342"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAbortCreationMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="342"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="346"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="346"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromFamiliesWithDefault(Object family) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="47"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromFamiliesWithDefault(Object family) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="47"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="59"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="59"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected FontsContractCompat.FontInfo findBestInfo(FontsContractCompat.FontInfo[] fonts,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="46"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected FontsContractCompat.FontInfo findBestInfo(FontsContractCompat.FontInfo[] fonts,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="46"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromInputStream(Context context, InputStream is) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="53"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromInputStream(Context context, InputStream is) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="53"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromInputStream(Context context, InputStream is) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="53"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontInfo(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="59"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontFamilyFilesResourceEntry(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="105"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry familyEntry, Resources resources,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="106"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry familyEntry, Resources resources,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="106"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="151"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="151"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="151"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static File getTempFile(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="68"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="108"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="108"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="108"
+ column="91"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer copyToDirectBuffer(Context context, Resources res, int id) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="129"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer copyToDirectBuffer(Context context, Resources res, int id) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="129"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, InputStream is) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="147"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, InputStream is) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="147"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, Resources res, int id) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="170"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, Resources res, int id) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="170"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void closeQuietly(Closeable c) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="180"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getXVelocity(VelocityTracker tracker, int pointerId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/VelocityTrackerCompat.java"
+ line="36"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getYVelocity(VelocityTracker tracker, int pointerId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/VelocityTrackerCompat.java"
+ line="48"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean canScrollHorizontally(View view, int direction) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="543"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean canScrollVertically(View view, int direction) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="556"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getOverScrollMode(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="573"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setOverScrollMode(View v, @OverScroll int overScrollMode) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="593"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="633"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="633"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="665"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="665"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getAlpha(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1469"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setLayerType(View view, @LayerType int layerType, Paint paint) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1508"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setLayerType(View view, @LayerType int layerType, Paint paint) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1508"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getLayerType(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1532"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isOpaque(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1700"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMeasuredWidthAndState(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1737"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMeasuredHeightAndState(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1754"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMeasuredState(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1768"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getTranslationX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1960"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getTranslationY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1974"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Matrix getMatrix(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1996"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTranslationX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2102"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTranslationY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2119"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setAlpha(View view, @FloatRange(from = 0.0, to = 1.0) float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2136"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2151"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2166"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setRotation(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2179"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setRotationX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2193"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setRotationY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2207"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setScaleX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2220"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setScaleY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2233"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getPivotX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2244"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setPivotX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2260"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getPivotY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2273"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setPivotY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2289"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getRotation(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2297"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getRotationX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2305"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getRotationY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2313"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getScaleX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2321"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getScaleY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2329"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2337"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2345"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2469"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setFitsSystemWindows(View view, boolean fitSystemWindows) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2510"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void jumpDrawablesToCurrentState(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2524"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setSaveFromParentEnabled(View v, boolean enabled) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2930"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setActivated(View view, boolean activated) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2946"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getScaledPagingTouchSlop(ViewConfiguration config) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="56"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean hasPermanentMenuKey(ViewConfiguration config) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="67"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getScaledHoverSlop(ViewConfiguration config) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="127"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(ViewConfiguration config,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="139"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="73"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="73"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="74"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="97"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewParent parent, View child, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="65"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewParent parent, View child, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="65"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewParent parent, View child, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="65"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="83"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="83"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="83"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="100"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="100"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="100"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="113"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="113"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="130"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="130"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="158"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="158"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="176"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="176"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] consumed) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="177"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="205"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="205"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="205"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="246"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="246"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="246"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target, int type) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="281"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target, int type) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="281"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="325"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="325"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="382"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="382"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] consumed, int type) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="383"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="422"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="422"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedPreFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="459"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedPreFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="459"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void notifySubtreeAccessibilityStateChanged(ViewParent parent, View child,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="490"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void notifySubtreeAccessibilityStateChanged(ViewParent parent, View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="490"
+ column="82"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View source, int changeType) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="491"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setDuration(long value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="121"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat alpha(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="136"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat alphaBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="151"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationX(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="166"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationY(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="181"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="214"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="214"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="252"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="252"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Interpolator getInterpolator() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="265"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setStartDelay(long value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="284"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotation(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="316"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="331"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationX(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="346"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationXBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="361"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationY(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="376"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationYBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="391"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleX(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="406"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleXBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="421"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleY(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="436"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleYBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="451"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat x(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="476"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat xBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="491"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat y(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="506"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat yBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="521"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationXBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="536"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationYBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="551"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationZBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="568"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationZ(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="587"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat z(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="606"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat zBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="625"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withLayer() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="678"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="706"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="706"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setListener(final ViewPropertyAnimatorListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="727"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setListener(final ViewPropertyAnimatorListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="727"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setUpdateListener("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="773"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final ViewPropertyAnimatorUpdateListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="774"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationStart(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListener.java"
+ line="32"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationEnd(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListener.java"
+ line="40"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationCancel(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListener.java"
+ line="48"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationStart(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListenerAdapter.java"
+ line="33"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationEnd(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListenerAdapter.java"
+ line="40"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationCancel(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListenerAdapter.java"
+ line="47"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationUpdate(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorUpdateListener.java"
+ line="34"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Drawable getWrappedDrawable();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java"
+ line="33"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setWrappedDrawable(Drawable drawable);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java"
+ line="34"
+ column="29"/>
+ </issue>
+
+</issues>
diff --git a/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt b/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt
index 36fd6b5..b5fe896 100644
--- a/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt
+++ b/activity/activity-compose/src/main/java/androidx/activity/compose/ActivityResultRegistry.kt
@@ -16,6 +16,7 @@
package androidx.activity.compose
+import androidx.activity.result.ActivityResultCaller
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.ActivityResultRegistryOwner
import androidx.activity.result.contract.ActivityResultContract
@@ -112,8 +113,8 @@
}
/**
- * A launcher for a previously-{@link ActivityResultCaller#registerForActivityResult prepared call}
- * to start the process of executing an {@link ActivityResultContract}.
+ * A launcher for a previously-[prepared call][ActivityResultCaller.registerForActivityResult]
+ * to start the process of executing an [ActivityResultContract].
*
* This launcher does not support the [unregister] function. Attempting to use [unregister] will
* result in an [IllegalStateException].
diff --git a/activity/activity-ktx/api/1.4.0-beta02.txt b/activity/activity-ktx/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..f844b35
--- /dev/null
+++ b/activity/activity-ktx/api/1.4.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.activity {
+
+ public final class ActivityViewModelLazyKt {
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+ }
+
+ public final class OnBackPressedDispatcherKt {
+ method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
+ }
+
+ public final class PipHintTrackerKt {
+ }
+
+}
+
+package androidx.activity.contextaware {
+
+ public final class ContextAwareKt {
+ method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+}
+
+package androidx.activity.result {
+
+ public final class ActivityResultCallerKt {
+ method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+ method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+ }
+
+ public final class ActivityResultKt {
+ method public static operator int component1(androidx.activity.result.ActivityResult);
+ method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+ }
+
+ public final class ActivityResultLauncherKt {
+ method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+ method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+ }
+
+}
+
diff --git a/activity/activity-ktx/api/public_plus_experimental_1.4.0-beta02.txt b/activity/activity-ktx/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..5dff406
--- /dev/null
+++ b/activity/activity-ktx/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,44 @@
+// Signature format: 4.0
+package androidx.activity {
+
+ public final class ActivityViewModelLazyKt {
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+ }
+
+ public final class OnBackPressedDispatcherKt {
+ method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
+ }
+
+ public final class PipHintTrackerKt {
+ method @RequiresApi(android.os.Build.VERSION_CODES.O) @kotlinx.coroutines.ExperimentalCoroutinesApi public static suspend Object? trackPipAnimationHintView(android.app.Activity, android.view.View view, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ }
+
+}
+
+package androidx.activity.contextaware {
+
+ public final class ContextAwareKt {
+ method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+}
+
+package androidx.activity.result {
+
+ public final class ActivityResultCallerKt {
+ method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+ method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+ }
+
+ public final class ActivityResultKt {
+ method public static operator int component1(androidx.activity.result.ActivityResult);
+ method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+ }
+
+ public final class ActivityResultLauncherKt {
+ method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+ method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/activity/activity-ktx/api/res-1.4.0-beta02.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to activity/activity-ktx/api/res-1.4.0-beta02.txt
diff --git a/activity/activity-ktx/api/restricted_1.4.0-beta02.txt b/activity/activity-ktx/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..f844b35
--- /dev/null
+++ b/activity/activity-ktx/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,43 @@
+// Signature format: 4.0
+package androidx.activity {
+
+ public final class ActivityViewModelLazyKt {
+ method @MainThread public static inline <reified VM extends androidx.lifecycle.ViewModel> kotlin.Lazy<? extends VM>! viewModels(androidx.activity.ComponentActivity, optional kotlin.jvm.functions.Function0<? extends androidx.lifecycle.ViewModelProvider.Factory>? factoryProducer);
+ }
+
+ public final class OnBackPressedDispatcherKt {
+ method public static androidx.activity.OnBackPressedCallback addCallback(androidx.activity.OnBackPressedDispatcher, optional androidx.lifecycle.LifecycleOwner? owner, optional boolean enabled, kotlin.jvm.functions.Function1<? super androidx.activity.OnBackPressedCallback,kotlin.Unit> onBackPressed);
+ }
+
+ public final class PipHintTrackerKt {
+ }
+
+}
+
+package androidx.activity.contextaware {
+
+ public final class ContextAwareKt {
+ method public static suspend inline <R> Object? withContextAvailable(androidx.activity.contextaware.ContextAware, kotlin.jvm.functions.Function1<? super android.content.Context,? extends R> onContextAvailable, kotlin.coroutines.Continuation<? super R> p);
+ }
+
+}
+
+package androidx.activity.result {
+
+ public final class ActivityResultCallerKt {
+ method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, androidx.activity.result.ActivityResultRegistry registry, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+ method public static <I, O> androidx.activity.result.ActivityResultLauncher<kotlin.Unit> registerForActivityResult(androidx.activity.result.ActivityResultCaller, androidx.activity.result.contract.ActivityResultContract<I,O> contract, I? input, kotlin.jvm.functions.Function1<? super O,kotlin.Unit> callback);
+ }
+
+ public final class ActivityResultKt {
+ method public static operator int component1(androidx.activity.result.ActivityResult);
+ method public static operator android.content.Intent? component2(androidx.activity.result.ActivityResult);
+ }
+
+ public final class ActivityResultLauncherKt {
+ method public static void launch(androidx.activity.result.ActivityResultLauncher<java.lang.Void>, optional androidx.core.app.ActivityOptionsCompat? options);
+ method public static void launchUnit(androidx.activity.result.ActivityResultLauncher<kotlin.Unit>, optional androidx.core.app.ActivityOptionsCompat? options);
+ }
+
+}
+
diff --git a/activity/activity-ktx/build.gradle b/activity/activity-ktx/build.gradle
index a422909..e8c10bf 100644
--- a/activity/activity-ktx/build.gradle
+++ b/activity/activity-ktx/build.gradle
@@ -16,6 +16,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -56,3 +57,15 @@
inceptionYear = "2018"
description = "Kotlin extensions for 'activity' artifact"
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/activity/activity/api/1.4.0-beta01.txt b/activity/activity/api/1.4.0-beta01.txt
index dd842d8..029b088 100644
--- a/activity/activity/api/1.4.0-beta01.txt
+++ b/activity/activity/api/1.4.0-beta01.txt
@@ -220,10 +220,14 @@
method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
}
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
ctor public ActivityResultContracts.RequestPermission();
method public android.content.Intent createIntent(android.content.Context context, String input);
@@ -235,18 +239,26 @@
ctor public ActivityResultContracts.StartActivityForResult();
method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
}
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
ctor public ActivityResultContracts.StartIntentSenderForResult();
method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
diff --git a/activity/activity/api/1.4.0-beta02.txt b/activity/activity/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..029b088
--- /dev/null
+++ b/activity/activity/api/1.4.0-beta02.txt
@@ -0,0 +1,284 @@
+// Signature format: 4.0
+package androidx.activity {
+
+ public class ComponentActivity extends android.app.Activity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+ ctor public ComponentActivity();
+ ctor @ContentView public ComponentActivity(@LayoutRes int);
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+ 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();
+ method public void invalidateMenu();
+ method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+ method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+ method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+ method public final Object? onRetainNonConfigurationInstance();
+ method public android.content.Context? peekAvailableContext();
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method @Deprecated public void startActivityForResult(android.content.Intent!, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ }
+
+ 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();
+ }
+
+}
+
+package androidx.activity.contextaware {
+
+ public interface ContextAware {
+ method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public android.content.Context? peekAvailableContext();
+ method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ }
+
+ public final class ContextAwareHelper {
+ ctor public ContextAwareHelper();
+ method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public void clearAvailableContext();
+ method public void dispatchOnContextAvailable(android.content.Context);
+ method public android.content.Context? peekAvailableContext();
+ method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ }
+
+ public interface OnContextAvailableListener {
+ method public void onContextAvailable(android.content.Context);
+ }
+
+}
+
+package androidx.activity.result {
+
+ public final class ActivityResult implements android.os.Parcelable {
+ ctor public ActivityResult(int, android.content.Intent?);
+ method public int describeContents();
+ method public android.content.Intent? getData();
+ method public int getResultCode();
+ method public static String resultCodeToString(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+ }
+
+ public interface ActivityResultCallback<O> {
+ method public void onActivityResult(O!);
+ }
+
+ public interface ActivityResultCaller {
+ method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+ }
+
+ public abstract class ActivityResultLauncher<I> {
+ ctor public ActivityResultLauncher();
+ method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+ method public void launch(I!);
+ method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+ method @MainThread public abstract void unregister();
+ }
+
+ public abstract class ActivityResultRegistry {
+ ctor public ActivityResultRegistry();
+ method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+ method @MainThread public final <O> boolean dispatchResult(int, O!);
+ method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+ method public final void onRestoreInstanceState(android.os.Bundle?);
+ method public final void onSaveInstanceState(android.os.Bundle);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ }
+
+ public interface ActivityResultRegistryOwner {
+ method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+ }
+
+ public final class IntentSenderRequest implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.content.Intent? getFillInIntent();
+ method public int getFlagsMask();
+ method public int getFlagsValues();
+ method public android.content.IntentSender getIntentSender();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> CREATOR;
+ }
+
+ public static final class IntentSenderRequest.Builder {
+ ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+ ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+ method public androidx.activity.result.IntentSenderRequest build();
+ method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+ method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int, int);
+ }
+
+}
+
+package androidx.activity.result.contract {
+
+ public abstract class ActivityResultContract<I, O> {
+ ctor public ActivityResultContract();
+ method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+ method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContract.SynchronousResult<T> {
+ ctor public ActivityResultContract.SynchronousResult(T? value);
+ method public T! getValue();
+ property public final T! value;
+ }
+
+ public final class ActivityResultContracts {
+ }
+
+ public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+ ctor public ActivityResultContracts.CaptureVideo();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+ ctor public ActivityResultContracts.CreateDocument();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+ ctor public ActivityResultContracts.GetContent();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(18) public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
+ ctor public ActivityResultContracts.GetMultipleContents();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+ method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
+ ctor public ActivityResultContracts.OpenDocument();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
+ ctor public ActivityResultContracts.OpenDocumentTree();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri? input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
+ ctor public ActivityResultContracts.OpenMultipleDocuments();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+ method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+ ctor public ActivityResultContracts.PickContact();
+ method public android.content.Intent createIntent(android.content.Context context, Void? input);
+ method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+ ctor public ActivityResultContracts.RequestMultiplePermissions();
+ method public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+ method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+ field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+ field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+ field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+ }
+
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
+ public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+ ctor public ActivityResultContracts.RequestPermission();
+ method public android.content.Intent createIntent(android.content.Context context, String input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+ method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+ ctor public ActivityResultContracts.StartActivityForResult();
+ method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+ method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+ field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+ }
+
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
+ public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+ ctor public ActivityResultContracts.StartIntentSenderForResult();
+ method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+ method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+ field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+ field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+ }
+
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+ ctor public ActivityResultContracts.TakePicture();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+ ctor public ActivityResultContracts.TakePicturePreview();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+ method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ ctor @Deprecated public ActivityResultContracts.TakeVideo();
+ method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+}
+
diff --git a/activity/activity/api/current.txt b/activity/activity/api/current.txt
index dd842d8..029b088 100644
--- a/activity/activity/api/current.txt
+++ b/activity/activity/api/current.txt
@@ -220,10 +220,14 @@
method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
}
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
ctor public ActivityResultContracts.RequestPermission();
method public android.content.Intent createIntent(android.content.Context context, String input);
@@ -235,18 +239,26 @@
ctor public ActivityResultContracts.StartActivityForResult();
method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
}
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
ctor public ActivityResultContracts.StartIntentSenderForResult();
method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
diff --git a/activity/activity/api/public_plus_experimental_1.4.0-beta01.txt b/activity/activity/api/public_plus_experimental_1.4.0-beta01.txt
index dd842d8..029b088 100644
--- a/activity/activity/api/public_plus_experimental_1.4.0-beta01.txt
+++ b/activity/activity/api/public_plus_experimental_1.4.0-beta01.txt
@@ -220,10 +220,14 @@
method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
}
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
ctor public ActivityResultContracts.RequestPermission();
method public android.content.Intent createIntent(android.content.Context context, String input);
@@ -235,18 +239,26 @@
ctor public ActivityResultContracts.StartActivityForResult();
method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
}
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
ctor public ActivityResultContracts.StartIntentSenderForResult();
method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
diff --git a/activity/activity/api/public_plus_experimental_1.4.0-beta02.txt b/activity/activity/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..029b088
--- /dev/null
+++ b/activity/activity/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,284 @@
+// Signature format: 4.0
+package androidx.activity {
+
+ public class ComponentActivity extends android.app.Activity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+ ctor public ComponentActivity();
+ ctor @ContentView public ComponentActivity(@LayoutRes int);
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+ 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();
+ method public void invalidateMenu();
+ method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+ method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+ method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+ method public final Object? onRetainNonConfigurationInstance();
+ method public android.content.Context? peekAvailableContext();
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method @Deprecated public void startActivityForResult(android.content.Intent!, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ }
+
+ 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();
+ }
+
+}
+
+package androidx.activity.contextaware {
+
+ public interface ContextAware {
+ method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public android.content.Context? peekAvailableContext();
+ method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ }
+
+ public final class ContextAwareHelper {
+ ctor public ContextAwareHelper();
+ method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public void clearAvailableContext();
+ method public void dispatchOnContextAvailable(android.content.Context);
+ method public android.content.Context? peekAvailableContext();
+ method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ }
+
+ public interface OnContextAvailableListener {
+ method public void onContextAvailable(android.content.Context);
+ }
+
+}
+
+package androidx.activity.result {
+
+ public final class ActivityResult implements android.os.Parcelable {
+ ctor public ActivityResult(int, android.content.Intent?);
+ method public int describeContents();
+ method public android.content.Intent? getData();
+ method public int getResultCode();
+ method public static String resultCodeToString(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+ }
+
+ public interface ActivityResultCallback<O> {
+ method public void onActivityResult(O!);
+ }
+
+ public interface ActivityResultCaller {
+ method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+ }
+
+ public abstract class ActivityResultLauncher<I> {
+ ctor public ActivityResultLauncher();
+ method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+ method public void launch(I!);
+ method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+ method @MainThread public abstract void unregister();
+ }
+
+ public abstract class ActivityResultRegistry {
+ ctor public ActivityResultRegistry();
+ method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+ method @MainThread public final <O> boolean dispatchResult(int, O!);
+ method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+ method public final void onRestoreInstanceState(android.os.Bundle?);
+ method public final void onSaveInstanceState(android.os.Bundle);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ }
+
+ public interface ActivityResultRegistryOwner {
+ method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+ }
+
+ public final class IntentSenderRequest implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.content.Intent? getFillInIntent();
+ method public int getFlagsMask();
+ method public int getFlagsValues();
+ method public android.content.IntentSender getIntentSender();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> CREATOR;
+ }
+
+ public static final class IntentSenderRequest.Builder {
+ ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+ ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+ method public androidx.activity.result.IntentSenderRequest build();
+ method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+ method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int, int);
+ }
+
+}
+
+package androidx.activity.result.contract {
+
+ public abstract class ActivityResultContract<I, O> {
+ ctor public ActivityResultContract();
+ method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+ method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContract.SynchronousResult<T> {
+ ctor public ActivityResultContract.SynchronousResult(T? value);
+ method public T! getValue();
+ property public final T! value;
+ }
+
+ public final class ActivityResultContracts {
+ }
+
+ public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+ ctor public ActivityResultContracts.CaptureVideo();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+ ctor public ActivityResultContracts.CreateDocument();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+ ctor public ActivityResultContracts.GetContent();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(18) public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
+ ctor public ActivityResultContracts.GetMultipleContents();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+ method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
+ ctor public ActivityResultContracts.OpenDocument();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
+ ctor public ActivityResultContracts.OpenDocumentTree();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri? input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
+ ctor public ActivityResultContracts.OpenMultipleDocuments();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+ method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+ ctor public ActivityResultContracts.PickContact();
+ method public android.content.Intent createIntent(android.content.Context context, Void? input);
+ method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+ ctor public ActivityResultContracts.RequestMultiplePermissions();
+ method public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+ method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+ field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+ field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+ field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+ }
+
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
+ public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+ ctor public ActivityResultContracts.RequestPermission();
+ method public android.content.Intent createIntent(android.content.Context context, String input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+ method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+ ctor public ActivityResultContracts.StartActivityForResult();
+ method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+ method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+ field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+ }
+
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
+ public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+ ctor public ActivityResultContracts.StartIntentSenderForResult();
+ method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+ method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+ field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+ field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+ }
+
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+ ctor public ActivityResultContracts.TakePicture();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+ ctor public ActivityResultContracts.TakePicturePreview();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+ method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ ctor @Deprecated public ActivityResultContracts.TakeVideo();
+ method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+}
+
diff --git a/activity/activity/api/public_plus_experimental_current.txt b/activity/activity/api/public_plus_experimental_current.txt
index dd842d8..029b088 100644
--- a/activity/activity/api/public_plus_experimental_current.txt
+++ b/activity/activity/api/public_plus_experimental_current.txt
@@ -220,10 +220,14 @@
method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
}
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
ctor public ActivityResultContracts.RequestPermission();
method public android.content.Intent createIntent(android.content.Context context, String input);
@@ -235,18 +239,26 @@
ctor public ActivityResultContracts.StartActivityForResult();
method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
}
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
ctor public ActivityResultContracts.StartIntentSenderForResult();
method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/activity/activity/api/res-1.4.0-beta02.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to activity/activity/api/res-1.4.0-beta02.txt
diff --git a/activity/activity/api/restricted_1.4.0-beta01.txt b/activity/activity/api/restricted_1.4.0-beta01.txt
index 0ce24f9..d059fcc 100644
--- a/activity/activity/api/restricted_1.4.0-beta01.txt
+++ b/activity/activity/api/restricted_1.4.0-beta01.txt
@@ -219,10 +219,14 @@
method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
}
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
ctor public ActivityResultContracts.RequestPermission();
method public android.content.Intent createIntent(android.content.Context context, String input);
@@ -234,18 +238,26 @@
ctor public ActivityResultContracts.StartActivityForResult();
method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
}
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
ctor public ActivityResultContracts.StartIntentSenderForResult();
method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
diff --git a/activity/activity/api/restricted_1.4.0-beta02.txt b/activity/activity/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..d059fcc
--- /dev/null
+++ b/activity/activity/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,283 @@
+// Signature format: 4.0
+package androidx.activity {
+
+ public class ComponentActivity extends androidx.core.app.ComponentActivity implements androidx.activity.result.ActivityResultCaller androidx.activity.result.ActivityResultRegistryOwner androidx.activity.contextaware.ContextAware androidx.lifecycle.HasDefaultViewModelProviderFactory androidx.lifecycle.LifecycleOwner androidx.core.view.MenuHost androidx.activity.OnBackPressedDispatcherOwner androidx.savedstate.SavedStateRegistryOwner androidx.lifecycle.ViewModelStoreOwner {
+ ctor public ComponentActivity();
+ ctor @ContentView public ComponentActivity(@LayoutRes int);
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public final void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public final androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+ method public androidx.lifecycle.ViewModelProvider.Factory getDefaultViewModelProviderFactory();
+ 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 public void invalidateMenu();
+ method @Deprecated @CallSuper protected void onActivityResult(int, int, android.content.Intent?);
+ method @Deprecated @CallSuper public void onRequestPermissionsResult(int, String![], int[]);
+ method @Deprecated public Object? onRetainCustomNonConfigurationInstance();
+ method public final Object? onRetainNonConfigurationInstance();
+ method public android.content.Context? peekAvailableContext();
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public final void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method @Deprecated public void startActivityForResult(android.content.Intent!, int);
+ method @Deprecated public void startActivityForResult(android.content.Intent!, int, android.os.Bundle?);
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int) throws android.content.IntentSender.SendIntentException;
+ method @Deprecated public void startIntentSenderForResult(android.content.IntentSender!, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ }
+
+ 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();
+ }
+
+}
+
+package androidx.activity.contextaware {
+
+ public interface ContextAware {
+ method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public android.content.Context? peekAvailableContext();
+ method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ }
+
+ public final class ContextAwareHelper {
+ ctor public ContextAwareHelper();
+ method public void addOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ method public void clearAvailableContext();
+ method public void dispatchOnContextAvailable(android.content.Context);
+ method public android.content.Context? peekAvailableContext();
+ method public void removeOnContextAvailableListener(androidx.activity.contextaware.OnContextAvailableListener);
+ }
+
+ public interface OnContextAvailableListener {
+ method public void onContextAvailable(android.content.Context);
+ }
+
+}
+
+package androidx.activity.result {
+
+ public final class ActivityResult implements android.os.Parcelable {
+ ctor public ActivityResult(int, android.content.Intent?);
+ method public int describeContents();
+ method public android.content.Intent? getData();
+ method public int getResultCode();
+ method public static String resultCodeToString(int);
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<androidx.activity.result.ActivityResult!> CREATOR;
+ }
+
+ public interface ActivityResultCallback<O> {
+ method public void onActivityResult(O!);
+ }
+
+ public interface ActivityResultCaller {
+ method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public <I, O> androidx.activity.result.ActivityResultLauncher<I!> registerForActivityResult(androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultRegistry, androidx.activity.result.ActivityResultCallback<O!>);
+ }
+
+ public abstract class ActivityResultLauncher<I> {
+ ctor public ActivityResultLauncher();
+ method public abstract androidx.activity.result.contract.ActivityResultContract<I!,?> getContract();
+ method public void launch(I!);
+ method public abstract void launch(I!, androidx.core.app.ActivityOptionsCompat?);
+ method @MainThread public abstract void unregister();
+ }
+
+ public abstract class ActivityResultRegistry {
+ ctor public ActivityResultRegistry();
+ method @MainThread public final boolean dispatchResult(int, int, android.content.Intent?);
+ method @MainThread public final <O> boolean dispatchResult(int, O!);
+ method @MainThread public abstract <I, O> void onLaunch(int, androidx.activity.result.contract.ActivityResultContract<I!,O!>, I!, androidx.core.app.ActivityOptionsCompat?);
+ method public final void onRestoreInstanceState(android.os.Bundle?);
+ method public final void onSaveInstanceState(android.os.Bundle);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.lifecycle.LifecycleOwner, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ method public final <I, O> androidx.activity.result.ActivityResultLauncher<I!> register(String, androidx.activity.result.contract.ActivityResultContract<I!,O!>, androidx.activity.result.ActivityResultCallback<O!>);
+ }
+
+ public interface ActivityResultRegistryOwner {
+ method public androidx.activity.result.ActivityResultRegistry getActivityResultRegistry();
+ }
+
+ public final class IntentSenderRequest implements android.os.Parcelable {
+ method public int describeContents();
+ method public android.content.Intent? getFillInIntent();
+ method public int getFlagsMask();
+ method public int getFlagsValues();
+ method public android.content.IntentSender getIntentSender();
+ method public void writeToParcel(android.os.Parcel, int);
+ field public static final android.os.Parcelable.Creator<androidx.activity.result.IntentSenderRequest!> CREATOR;
+ }
+
+ public static final class IntentSenderRequest.Builder {
+ ctor public IntentSenderRequest.Builder(android.content.IntentSender);
+ ctor public IntentSenderRequest.Builder(android.app.PendingIntent);
+ method public androidx.activity.result.IntentSenderRequest build();
+ method public androidx.activity.result.IntentSenderRequest.Builder setFillInIntent(android.content.Intent?);
+ method public androidx.activity.result.IntentSenderRequest.Builder setFlags(int, int);
+ }
+
+}
+
+package androidx.activity.result.contract {
+
+ public abstract class ActivityResultContract<I, O> {
+ ctor public ActivityResultContract();
+ method public abstract android.content.Intent createIntent(android.content.Context context, I? input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<O>? getSynchronousResult(android.content.Context context, I? input);
+ method public abstract O! parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContract.SynchronousResult<T> {
+ ctor public ActivityResultContract.SynchronousResult(T? value);
+ method public T! getValue();
+ property public final T! value;
+ }
+
+ public final class ActivityResultContracts {
+ }
+
+ public static class ActivityResultContracts.CaptureVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+ ctor public ActivityResultContracts.CaptureVideo();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.CreateDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+ ctor public ActivityResultContracts.CreateDocument();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static class ActivityResultContracts.GetContent extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,android.net.Uri> {
+ ctor public ActivityResultContracts.GetContent();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(18) public static class ActivityResultContracts.GetMultipleContents extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.util.List<android.net.Uri>> {
+ ctor public ActivityResultContracts.GetMultipleContents();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String input);
+ method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.OpenDocument extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],android.net.Uri> {
+ ctor public ActivityResultContracts.OpenDocument();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, String![] input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(21) public static class ActivityResultContracts.OpenDocumentTree extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.net.Uri> {
+ ctor public ActivityResultContracts.OpenDocumentTree();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri? input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.net.Uri>? getSynchronousResult(android.content.Context context, android.net.Uri? input);
+ method public final android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @RequiresApi(19) public static class ActivityResultContracts.OpenMultipleDocuments extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.List<android.net.Uri>> {
+ ctor public ActivityResultContracts.OpenMultipleDocuments();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.List<android.net.Uri>>? getSynchronousResult(android.content.Context context, String![] input);
+ method public final java.util.List<android.net.Uri> parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.PickContact extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.net.Uri> {
+ ctor public ActivityResultContracts.PickContact();
+ method public android.content.Intent createIntent(android.content.Context context, Void? input);
+ method public android.net.Uri? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.RequestMultiplePermissions extends androidx.activity.result.contract.ActivityResultContract<java.lang.String[],java.util.Map<java.lang.String,java.lang.Boolean>> {
+ ctor public ActivityResultContracts.RequestMultiplePermissions();
+ method public android.content.Intent createIntent(android.content.Context context, String![] input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
+ method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
+ field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
+ field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
+ field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
+ }
+
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
+ public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
+ ctor public ActivityResultContracts.RequestPermission();
+ method public android.content.Intent createIntent(android.content.Context context, String input);
+ method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, String input);
+ method public Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static final class ActivityResultContracts.StartActivityForResult extends androidx.activity.result.contract.ActivityResultContract<android.content.Intent,androidx.activity.result.ActivityResult> {
+ ctor public ActivityResultContracts.StartActivityForResult();
+ method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
+ method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
+ field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
+ }
+
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
+ public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
+ ctor public ActivityResultContracts.StartIntentSenderForResult();
+ method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
+ method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
+ field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
+ field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
+ }
+
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
+ public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
+ ctor public ActivityResultContracts.TakePicture();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.lang.Boolean>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method public final Boolean parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ public static class ActivityResultContracts.TakePicturePreview extends androidx.activity.result.contract.ActivityResultContract<java.lang.Void,android.graphics.Bitmap> {
+ ctor public ActivityResultContracts.TakePicturePreview();
+ method @CallSuper public android.content.Intent createIntent(android.content.Context context, Void? input);
+ method public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, Void? input);
+ method public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+ @Deprecated public static class ActivityResultContracts.TakeVideo extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,android.graphics.Bitmap> {
+ ctor @Deprecated public ActivityResultContracts.TakeVideo();
+ method @Deprecated @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
+ method @Deprecated public final androidx.activity.result.contract.ActivityResultContract.SynchronousResult<android.graphics.Bitmap>? getSynchronousResult(android.content.Context context, android.net.Uri input);
+ method @Deprecated public final android.graphics.Bitmap? parseResult(int resultCode, android.content.Intent? intent);
+ }
+
+}
+
diff --git a/activity/activity/api/restricted_current.txt b/activity/activity/api/restricted_current.txt
index 0ce24f9..d059fcc 100644
--- a/activity/activity/api/restricted_current.txt
+++ b/activity/activity/api/restricted_current.txt
@@ -219,10 +219,14 @@
method public androidx.activity.result.contract.ActivityResultContract.SynchronousResult<java.util.Map<java.lang.String,java.lang.Boolean>>? getSynchronousResult(android.content.Context context, String![] input);
method public java.util.Map<java.lang.String,java.lang.Boolean> parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_REQUEST_PERMISSIONS = "androidx.activity.result.contract.action.REQUEST_PERMISSIONS";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.RequestMultiplePermissions.Companion Companion;
field public static final String EXTRA_PERMISSIONS = "androidx.activity.result.contract.extra.PERMISSIONS";
field public static final String EXTRA_PERMISSION_GRANT_RESULTS = "androidx.activity.result.contract.extra.PERMISSION_GRANT_RESULTS";
}
+ public static final class ActivityResultContracts.RequestMultiplePermissions.Companion {
+ }
+
public static final class ActivityResultContracts.RequestPermission extends androidx.activity.result.contract.ActivityResultContract<java.lang.String,java.lang.Boolean> {
ctor public ActivityResultContracts.RequestPermission();
method public android.content.Intent createIntent(android.content.Context context, String input);
@@ -234,18 +238,26 @@
ctor public ActivityResultContracts.StartActivityForResult();
method public android.content.Intent createIntent(android.content.Context context, android.content.Intent input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult.Companion Companion;
field public static final String EXTRA_ACTIVITY_OPTIONS_BUNDLE = "androidx.activity.result.contract.extra.ACTIVITY_OPTIONS_BUNDLE";
}
+ public static final class ActivityResultContracts.StartActivityForResult.Companion {
+ }
+
public static final class ActivityResultContracts.StartIntentSenderForResult extends androidx.activity.result.contract.ActivityResultContract<androidx.activity.result.IntentSenderRequest,androidx.activity.result.ActivityResult> {
ctor public ActivityResultContracts.StartIntentSenderForResult();
method public android.content.Intent createIntent(android.content.Context context, androidx.activity.result.IntentSenderRequest input);
method public androidx.activity.result.ActivityResult parseResult(int resultCode, android.content.Intent? intent);
field public static final String ACTION_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.action.INTENT_SENDER_REQUEST";
+ field public static final androidx.activity.result.contract.ActivityResultContracts.StartIntentSenderForResult.Companion Companion;
field public static final String EXTRA_INTENT_SENDER_REQUEST = "androidx.activity.result.contract.extra.INTENT_SENDER_REQUEST";
field public static final String EXTRA_SEND_INTENT_EXCEPTION = "androidx.activity.result.contract.extra.SEND_INTENT_EXCEPTION";
}
+ public static final class ActivityResultContracts.StartIntentSenderForResult.Companion {
+ }
+
public static class ActivityResultContracts.TakePicture extends androidx.activity.result.contract.ActivityResultContract<android.net.Uri,java.lang.Boolean> {
ctor public ActivityResultContracts.TakePicture();
method @CallSuper public android.content.Intent createIntent(android.content.Context context, android.net.Uri input);
diff --git a/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityResultTest.kt b/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityResultTest.kt
index 22675c7..3e7fefd 100644
--- a/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityResultTest.kt
+++ b/activity/activity/src/androidTest/java/androidx/activity/ComponentActivityResultTest.kt
@@ -17,6 +17,7 @@
package androidx.activity
import android.app.Activity
+import android.content.ActivityNotFoundException
import android.content.Intent
import android.os.Bundle
import androidx.activity.result.ActivityResult
@@ -87,6 +88,25 @@
}
}
}
+
+ @Test
+ fun noActivityAvailableTest() {
+ ActivityScenario.launch(RegisterInInitActivity::class.java).use { scenario ->
+ var exceptionThrown = false
+ scenario.withActivity {
+ try {
+ launcher.launch(Intent("no action"))
+ } catch (e: ActivityNotFoundException) {
+ exceptionThrown = true
+ }
+ }
+
+ scenario.withActivity {
+ assertThat(exceptionThrown).isTrue()
+ assertThat(launchCount).isEqualTo(0)
+ }
+ }
+ }
}
class PassThroughActivity : ComponentActivity() {
diff --git a/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java b/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java
index f91f4cc..ad8196b 100644
--- a/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java
+++ b/activity/activity/src/main/java/androidx/activity/result/ActivityResultRegistry.java
@@ -170,7 +170,12 @@
+ "before calling launch().");
}
mLaunchedKeys.add(key);
- onLaunch(innerCode, contract, input, options);
+ try {
+ onLaunch(innerCode, contract, input, options);
+ } catch (Exception e) {
+ mLaunchedKeys.remove(key);
+ throw e;
+ }
}
@Override
@@ -358,8 +363,6 @@
if (key == null) {
return false;
}
- mLaunchedKeys.remove(key);
-
doDispatch(key, resultCode, data, mKeyToCallback.get(key));
return true;
}
@@ -379,7 +382,6 @@
if (key == null) {
return false;
}
- mLaunchedKeys.remove(key);
CallbackAndContract<?> callbackAndContract = mKeyToCallback.get(key);
if (callbackAndContract == null || callbackAndContract.mCallback == null) {
@@ -391,17 +393,21 @@
@SuppressWarnings("unchecked")
ActivityResultCallback<O> callback =
(ActivityResultCallback<O>) callbackAndContract.mCallback;
- callback.onActivityResult(result);
+ if (mLaunchedKeys.remove(key)) {
+ callback.onActivityResult(result);
+ }
}
return true;
}
private <O> void doDispatch(String key, int resultCode, @Nullable Intent data,
@Nullable CallbackAndContract<O> callbackAndContract) {
- if (callbackAndContract != null && callbackAndContract.mCallback != null) {
+ if (callbackAndContract != null && callbackAndContract.mCallback != null
+ && mLaunchedKeys.contains(key)) {
ActivityResultCallback<O> callback = callbackAndContract.mCallback;
ActivityResultContract<?, O> contract = callbackAndContract.mContract;
callback.onActivityResult(contract.parseResult(resultCode, data));
+ mLaunchedKeys.remove(key);
} else {
// Remove any parsed pending result
mParsedPendingResults.remove(key);
diff --git a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt
index 22053db..4e92e68 100644
--- a/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt
+++ b/activity/activity/src/main/java/androidx/activity/result/contract/ActivityResultContracts.kt
@@ -48,7 +48,7 @@
*/
class StartActivityForResult : ActivityResultContract<Intent, ActivityResult>() {
- internal companion object {
+ companion object {
/**
* Key for the extra containing a [android.os.Bundle] generated from
* [androidx.core.app.ActivityOptionsCompat.toBundle] or
@@ -86,7 +86,7 @@
class StartIntentSenderForResult :
ActivityResultContract<IntentSenderRequest, ActivityResult>() {
- internal companion object {
+ companion object {
/**
* An [Intent] action for making a request via the
* [Activity.startIntentSenderForResult] API.
@@ -127,7 +127,7 @@
class RequestMultiplePermissions :
ActivityResultContract<Array<String>, Map<String, @JvmSuppressWildcards Boolean>>() {
- internal companion object {
+ companion object {
/**
* An [Intent] action for making a permission request via a regular
* [Activity.startActivityForResult] API.
diff --git a/annotation/annotation/api/1.3.0-beta02.txt b/annotation/annotation/api/1.3.0-beta02.txt
new file mode 100644
index 0000000..263ed26
--- /dev/null
+++ b/annotation/annotation/api/1.3.0-beta02.txt
@@ -0,0 +1,272 @@
+// Signature format: 4.0
+package androidx.annotation {
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimatorRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnyRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface AnyThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ArrayRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AttrRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface BinderThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface BoolRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CallSuper {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CheckResult {
+ method public abstract String suggest() default "";
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorLong {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ColorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface ContentView {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Dimension {
+ method @DimensionUnit public abstract int unit() default androidx.annotation.Dimension.PX;
+ field public static final int DP = 0; // 0x0
+ field public static final int PX = 1; // 0x1
+ field public static final int SP = 2; // 0x2
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE}) public @interface Discouraged {
+ method public abstract String message();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface DisplayContext {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface DoNotInline {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
+ method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+ method public abstract boolean fromInclusive() default true;
+ method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+ method public abstract boolean toInclusive() default true;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FontRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FractionRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface GravityInt {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface GuardedBy {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface HalfFloat {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IdRes {
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface InspectableProperty {
+ method @Deprecated public abstract int attributeId() default 0;
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping() default {};
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping() default {};
+ method @Deprecated public abstract boolean hasAttributeId() default true;
+ method @Deprecated public abstract String name() default "";
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.ValueType valueType() default androidx.annotation.InspectableProperty.ValueType.INFERRED;
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.EnumEntry {
+ method @Deprecated public abstract String name();
+ method @Deprecated public abstract int value();
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.FlagEntry {
+ method @Deprecated public abstract int mask() default 0;
+ method @Deprecated public abstract String name();
+ method @Deprecated public abstract int target();
+ }
+
+ @Deprecated public enum InspectableProperty.ValueType {
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType COLOR;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType GRAVITY;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INFERRED;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_ENUM;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_FLAG;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType NONE;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType RESOURCE_ID;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract int[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntRange {
+ method public abstract long from() default java.lang.Long.MIN_VALUE;
+ method public abstract long to() default java.lang.Long.MAX_VALUE;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IntegerRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface Keep {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface LayoutRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface LongDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract long[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface MainThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface MenuRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface NavigationRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface NonNull {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface NonUiContext {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
+ }
+
+ @Dimension(unit=androidx.annotation.Dimension.PX) @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface Px {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface RawRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RequiresApi {
+ method @IntRange(from=1) public abstract int api() default 1;
+ method @IntRange(from=1) public abstract int value() default 1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface RequiresFeature {
+ method public abstract String enforcement();
+ method public abstract String name();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) public @interface RequiresPermission {
+ method public abstract String[] allOf() default {};
+ method public abstract String[] anyOf() default {};
+ method public abstract boolean conditional() default false;
+ method public abstract String value() default "";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) public static @interface RequiresPermission.Read {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) public static @interface RequiresPermission.Write {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+ method public abstract androidx.annotation.RestrictTo.Scope[] value();
+ }
+
+ public enum RestrictTo.Scope {
+ enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
+ method public abstract long max() default java.lang.Long.MAX_VALUE;
+ method public abstract long min() default java.lang.Long.MIN_VALUE;
+ method public abstract long multiple() default 1;
+ method public abstract long value() default -1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface StringDef {
+ method public abstract boolean open() default false;
+ method public abstract String[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StringRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface TransitionRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface UiContext {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface UiThread {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface VisibleForTesting {
+ method @ProductionVisibility public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+ field public static final int NONE = 5; // 0x5
+ field public static final int PACKAGE_PRIVATE = 3; // 0x3
+ field public static final int PRIVATE = 2; // 0x2
+ field public static final int PROTECTED = 4; // 0x4
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface WorkerThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface XmlRes {
+ }
+
+}
+
diff --git a/annotation/annotation/api/public_plus_experimental_1.3.0-beta02.txt b/annotation/annotation/api/public_plus_experimental_1.3.0-beta02.txt
new file mode 100644
index 0000000..263ed26
--- /dev/null
+++ b/annotation/annotation/api/public_plus_experimental_1.3.0-beta02.txt
@@ -0,0 +1,272 @@
+// Signature format: 4.0
+package androidx.annotation {
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimatorRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnyRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface AnyThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ArrayRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AttrRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface BinderThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface BoolRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CallSuper {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CheckResult {
+ method public abstract String suggest() default "";
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorLong {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ColorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface ContentView {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Dimension {
+ method @DimensionUnit public abstract int unit() default androidx.annotation.Dimension.PX;
+ field public static final int DP = 0; // 0x0
+ field public static final int PX = 1; // 0x1
+ field public static final int SP = 2; // 0x2
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE}) public @interface Discouraged {
+ method public abstract String message();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface DisplayContext {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface DoNotInline {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
+ method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+ method public abstract boolean fromInclusive() default true;
+ method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+ method public abstract boolean toInclusive() default true;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FontRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FractionRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface GravityInt {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface GuardedBy {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface HalfFloat {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IdRes {
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface InspectableProperty {
+ method @Deprecated public abstract int attributeId() default 0;
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping() default {};
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping() default {};
+ method @Deprecated public abstract boolean hasAttributeId() default true;
+ method @Deprecated public abstract String name() default "";
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.ValueType valueType() default androidx.annotation.InspectableProperty.ValueType.INFERRED;
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.EnumEntry {
+ method @Deprecated public abstract String name();
+ method @Deprecated public abstract int value();
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.FlagEntry {
+ method @Deprecated public abstract int mask() default 0;
+ method @Deprecated public abstract String name();
+ method @Deprecated public abstract int target();
+ }
+
+ @Deprecated public enum InspectableProperty.ValueType {
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType COLOR;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType GRAVITY;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INFERRED;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_ENUM;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_FLAG;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType NONE;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType RESOURCE_ID;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract int[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntRange {
+ method public abstract long from() default java.lang.Long.MIN_VALUE;
+ method public abstract long to() default java.lang.Long.MAX_VALUE;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IntegerRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface Keep {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface LayoutRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface LongDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract long[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface MainThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface MenuRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface NavigationRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface NonNull {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface NonUiContext {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
+ }
+
+ @Dimension(unit=androidx.annotation.Dimension.PX) @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface Px {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface RawRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RequiresApi {
+ method @IntRange(from=1) public abstract int api() default 1;
+ method @IntRange(from=1) public abstract int value() default 1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface RequiresFeature {
+ method public abstract String enforcement();
+ method public abstract String name();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) public @interface RequiresPermission {
+ method public abstract String[] allOf() default {};
+ method public abstract String[] anyOf() default {};
+ method public abstract boolean conditional() default false;
+ method public abstract String value() default "";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) public static @interface RequiresPermission.Read {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) public static @interface RequiresPermission.Write {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+ method public abstract androidx.annotation.RestrictTo.Scope[] value();
+ }
+
+ public enum RestrictTo.Scope {
+ enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
+ method public abstract long max() default java.lang.Long.MAX_VALUE;
+ method public abstract long min() default java.lang.Long.MIN_VALUE;
+ method public abstract long multiple() default 1;
+ method public abstract long value() default -1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface StringDef {
+ method public abstract boolean open() default false;
+ method public abstract String[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StringRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface TransitionRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface UiContext {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface UiThread {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface VisibleForTesting {
+ method @ProductionVisibility public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+ field public static final int NONE = 5; // 0x5
+ field public static final int PACKAGE_PRIVATE = 3; // 0x3
+ field public static final int PRIVATE = 2; // 0x2
+ field public static final int PROTECTED = 4; // 0x4
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface WorkerThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface XmlRes {
+ }
+
+}
+
diff --git a/annotation/annotation/api/restricted_1.3.0-beta02.txt b/annotation/annotation/api/restricted_1.3.0-beta02.txt
new file mode 100644
index 0000000..263ed26
--- /dev/null
+++ b/annotation/annotation/api/restricted_1.3.0-beta02.txt
@@ -0,0 +1,272 @@
+// Signature format: 4.0
+package androidx.annotation {
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnimatorRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AnyRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface AnyThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ArrayRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface AttrRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface BinderThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface BoolRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CallSuper {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface CheckResult {
+ method public abstract String suggest() default "";
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface ChecksSdkIntAtLeast {
+ method public abstract int api() default -1;
+ method public abstract String codename() default "";
+ method public abstract int lambda() default -1;
+ method public abstract int parameter() default -1;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorInt {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface ColorLong {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface ColorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface ContentView {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DimenRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Dimension {
+ method @DimensionUnit public abstract int unit() default androidx.annotation.Dimension.PX;
+ field public static final int DP = 0; // 0x0
+ field public static final int PX = 1; // 0x1
+ field public static final int SP = 2; // 0x2
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.TYPE}) public @interface Discouraged {
+ method public abstract String message();
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface DisplayContext {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface DoNotInline {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface DrawableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface FloatRange {
+ method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+ method public abstract boolean fromInclusive() default true;
+ method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+ method public abstract boolean toInclusive() default true;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FontRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface FractionRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface GravityInt {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD}) public @interface GuardedBy {
+ method public abstract String value();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.FIELD}) public @interface HalfFloat {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IdRes {
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD}) public @interface InspectableProperty {
+ method @Deprecated public abstract int attributeId() default 0;
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.EnumEntry[] enumMapping() default {};
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.FlagEntry[] flagMapping() default {};
+ method @Deprecated public abstract boolean hasAttributeId() default true;
+ method @Deprecated public abstract String name() default "";
+ method @Deprecated public abstract androidx.annotation.InspectableProperty.ValueType valueType() default androidx.annotation.InspectableProperty.ValueType.INFERRED;
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.EnumEntry {
+ method @Deprecated public abstract String name();
+ method @Deprecated public abstract int value();
+ }
+
+ @Deprecated @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE}) public static @interface InspectableProperty.FlagEntry {
+ method @Deprecated public abstract int mask() default 0;
+ method @Deprecated public abstract String name();
+ method @Deprecated public abstract int target();
+ }
+
+ @Deprecated public enum InspectableProperty.ValueType {
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType COLOR;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType GRAVITY;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INFERRED;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_ENUM;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType INT_FLAG;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType NONE;
+ enum_constant @Deprecated public static final androidx.annotation.InspectableProperty.ValueType RESOURCE_ID;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract int[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface IntRange {
+ method public abstract long from() default java.lang.Long.MIN_VALUE;
+ method public abstract long to() default java.lang.Long.MAX_VALUE;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface IntegerRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface InterpolatorRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PACKAGE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD}) public @interface Keep {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface LayoutRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface LongDef {
+ method public abstract boolean flag() default false;
+ method public abstract boolean open() default false;
+ method public abstract long[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface MainThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface MenuRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface NavigationRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface NonNull {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface NonUiContext {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.PACKAGE}) public @interface Nullable {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface PluralsRes {
+ }
+
+ @Dimension(unit=androidx.annotation.Dimension.PX) @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface Px {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface RawRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RequiresApi {
+ method @IntRange(from=1) public abstract int api() default 1;
+ method @IntRange(from=1) public abstract int value() default 1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR}) public @interface RequiresFeature {
+ method public abstract String enforcement();
+ method public abstract String name();
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PARAMETER}) public @interface RequiresPermission {
+ method public abstract String[] allOf() default {};
+ method public abstract String[] anyOf() default {};
+ method public abstract boolean conditional() default false;
+ method public abstract String value() default "";
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) public static @interface RequiresPermission.Read {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER}) public static @interface RequiresPermission.Write {
+ method public abstract androidx.annotation.RequiresPermission value() default @androidx.annotation.RequiresPermission;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.PACKAGE}) public @interface RestrictTo {
+ method public abstract androidx.annotation.RestrictTo.Scope[] value();
+ }
+
+ public enum RestrictTo.Scope {
+ enum_constant @Deprecated public static final androidx.annotation.RestrictTo.Scope GROUP_ID;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope LIBRARY_GROUP_PREFIX;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope SUBCLASSES;
+ enum_constant public static final androidx.annotation.RestrictTo.Scope TESTS;
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.LOCAL_VARIABLE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface Size {
+ method public abstract long max() default java.lang.Long.MAX_VALUE;
+ method public abstract long min() default java.lang.Long.MIN_VALUE;
+ method public abstract long multiple() default 1;
+ method public abstract long value() default -1;
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.ANNOTATION_TYPE}) public @interface StringDef {
+ method public abstract boolean open() default false;
+ method public abstract String[] value() default {};
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StringRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface StyleableRes {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface TransitionRes {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) @java.lang.annotation.Target({java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD}) public @interface UiContext {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface UiThread {
+ }
+
+ @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface VisibleForTesting {
+ method @ProductionVisibility public abstract int otherwise() default androidx.annotation.VisibleForTesting.PRIVATE;
+ field public static final int NONE = 5; // 0x5
+ field public static final int PACKAGE_PRIVATE = 3; // 0x3
+ field public static final int PRIVATE = 2; // 0x2
+ field public static final int PROTECTED = 4; // 0x4
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.CONSTRUCTOR, java.lang.annotation.ElementType.TYPE, java.lang.annotation.ElementType.PARAMETER}) public @interface WorkerThread {
+ }
+
+ @java.lang.annotation.Documented @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) @java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD, java.lang.annotation.ElementType.PARAMETER, java.lang.annotation.ElementType.FIELD, java.lang.annotation.ElementType.LOCAL_VARIABLE}) public @interface XmlRes {
+ }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/1.4.0-beta01.txt b/appcompat/appcompat-resources/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..b0256cf
--- /dev/null
+++ b/appcompat/appcompat-resources/api/1.4.0-beta01.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/1.4.0-beta02.txt b/appcompat/appcompat-resources/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..b0256cf
--- /dev/null
+++ b/appcompat/appcompat-resources/api/1.4.0-beta02.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/public_plus_experimental_1.4.0-beta01.txt b/appcompat/appcompat-resources/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..b0256cf
--- /dev/null
+++ b/appcompat/appcompat-resources/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/public_plus_experimental_1.4.0-beta02.txt b/appcompat/appcompat-resources/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..b0256cf
--- /dev/null
+++ b/appcompat/appcompat-resources/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,35 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/appcompat/appcompat-resources/api/res-1.4.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to appcompat/appcompat-resources/api/res-1.4.0-beta01.txt
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/appcompat/appcompat-resources/api/res-1.4.0-beta02.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to appcompat/appcompat-resources/api/res-1.4.0-beta02.txt
diff --git a/appcompat/appcompat-resources/api/restricted_1.4.0-beta01.txt b/appcompat/appcompat-resources/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..9a7d74e
--- /dev/null
+++ b/appcompat/appcompat-resources/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,103 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback androidx.core.graphics.drawable.TintAwareDrawable {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableWrapper extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public DrawableWrapper(android.graphics.drawable.Drawable!);
+ method public void draw(android.graphics.Canvas!);
+ method public int getOpacity();
+ method public android.graphics.drawable.Drawable! getWrappedDrawable();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableUtils {
+ method public static boolean canSafelyMutateDrawable(android.graphics.drawable.Drawable);
+ method public static android.graphics.Rect getOpticalBounds(android.graphics.drawable.Drawable);
+ method public static android.graphics.PorterDuff.Mode! parseTintMode(int, android.graphics.PorterDuff.Mode!);
+ field public static final android.graphics.Rect! INSETS_NONE;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResourceManagerInternal {
+ ctor public ResourceManagerInternal();
+ method public static androidx.appcompat.widget.ResourceManagerInternal! get();
+ method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+ method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+ method public void onConfigurationChanged(android.content.Context);
+ method public void setHooks(androidx.appcompat.widget.ResourceManagerInternal.ResourceManagerHooks!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ResourceManagerInternal.ResourceManagerHooks {
+ method public android.graphics.drawable.Drawable? createDrawableFor(androidx.appcompat.widget.ResourceManagerInternal, android.content.Context, @DrawableRes int);
+ method public android.content.res.ColorStateList? getTintListForDrawableRes(android.content.Context, @DrawableRes int);
+ method public android.graphics.PorterDuff.Mode? getTintModeForDrawableRes(int);
+ method public boolean tintDrawable(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+ method public boolean tintDrawableUsingColorFilter(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintContextWrapper extends android.content.ContextWrapper {
+ method public static android.content.Context! wrap(android.content.Context);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintInfo {
+ ctor public TintInfo();
+ field public boolean mHasTintList;
+ field public boolean mHasTintMode;
+ field public android.content.res.ColorStateList! mTintList;
+ field public android.graphics.PorterDuff.Mode! mTintMode;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class VectorEnabledTintResources extends android.content.res.Resources {
+ ctor public VectorEnabledTintResources(android.content.Context, android.content.res.Resources);
+ method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.ColorStateList! getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method @RequiresApi(15) public android.graphics.drawable.Drawable! getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.Movie! getMovie(int) throws android.content.res.Resources.NotFoundException;
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public static boolean shouldBeUsed();
+ method public void updateConfiguration(android.content.res.Configuration!, android.util.DisplayMetrics!);
+ field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
+ }
+
+}
+
diff --git a/appcompat/appcompat-resources/api/restricted_1.4.0-beta02.txt b/appcompat/appcompat-resources/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..9a7d74e
--- /dev/null
+++ b/appcompat/appcompat-resources/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,103 @@
+// Signature format: 4.0
+package androidx.appcompat.content.res {
+
+ public final class AppCompatResources {
+ method public static android.content.res.ColorStateList! getColorStateList(android.content.Context, @ColorRes int);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class AnimatedStateListDrawableCompat extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback androidx.core.graphics.drawable.TintAwareDrawable {
+ ctor public AnimatedStateListDrawableCompat();
+ method public void addState(int[], android.graphics.drawable.Drawable, int);
+ method public void addState(int[]!, android.graphics.drawable.Drawable!);
+ method public <T extends android.graphics.drawable.Drawable & android.graphics.drawable.Animatable> void addTransition(int, int, T, boolean);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat? create(android.content.Context, @DrawableRes int, android.content.res.Resources.Theme?);
+ method public static androidx.appcompat.graphics.drawable.AnimatedStateListDrawableCompat! createFromXmlInner(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.drawable.Drawable.ConstantState! getConstantState();
+ method public int getOpacity();
+ method public void inflate(android.content.Context, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public void invalidateDrawable(android.graphics.drawable.Drawable);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable, Runnable, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setEnterFadeDuration(int);
+ method public void setExitFadeDuration(int);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable, Runnable);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableWrapper extends android.graphics.drawable.Drawable implements android.graphics.drawable.Drawable.Callback {
+ ctor public DrawableWrapper(android.graphics.drawable.Drawable!);
+ method public void draw(android.graphics.Canvas!);
+ method public int getOpacity();
+ method public android.graphics.drawable.Drawable! getWrappedDrawable();
+ method public void invalidateDrawable(android.graphics.drawable.Drawable!);
+ method public void scheduleDrawable(android.graphics.drawable.Drawable!, Runnable!, long);
+ method public void setAlpha(int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDither(boolean);
+ method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+ method public void unscheduleDrawable(android.graphics.drawable.Drawable!, Runnable!);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DrawableUtils {
+ method public static boolean canSafelyMutateDrawable(android.graphics.drawable.Drawable);
+ method public static android.graphics.Rect getOpticalBounds(android.graphics.drawable.Drawable);
+ method public static android.graphics.PorterDuff.Mode! parseTintMode(int, android.graphics.PorterDuff.Mode!);
+ field public static final android.graphics.Rect! INSETS_NONE;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ResourceManagerInternal {
+ ctor public ResourceManagerInternal();
+ method public static androidx.appcompat.widget.ResourceManagerInternal! get();
+ method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+ method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+ method public void onConfigurationChanged(android.content.Context);
+ method public void setHooks(androidx.appcompat.widget.ResourceManagerInternal.ResourceManagerHooks!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ResourceManagerInternal.ResourceManagerHooks {
+ method public android.graphics.drawable.Drawable? createDrawableFor(androidx.appcompat.widget.ResourceManagerInternal, android.content.Context, @DrawableRes int);
+ method public android.content.res.ColorStateList? getTintListForDrawableRes(android.content.Context, @DrawableRes int);
+ method public android.graphics.PorterDuff.Mode? getTintModeForDrawableRes(int);
+ method public boolean tintDrawable(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+ method public boolean tintDrawableUsingColorFilter(android.content.Context, @DrawableRes int, android.graphics.drawable.Drawable);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintContextWrapper extends android.content.ContextWrapper {
+ method public static android.content.Context! wrap(android.content.Context);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintInfo {
+ ctor public TintInfo();
+ field public boolean mHasTintList;
+ field public boolean mHasTintMode;
+ field public android.content.res.ColorStateList! mTintList;
+ field public android.graphics.PorterDuff.Mode! mTintMode;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class VectorEnabledTintResources extends android.content.res.Resources {
+ ctor public VectorEnabledTintResources(android.content.Context, android.content.res.Resources);
+ method public int getColor(int) throws android.content.res.Resources.NotFoundException;
+ method public android.content.res.ColorStateList! getColorStateList(int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.drawable.Drawable! getDrawable(int) throws android.content.res.Resources.NotFoundException;
+ method @RequiresApi(15) public android.graphics.drawable.Drawable! getDrawableForDensity(int, int) throws android.content.res.Resources.NotFoundException;
+ method public android.graphics.Movie! getMovie(int) throws android.content.res.Resources.NotFoundException;
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public static boolean shouldBeUsed();
+ method public void updateConfiguration(android.content.res.Configuration!, android.util.DisplayMetrics!);
+ field public static final int MAX_SDK_WHERE_REQUIRED = 20; // 0x14
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/1.4.0-beta01.txt b/appcompat/appcompat/api/1.4.0-beta01.txt
new file mode 100644
index 0000000..b560b02
--- /dev/null
+++ b/appcompat/appcompat/api/1.4.0-beta01.txt
@@ -0,0 +1,1018 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public abstract android.view.View! getCustomView();
+ method public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(int);
+ method public abstract void setDisplayOptions(int, int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method public abstract void show();
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ ctor public AppCompatDialogFragment(@LayoutRes int);
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public boolean hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field public int cellsUsed;
+ field public boolean expandable;
+ field public int extraPixels;
+ field public boolean isOverflowButton;
+ field public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface EmojiCompatConfigurationView {
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+ method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+ method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+ method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+ method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(@GravityInt int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(int);
+ method public void setShowDividers(int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ListPopupWindow {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+ method public int getInputType();
+ method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+ method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void onMeasure(int, int);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @MainThread public void invalidateMenu();
+ method public boolean isOverflowMenuShowing();
+ method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/1.4.0-beta02.txt b/appcompat/appcompat/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..b560b02
--- /dev/null
+++ b/appcompat/appcompat/api/1.4.0-beta02.txt
@@ -0,0 +1,1018 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public abstract android.view.View! getCustomView();
+ method public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(int);
+ method public abstract void setDisplayOptions(int, int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method public abstract void show();
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ ctor public AppCompatDialogFragment(@LayoutRes int);
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public boolean hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field public int cellsUsed;
+ field public boolean expandable;
+ field public int extraPixels;
+ field public boolean isOverflowButton;
+ field public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface EmojiCompatConfigurationView {
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+ method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+ method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+ method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+ method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(@GravityInt int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(int);
+ method public void setShowDividers(int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ListPopupWindow {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+ method public int getInputType();
+ method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+ method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void onMeasure(int, int);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @MainThread public void invalidateMenu();
+ method public boolean isOverflowMenuShowing();
+ method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/public_plus_experimental_1.4.0-beta01.txt b/appcompat/appcompat/api/public_plus_experimental_1.4.0-beta01.txt
new file mode 100644
index 0000000..b560b02
--- /dev/null
+++ b/appcompat/appcompat/api/public_plus_experimental_1.4.0-beta01.txt
@@ -0,0 +1,1018 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public abstract android.view.View! getCustomView();
+ method public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(int);
+ method public abstract void setDisplayOptions(int, int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method public abstract void show();
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ ctor public AppCompatDialogFragment(@LayoutRes int);
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public boolean hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field public int cellsUsed;
+ field public boolean expandable;
+ field public int extraPixels;
+ field public boolean isOverflowButton;
+ field public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface EmojiCompatConfigurationView {
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+ method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+ method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+ method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+ method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(@GravityInt int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(int);
+ method public void setShowDividers(int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ListPopupWindow {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+ method public int getInputType();
+ method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+ method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void onMeasure(int, int);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @MainThread public void invalidateMenu();
+ method public boolean isOverflowMenuShowing();
+ method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/public_plus_experimental_1.4.0-beta02.txt b/appcompat/appcompat/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..b560b02
--- /dev/null
+++ b/appcompat/appcompat/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,1018 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public abstract android.view.View! getCustomView();
+ method public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(int);
+ method public abstract void setDisplayOptions(int, int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method public abstract void show();
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.lifecycle.LifecycleOwner androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ ctor public AppCompatDialogFragment(@LayoutRes int);
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method public boolean hideOverflowMenu();
+ method public boolean isOverflowMenuShowing();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field public int cellsUsed;
+ field public boolean expandable;
+ field public int extraPixels;
+ field public boolean isOverflowButton;
+ field public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatButton extends android.widget.Button implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatTextView extends android.widget.TextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface EmojiCompatConfigurationView {
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+ method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+ method @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+ method @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+ method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(@GravityInt int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(int);
+ method public void setShowDividers(int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ListPopupWindow {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+ method public int getInputType();
+ method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+ method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void onMeasure(int, int);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @MainThread public void invalidateMenu();
+ method public boolean isOverflowMenuShowing();
+ method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/res-1.4.0-beta01.txt b/appcompat/appcompat/api/res-1.4.0-beta01.txt
new file mode 100644
index 0000000..b9f58a8
--- /dev/null
+++ b/appcompat/appcompat/api/res-1.4.0-beta01.txt
@@ -0,0 +1,369 @@
+attr actionBarDivider
+attr actionBarItemBackground
+attr actionBarPopupTheme
+attr actionBarSize
+attr actionBarSplitStyle
+attr actionBarStyle
+attr actionBarTabBarStyle
+attr actionBarTabStyle
+attr actionBarTabTextStyle
+attr actionBarTheme
+attr actionBarWidgetTheme
+attr actionButtonStyle
+attr actionDropDownStyle
+attr actionLayout
+attr actionMenuTextAppearance
+attr actionMenuTextColor
+attr actionModeBackground
+attr actionModeCloseButtonStyle
+attr actionModeCloseContentDescription
+attr actionModeCloseDrawable
+attr actionModeCopyDrawable
+attr actionModeCutDrawable
+attr actionModeFindDrawable
+attr actionModePasteDrawable
+attr actionModeSelectAllDrawable
+attr actionModeShareDrawable
+attr actionModeSplitBackground
+attr actionModeStyle
+attr actionModeTheme
+attr actionModeWebSearchDrawable
+attr actionOverflowButtonStyle
+attr actionOverflowMenuStyle
+attr actionProviderClass
+attr actionViewClass
+attr alertDialogStyle
+attr alertDialogTheme
+attr arrowHeadLength
+attr arrowShaftLength
+attr autoCompleteTextViewStyle
+attr autoSizeMaxTextSize
+attr autoSizeMinTextSize
+attr autoSizePresetSizes
+attr autoSizeStepGranularity
+attr autoSizeTextType
+attr background
+attr backgroundSplit
+attr backgroundStacked
+attr backgroundTint
+attr backgroundTintMode
+attr barLength
+attr borderlessButtonStyle
+attr buttonBarButtonStyle
+attr buttonBarNegativeButtonStyle
+attr buttonBarNeutralButtonStyle
+attr buttonBarPositiveButtonStyle
+attr buttonBarStyle
+attr buttonGravity
+attr buttonStyle
+attr buttonStyleSmall
+attr buttonTint
+attr buttonTintMode
+attr checkboxStyle
+attr checkedTextViewStyle
+attr closeIcon
+attr closeItemLayout
+attr collapseContentDescription
+attr collapseIcon
+attr color
+attr colorAccent
+attr colorBackgroundFloating
+attr colorButtonNormal
+attr colorControlActivated
+attr colorControlHighlight
+attr colorControlNormal
+attr colorError
+attr colorPrimary
+attr colorPrimaryDark
+attr commitIcon
+attr contentInsetEnd
+attr contentInsetEndWithActions
+attr contentInsetLeft
+attr contentInsetRight
+attr contentInsetStart
+attr contentInsetStartWithNavigation
+attr customNavigationLayout
+attr dialogCornerRadius
+attr dialogPreferredPadding
+attr dialogTheme
+attr displayOptions
+attr divider
+attr dividerHorizontal
+attr dividerPadding
+attr dividerVertical
+attr drawableSize
+attr drawerArrowStyle
+attr dropDownListViewStyle
+attr editTextBackground
+attr editTextColor
+attr editTextStyle
+attr elevation
+attr emojiCompatEnabled
+attr firstBaselineToTopHeight
+attr fontFamily
+attr fontVariationSettings
+attr gapBetweenBars
+attr goIcon
+attr height
+attr hideOnContentScroll
+attr homeAsUpIndicator
+attr homeLayout
+attr icon
+attr iconTint
+attr iconTintMode
+attr iconifiedByDefault
+attr imageButtonStyle
+attr indeterminateProgressStyle
+attr isLightTheme
+attr itemPadding
+attr lastBaselineToBottomHeight
+attr layout
+attr lineHeight
+attr listChoiceBackgroundIndicator
+attr listChoiceIndicatorMultipleAnimated
+attr listChoiceIndicatorSingleAnimated
+attr listDividerAlertDialog
+attr listPopupWindowStyle
+attr listPreferredItemHeight
+attr listPreferredItemHeightLarge
+attr listPreferredItemHeightSmall
+attr listPreferredItemPaddingEnd
+attr listPreferredItemPaddingLeft
+attr listPreferredItemPaddingRight
+attr listPreferredItemPaddingStart
+attr logo
+attr logoDescription
+attr maxButtonHeight
+attr measureWithLargestChild
+attr navigationContentDescription
+attr navigationIcon
+attr navigationMode
+attr overlapAnchor
+attr paddingEnd
+attr paddingStart
+attr panelBackground
+attr popupMenuStyle
+attr popupTheme
+attr popupWindowStyle
+attr preserveIconSpacing
+attr progressBarPadding
+attr progressBarStyle
+attr queryBackground
+attr queryHint
+attr radioButtonStyle
+attr ratingBarStyle
+attr ratingBarStyleIndicator
+attr ratingBarStyleSmall
+attr searchHintIcon
+attr searchIcon
+attr searchViewStyle
+attr seekBarStyle
+attr selectableItemBackground
+attr selectableItemBackgroundBorderless
+attr showAsAction
+attr showDividers
+attr showText
+attr spinBars
+attr spinnerDropDownItemStyle
+attr spinnerStyle
+attr splitTrack
+attr srcCompat
+attr state_above_anchor
+attr submitBackground
+attr subtitle
+attr subtitleTextAppearance
+attr subtitleTextColor
+attr subtitleTextStyle
+attr suggestionRowLayout
+attr switchMinWidth
+attr switchPadding
+attr switchStyle
+attr switchTextAppearance
+attr textAllCaps
+attr textAppearanceLargePopupMenu
+attr textAppearanceListItem
+attr textAppearanceListItemSecondary
+attr textAppearanceListItemSmall
+attr textAppearancePopupMenuHeader
+attr textAppearanceSearchResultSubtitle
+attr textAppearanceSearchResultTitle
+attr textAppearanceSmallPopupMenu
+attr textColorAlertDialogListItem
+attr textLocale
+attr theme
+attr thickness
+attr thumbTextPadding
+attr thumbTint
+attr thumbTintMode
+attr tickMark
+attr tickMarkTint
+attr tickMarkTintMode
+attr tint
+attr tintMode
+attr title
+attr titleMargin
+attr titleMarginBottom
+attr titleMarginEnd
+attr titleMarginStart
+attr titleMarginTop
+attr titleMargins
+attr titleTextAppearance
+attr titleTextColor
+attr titleTextStyle
+attr toolbarNavigationButtonStyle
+attr toolbarStyle
+attr track
+attr trackTint
+attr trackTintMode
+attr voiceIcon
+attr windowActionBar
+attr windowActionBarOverlay
+attr windowActionModeOverlay
+attr windowNoTitle
+layout support_simple_spinner_dropdown_item
+style TextAppearance_AppCompat
+style TextAppearance_AppCompat_Body1
+style TextAppearance_AppCompat_Body2
+style TextAppearance_AppCompat_Button
+style TextAppearance_AppCompat_Caption
+style TextAppearance_AppCompat_Display1
+style TextAppearance_AppCompat_Display2
+style TextAppearance_AppCompat_Display3
+style TextAppearance_AppCompat_Display4
+style TextAppearance_AppCompat_Headline
+style TextAppearance_AppCompat_Inverse
+style TextAppearance_AppCompat_Large
+style TextAppearance_AppCompat_Large_Inverse
+style TextAppearance_AppCompat_Light_SearchResult_Subtitle
+style TextAppearance_AppCompat_Light_SearchResult_Title
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Medium
+style TextAppearance_AppCompat_Medium_Inverse
+style TextAppearance_AppCompat_Menu
+style TextAppearance_AppCompat_SearchResult_Subtitle
+style TextAppearance_AppCompat_SearchResult_Title
+style TextAppearance_AppCompat_Small
+style TextAppearance_AppCompat_Small_Inverse
+style TextAppearance_AppCompat_Subhead
+style TextAppearance_AppCompat_Subhead_Inverse
+style TextAppearance_AppCompat_Title
+style TextAppearance_AppCompat_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Menu
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Title
+style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Title
+style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
+style TextAppearance_AppCompat_Widget_Button
+style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style TextAppearance_AppCompat_Widget_Button_Colored
+style TextAppearance_AppCompat_Widget_Button_Inverse
+style TextAppearance_AppCompat_Widget_DropDownItem
+style TextAppearance_AppCompat_Widget_PopupMenu_Header
+style TextAppearance_AppCompat_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Widget_Switch
+style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style ThemeOverlay_AppCompat
+style ThemeOverlay_AppCompat_ActionBar
+style ThemeOverlay_AppCompat_Dark
+style ThemeOverlay_AppCompat_Dark_ActionBar
+style ThemeOverlay_AppCompat_DayNight
+style ThemeOverlay_AppCompat_DayNight_ActionBar
+style ThemeOverlay_AppCompat_Dialog
+style ThemeOverlay_AppCompat_Dialog_Alert
+style ThemeOverlay_AppCompat_Light
+style Theme_AppCompat
+style Theme_AppCompat_DayNight
+style Theme_AppCompat_DayNight_DarkActionBar
+style Theme_AppCompat_DayNight_Dialog
+style Theme_AppCompat_DayNight_DialogWhenLarge
+style Theme_AppCompat_DayNight_Dialog_Alert
+style Theme_AppCompat_DayNight_Dialog_MinWidth
+style Theme_AppCompat_DayNight_NoActionBar
+style Theme_AppCompat_Dialog
+style Theme_AppCompat_DialogWhenLarge
+style Theme_AppCompat_Dialog_Alert
+style Theme_AppCompat_Dialog_MinWidth
+style Theme_AppCompat_Light
+style Theme_AppCompat_Light_DarkActionBar
+style Theme_AppCompat_Light_Dialog
+style Theme_AppCompat_Light_DialogWhenLarge
+style Theme_AppCompat_Light_Dialog_Alert
+style Theme_AppCompat_Light_Dialog_MinWidth
+style Theme_AppCompat_Light_NoActionBar
+style Theme_AppCompat_NoActionBar
+style Widget_AppCompat_ActionBar
+style Widget_AppCompat_ActionBar_Solid
+style Widget_AppCompat_ActionBar_TabBar
+style Widget_AppCompat_ActionBar_TabText
+style Widget_AppCompat_ActionBar_TabView
+style Widget_AppCompat_ActionButton
+style Widget_AppCompat_ActionButton_CloseMode
+style Widget_AppCompat_ActionButton_Overflow
+style Widget_AppCompat_ActionMode
+style Widget_AppCompat_AutoCompleteTextView
+style Widget_AppCompat_Button
+style Widget_AppCompat_ButtonBar
+style Widget_AppCompat_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Borderless
+style Widget_AppCompat_Button_Borderless_Colored
+style Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Colored
+style Widget_AppCompat_Button_Small
+style Widget_AppCompat_CompoundButton_CheckBox
+style Widget_AppCompat_CompoundButton_RadioButton
+style Widget_AppCompat_CompoundButton_Switch
+style Widget_AppCompat_DrawerArrowToggle
+style Widget_AppCompat_DropDownItem_Spinner
+style Widget_AppCompat_EditText
+style Widget_AppCompat_ImageButton
+style Widget_AppCompat_Light_ActionBar
+style Widget_AppCompat_Light_ActionBar_Solid
+style Widget_AppCompat_Light_ActionBar_Solid_Inverse
+style Widget_AppCompat_Light_ActionBar_TabBar
+style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
+style Widget_AppCompat_Light_ActionBar_TabText
+style Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Widget_AppCompat_Light_ActionBar_TabView
+style Widget_AppCompat_Light_ActionBar_TabView_Inverse
+style Widget_AppCompat_Light_ActionButton
+style Widget_AppCompat_Light_ActionButton_CloseMode
+style Widget_AppCompat_Light_ActionButton_Overflow
+style Widget_AppCompat_Light_ActionMode_Inverse
+style Widget_AppCompat_Light_AutoCompleteTextView
+style Widget_AppCompat_Light_DropDownItem_Spinner
+style Widget_AppCompat_Light_ListPopupWindow
+style Widget_AppCompat_Light_ListView_DropDown
+style Widget_AppCompat_Light_PopupMenu
+style Widget_AppCompat_Light_PopupMenu_Overflow
+style Widget_AppCompat_Light_SearchView
+style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
+style Widget_AppCompat_ListPopupWindow
+style Widget_AppCompat_ListView
+style Widget_AppCompat_ListView_DropDown
+style Widget_AppCompat_ListView_Menu
+style Widget_AppCompat_PopupMenu
+style Widget_AppCompat_PopupMenu_Overflow
+style Widget_AppCompat_PopupWindow
+style Widget_AppCompat_ProgressBar
+style Widget_AppCompat_ProgressBar_Horizontal
+style Widget_AppCompat_RatingBar
+style Widget_AppCompat_RatingBar_Indicator
+style Widget_AppCompat_RatingBar_Small
+style Widget_AppCompat_SearchView
+style Widget_AppCompat_SearchView_ActionBar
+style Widget_AppCompat_SeekBar
+style Widget_AppCompat_SeekBar_Discrete
+style Widget_AppCompat_Spinner
+style Widget_AppCompat_Spinner_DropDown
+style Widget_AppCompat_Spinner_DropDown_ActionBar
+style Widget_AppCompat_Spinner_Underlined
+style Widget_AppCompat_TextView
+style Widget_AppCompat_TextView_SpinnerItem
+style Widget_AppCompat_Toolbar
+style Widget_AppCompat_Toolbar_Button_Navigation
diff --git a/appcompat/appcompat/api/res-1.4.0-beta02.txt b/appcompat/appcompat/api/res-1.4.0-beta02.txt
new file mode 100644
index 0000000..b9f58a8
--- /dev/null
+++ b/appcompat/appcompat/api/res-1.4.0-beta02.txt
@@ -0,0 +1,369 @@
+attr actionBarDivider
+attr actionBarItemBackground
+attr actionBarPopupTheme
+attr actionBarSize
+attr actionBarSplitStyle
+attr actionBarStyle
+attr actionBarTabBarStyle
+attr actionBarTabStyle
+attr actionBarTabTextStyle
+attr actionBarTheme
+attr actionBarWidgetTheme
+attr actionButtonStyle
+attr actionDropDownStyle
+attr actionLayout
+attr actionMenuTextAppearance
+attr actionMenuTextColor
+attr actionModeBackground
+attr actionModeCloseButtonStyle
+attr actionModeCloseContentDescription
+attr actionModeCloseDrawable
+attr actionModeCopyDrawable
+attr actionModeCutDrawable
+attr actionModeFindDrawable
+attr actionModePasteDrawable
+attr actionModeSelectAllDrawable
+attr actionModeShareDrawable
+attr actionModeSplitBackground
+attr actionModeStyle
+attr actionModeTheme
+attr actionModeWebSearchDrawable
+attr actionOverflowButtonStyle
+attr actionOverflowMenuStyle
+attr actionProviderClass
+attr actionViewClass
+attr alertDialogStyle
+attr alertDialogTheme
+attr arrowHeadLength
+attr arrowShaftLength
+attr autoCompleteTextViewStyle
+attr autoSizeMaxTextSize
+attr autoSizeMinTextSize
+attr autoSizePresetSizes
+attr autoSizeStepGranularity
+attr autoSizeTextType
+attr background
+attr backgroundSplit
+attr backgroundStacked
+attr backgroundTint
+attr backgroundTintMode
+attr barLength
+attr borderlessButtonStyle
+attr buttonBarButtonStyle
+attr buttonBarNegativeButtonStyle
+attr buttonBarNeutralButtonStyle
+attr buttonBarPositiveButtonStyle
+attr buttonBarStyle
+attr buttonGravity
+attr buttonStyle
+attr buttonStyleSmall
+attr buttonTint
+attr buttonTintMode
+attr checkboxStyle
+attr checkedTextViewStyle
+attr closeIcon
+attr closeItemLayout
+attr collapseContentDescription
+attr collapseIcon
+attr color
+attr colorAccent
+attr colorBackgroundFloating
+attr colorButtonNormal
+attr colorControlActivated
+attr colorControlHighlight
+attr colorControlNormal
+attr colorError
+attr colorPrimary
+attr colorPrimaryDark
+attr commitIcon
+attr contentInsetEnd
+attr contentInsetEndWithActions
+attr contentInsetLeft
+attr contentInsetRight
+attr contentInsetStart
+attr contentInsetStartWithNavigation
+attr customNavigationLayout
+attr dialogCornerRadius
+attr dialogPreferredPadding
+attr dialogTheme
+attr displayOptions
+attr divider
+attr dividerHorizontal
+attr dividerPadding
+attr dividerVertical
+attr drawableSize
+attr drawerArrowStyle
+attr dropDownListViewStyle
+attr editTextBackground
+attr editTextColor
+attr editTextStyle
+attr elevation
+attr emojiCompatEnabled
+attr firstBaselineToTopHeight
+attr fontFamily
+attr fontVariationSettings
+attr gapBetweenBars
+attr goIcon
+attr height
+attr hideOnContentScroll
+attr homeAsUpIndicator
+attr homeLayout
+attr icon
+attr iconTint
+attr iconTintMode
+attr iconifiedByDefault
+attr imageButtonStyle
+attr indeterminateProgressStyle
+attr isLightTheme
+attr itemPadding
+attr lastBaselineToBottomHeight
+attr layout
+attr lineHeight
+attr listChoiceBackgroundIndicator
+attr listChoiceIndicatorMultipleAnimated
+attr listChoiceIndicatorSingleAnimated
+attr listDividerAlertDialog
+attr listPopupWindowStyle
+attr listPreferredItemHeight
+attr listPreferredItemHeightLarge
+attr listPreferredItemHeightSmall
+attr listPreferredItemPaddingEnd
+attr listPreferredItemPaddingLeft
+attr listPreferredItemPaddingRight
+attr listPreferredItemPaddingStart
+attr logo
+attr logoDescription
+attr maxButtonHeight
+attr measureWithLargestChild
+attr navigationContentDescription
+attr navigationIcon
+attr navigationMode
+attr overlapAnchor
+attr paddingEnd
+attr paddingStart
+attr panelBackground
+attr popupMenuStyle
+attr popupTheme
+attr popupWindowStyle
+attr preserveIconSpacing
+attr progressBarPadding
+attr progressBarStyle
+attr queryBackground
+attr queryHint
+attr radioButtonStyle
+attr ratingBarStyle
+attr ratingBarStyleIndicator
+attr ratingBarStyleSmall
+attr searchHintIcon
+attr searchIcon
+attr searchViewStyle
+attr seekBarStyle
+attr selectableItemBackground
+attr selectableItemBackgroundBorderless
+attr showAsAction
+attr showDividers
+attr showText
+attr spinBars
+attr spinnerDropDownItemStyle
+attr spinnerStyle
+attr splitTrack
+attr srcCompat
+attr state_above_anchor
+attr submitBackground
+attr subtitle
+attr subtitleTextAppearance
+attr subtitleTextColor
+attr subtitleTextStyle
+attr suggestionRowLayout
+attr switchMinWidth
+attr switchPadding
+attr switchStyle
+attr switchTextAppearance
+attr textAllCaps
+attr textAppearanceLargePopupMenu
+attr textAppearanceListItem
+attr textAppearanceListItemSecondary
+attr textAppearanceListItemSmall
+attr textAppearancePopupMenuHeader
+attr textAppearanceSearchResultSubtitle
+attr textAppearanceSearchResultTitle
+attr textAppearanceSmallPopupMenu
+attr textColorAlertDialogListItem
+attr textLocale
+attr theme
+attr thickness
+attr thumbTextPadding
+attr thumbTint
+attr thumbTintMode
+attr tickMark
+attr tickMarkTint
+attr tickMarkTintMode
+attr tint
+attr tintMode
+attr title
+attr titleMargin
+attr titleMarginBottom
+attr titleMarginEnd
+attr titleMarginStart
+attr titleMarginTop
+attr titleMargins
+attr titleTextAppearance
+attr titleTextColor
+attr titleTextStyle
+attr toolbarNavigationButtonStyle
+attr toolbarStyle
+attr track
+attr trackTint
+attr trackTintMode
+attr voiceIcon
+attr windowActionBar
+attr windowActionBarOverlay
+attr windowActionModeOverlay
+attr windowNoTitle
+layout support_simple_spinner_dropdown_item
+style TextAppearance_AppCompat
+style TextAppearance_AppCompat_Body1
+style TextAppearance_AppCompat_Body2
+style TextAppearance_AppCompat_Button
+style TextAppearance_AppCompat_Caption
+style TextAppearance_AppCompat_Display1
+style TextAppearance_AppCompat_Display2
+style TextAppearance_AppCompat_Display3
+style TextAppearance_AppCompat_Display4
+style TextAppearance_AppCompat_Headline
+style TextAppearance_AppCompat_Inverse
+style TextAppearance_AppCompat_Large
+style TextAppearance_AppCompat_Large_Inverse
+style TextAppearance_AppCompat_Light_SearchResult_Subtitle
+style TextAppearance_AppCompat_Light_SearchResult_Title
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Light_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Medium
+style TextAppearance_AppCompat_Medium_Inverse
+style TextAppearance_AppCompat_Menu
+style TextAppearance_AppCompat_SearchResult_Subtitle
+style TextAppearance_AppCompat_SearchResult_Title
+style TextAppearance_AppCompat_Small
+style TextAppearance_AppCompat_Small_Inverse
+style TextAppearance_AppCompat_Subhead
+style TextAppearance_AppCompat_Subhead_Inverse
+style TextAppearance_AppCompat_Title
+style TextAppearance_AppCompat_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Menu
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle
+style TextAppearance_AppCompat_Widget_ActionBar_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionBar_Title
+style TextAppearance_AppCompat_Widget_ActionBar_Title_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle
+style TextAppearance_AppCompat_Widget_ActionMode_Subtitle_Inverse
+style TextAppearance_AppCompat_Widget_ActionMode_Title
+style TextAppearance_AppCompat_Widget_ActionMode_Title_Inverse
+style TextAppearance_AppCompat_Widget_Button
+style TextAppearance_AppCompat_Widget_Button_Borderless_Colored
+style TextAppearance_AppCompat_Widget_Button_Colored
+style TextAppearance_AppCompat_Widget_Button_Inverse
+style TextAppearance_AppCompat_Widget_DropDownItem
+style TextAppearance_AppCompat_Widget_PopupMenu_Header
+style TextAppearance_AppCompat_Widget_PopupMenu_Large
+style TextAppearance_AppCompat_Widget_PopupMenu_Small
+style TextAppearance_AppCompat_Widget_Switch
+style TextAppearance_AppCompat_Widget_TextView_SpinnerItem
+style ThemeOverlay_AppCompat
+style ThemeOverlay_AppCompat_ActionBar
+style ThemeOverlay_AppCompat_Dark
+style ThemeOverlay_AppCompat_Dark_ActionBar
+style ThemeOverlay_AppCompat_DayNight
+style ThemeOverlay_AppCompat_DayNight_ActionBar
+style ThemeOverlay_AppCompat_Dialog
+style ThemeOverlay_AppCompat_Dialog_Alert
+style ThemeOverlay_AppCompat_Light
+style Theme_AppCompat
+style Theme_AppCompat_DayNight
+style Theme_AppCompat_DayNight_DarkActionBar
+style Theme_AppCompat_DayNight_Dialog
+style Theme_AppCompat_DayNight_DialogWhenLarge
+style Theme_AppCompat_DayNight_Dialog_Alert
+style Theme_AppCompat_DayNight_Dialog_MinWidth
+style Theme_AppCompat_DayNight_NoActionBar
+style Theme_AppCompat_Dialog
+style Theme_AppCompat_DialogWhenLarge
+style Theme_AppCompat_Dialog_Alert
+style Theme_AppCompat_Dialog_MinWidth
+style Theme_AppCompat_Light
+style Theme_AppCompat_Light_DarkActionBar
+style Theme_AppCompat_Light_Dialog
+style Theme_AppCompat_Light_DialogWhenLarge
+style Theme_AppCompat_Light_Dialog_Alert
+style Theme_AppCompat_Light_Dialog_MinWidth
+style Theme_AppCompat_Light_NoActionBar
+style Theme_AppCompat_NoActionBar
+style Widget_AppCompat_ActionBar
+style Widget_AppCompat_ActionBar_Solid
+style Widget_AppCompat_ActionBar_TabBar
+style Widget_AppCompat_ActionBar_TabText
+style Widget_AppCompat_ActionBar_TabView
+style Widget_AppCompat_ActionButton
+style Widget_AppCompat_ActionButton_CloseMode
+style Widget_AppCompat_ActionButton_Overflow
+style Widget_AppCompat_ActionMode
+style Widget_AppCompat_AutoCompleteTextView
+style Widget_AppCompat_Button
+style Widget_AppCompat_ButtonBar
+style Widget_AppCompat_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Borderless
+style Widget_AppCompat_Button_Borderless_Colored
+style Widget_AppCompat_Button_ButtonBar_AlertDialog
+style Widget_AppCompat_Button_Colored
+style Widget_AppCompat_Button_Small
+style Widget_AppCompat_CompoundButton_CheckBox
+style Widget_AppCompat_CompoundButton_RadioButton
+style Widget_AppCompat_CompoundButton_Switch
+style Widget_AppCompat_DrawerArrowToggle
+style Widget_AppCompat_DropDownItem_Spinner
+style Widget_AppCompat_EditText
+style Widget_AppCompat_ImageButton
+style Widget_AppCompat_Light_ActionBar
+style Widget_AppCompat_Light_ActionBar_Solid
+style Widget_AppCompat_Light_ActionBar_Solid_Inverse
+style Widget_AppCompat_Light_ActionBar_TabBar
+style Widget_AppCompat_Light_ActionBar_TabBar_Inverse
+style Widget_AppCompat_Light_ActionBar_TabText
+style Widget_AppCompat_Light_ActionBar_TabText_Inverse
+style Widget_AppCompat_Light_ActionBar_TabView
+style Widget_AppCompat_Light_ActionBar_TabView_Inverse
+style Widget_AppCompat_Light_ActionButton
+style Widget_AppCompat_Light_ActionButton_CloseMode
+style Widget_AppCompat_Light_ActionButton_Overflow
+style Widget_AppCompat_Light_ActionMode_Inverse
+style Widget_AppCompat_Light_AutoCompleteTextView
+style Widget_AppCompat_Light_DropDownItem_Spinner
+style Widget_AppCompat_Light_ListPopupWindow
+style Widget_AppCompat_Light_ListView_DropDown
+style Widget_AppCompat_Light_PopupMenu
+style Widget_AppCompat_Light_PopupMenu_Overflow
+style Widget_AppCompat_Light_SearchView
+style Widget_AppCompat_Light_Spinner_DropDown_ActionBar
+style Widget_AppCompat_ListPopupWindow
+style Widget_AppCompat_ListView
+style Widget_AppCompat_ListView_DropDown
+style Widget_AppCompat_ListView_Menu
+style Widget_AppCompat_PopupMenu
+style Widget_AppCompat_PopupMenu_Overflow
+style Widget_AppCompat_PopupWindow
+style Widget_AppCompat_ProgressBar
+style Widget_AppCompat_ProgressBar_Horizontal
+style Widget_AppCompat_RatingBar
+style Widget_AppCompat_RatingBar_Indicator
+style Widget_AppCompat_RatingBar_Small
+style Widget_AppCompat_SearchView
+style Widget_AppCompat_SearchView_ActionBar
+style Widget_AppCompat_SeekBar
+style Widget_AppCompat_SeekBar_Discrete
+style Widget_AppCompat_Spinner
+style Widget_AppCompat_Spinner_DropDown
+style Widget_AppCompat_Spinner_DropDown_ActionBar
+style Widget_AppCompat_Spinner_Underlined
+style Widget_AppCompat_TextView
+style Widget_AppCompat_TextView_SpinnerItem
+style Widget_AppCompat_Toolbar
+style Widget_AppCompat_Toolbar_Button_Navigation
diff --git a/appcompat/appcompat/api/restricted_1.4.0-beta01.txt b/appcompat/appcompat/api/restricted_1.4.0-beta01.txt
new file mode 100644
index 0000000..6055b36a
--- /dev/null
+++ b/appcompat/appcompat/api/restricted_1.4.0-beta01.txt
@@ -0,0 +1,2242 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean closeOptionsMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean collapseActionView();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void dispatchMenuVisibilityChanged(boolean);
+ method public abstract android.view.View! getCustomView();
+ method @androidx.appcompat.app.ActionBar.DisplayOptions public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated @androidx.appcompat.app.ActionBar.NavigationMode public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invalidateOptionsMenu();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onConfigurationChanged(android.content.res.Configuration!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onKeyShortcut(int, android.view.KeyEvent!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onMenuKeyEvent(android.view.KeyEvent!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean openOptionsMenu();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDefaultDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int);
+ method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int, @androidx.appcompat.app.ActionBar.DisplayOptions int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(@androidx.appcompat.app.ActionBar.NavigationMode int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setShowHideAnimationEnabled(boolean);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setWindowTitle(CharSequence!);
+ method public abstract void show();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.ActionMode! startActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ @IntDef(flag=true, value={androidx.appcompat.app.ActionBar.DISPLAY_USE_LOGO, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_HOME, androidx.appcompat.app.ActionBar.DISPLAY_HOME_AS_UP, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_TITLE, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.DisplayOptions {
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ @IntDef({androidx.appcompat.app.ActionBar.NAVIGATION_MODE_STANDARD, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_LIST, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_TABS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.NavigationMode {
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setRecycleOnMeasureEnabled(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!, int, int, int, int);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method @androidx.appcompat.app.AppCompatDelegate.NightMode public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method @androidx.appcompat.app.AppCompatDelegate.NightMode public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ @IntDef({androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_TIME, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_UNSPECIFIED, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AppCompatDelegate.NightMode {
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ ctor public AppCompatDialogFragment(@LayoutRes int);
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar extends androidx.appcompat.app.ActionBar implements androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback {
+ ctor public WindowDecorActionBar(android.app.Activity!, boolean);
+ ctor public WindowDecorActionBar(android.app.Dialog!);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public WindowDecorActionBar(android.view.View!);
+ method public void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public void animateToMode(boolean);
+ method public void doHide(boolean);
+ method public void doShow(boolean);
+ method public void enableContentAnimations(boolean);
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getHeight();
+ method public int getNavigationItemCount();
+ method public int getNavigationMode();
+ method public int getSelectedNavigationIndex();
+ method public androidx.appcompat.app.ActionBar.Tab! getSelectedTab();
+ method public CharSequence! getSubtitle();
+ method public androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method public int getTabCount();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public void hide();
+ method public void hideForSystem();
+ method public boolean isShowing();
+ method public androidx.appcompat.app.ActionBar.Tab! newTab();
+ method public void onContentScrollStarted();
+ method public void onContentScrollStopped();
+ method public void onWindowVisibilityChanged(int);
+ method public void removeAllTabs();
+ method public void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method public void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void removeTabAt(int);
+ method public boolean requestFocus();
+ method public void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCustomView(int);
+ method public void setCustomView(android.view.View!);
+ method public void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public void setDisplayHomeAsUpEnabled(boolean);
+ method public void setDisplayOptions(int);
+ method public void setDisplayOptions(int, int);
+ method public void setDisplayShowCustomEnabled(boolean);
+ method public void setDisplayShowHomeEnabled(boolean);
+ method public void setDisplayShowTitleEnabled(boolean);
+ method public void setDisplayUseLogoEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setNavigationMode(int);
+ method public void setSelectedNavigationItem(int);
+ method public void setSubtitle(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(int);
+ method public void setTitle(CharSequence!);
+ method public void show();
+ method public void showForSystem();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.ActionModeImpl extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+ ctor public WindowDecorActionBar.ActionModeImpl(android.content.Context!, androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean dispatchOnCreate();
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.TabImpl extends androidx.appcompat.app.ActionBar.Tab {
+ ctor public WindowDecorActionBar.TabImpl();
+ method public androidx.appcompat.app.ActionBar.TabListener! getCallback();
+ method public CharSequence! getContentDescription();
+ method public android.view.View! getCustomView();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public int getPosition();
+ method public Object! getTag();
+ method public CharSequence! getText();
+ method public void select();
+ method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method public androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method public androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.ActionBar.Tab! setIcon(int);
+ method public void setPosition(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method public androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method public androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method public androidx.appcompat.app.ActionBar.Tab! setText(int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method @androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(@androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+ @IntDef({androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_LEFT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_RIGHT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_START, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface DrawerArrowDrawable.ArrowDirection {
+ }
+
+}
+
+package androidx.appcompat.text {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AllCapsTransformationMethod implements android.text.method.TransformationMethod {
+ ctor public AllCapsTransformationMethod(android.content.Context!);
+ method public CharSequence! getTransformation(CharSequence!, android.view.View!);
+ method public void onFocusChanged(android.view.View!, CharSequence!, boolean, int, android.graphics.Rect!);
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarPolicy {
+ method public boolean enableHomeButtonByDefault();
+ method public static androidx.appcompat.view.ActionBarPolicy! get(android.content.Context!);
+ method public int getEmbeddedMenuWidthLimit();
+ method public int getMaxActionButtons();
+ method public int getStackedTabMaxWidth();
+ method public int getTabContainerHeight();
+ method public boolean hasEmbeddedTabs();
+ method public boolean showsOverflowMenuButton();
+ }
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isUiFocusable();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StandaloneActionMode extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+ ctor public StandaloneActionMode(android.content.Context!, androidx.appcompat.widget.ActionBarContextView!, androidx.appcompat.view.ActionMode.Callback!, boolean);
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportActionModeWrapper extends android.view.ActionMode {
+ ctor public SupportActionModeWrapper(android.content.Context!, androidx.appcompat.view.ActionMode!);
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SupportActionModeWrapper.CallbackWrapper implements androidx.appcompat.view.ActionMode.Callback {
+ ctor public SupportActionModeWrapper.CallbackWrapper(android.content.Context!, android.view.ActionMode.Callback!);
+ method public android.view.ActionMode! getActionModeWrapper(androidx.appcompat.view.ActionMode!);
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportMenuInflater extends android.view.MenuInflater {
+ ctor public SupportMenuInflater(android.content.Context!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewPropertyAnimatorCompatSet {
+ ctor public ViewPropertyAnimatorCompatSet();
+ method public void cancel();
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! play(androidx.core.view.ViewPropertyAnimatorCompat!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! playSequentially(androidx.core.view.ViewPropertyAnimatorCompat!, androidx.core.view.ViewPropertyAnimatorCompat!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setDuration(long);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public void start();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowCallbackWrapper implements android.view.Window.Callback {
+ ctor public WindowCallbackWrapper(android.view.Window.Callback!);
+ method public boolean dispatchGenericMotionEvent(android.view.MotionEvent!);
+ method public boolean dispatchKeyEvent(android.view.KeyEvent!);
+ method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent!);
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent!);
+ method public boolean dispatchTouchEvent(android.view.MotionEvent!);
+ method public boolean dispatchTrackballEvent(android.view.MotionEvent!);
+ method public final android.view.Window.Callback! getWrapped();
+ method public void onActionModeFinished(android.view.ActionMode!);
+ method public void onActionModeStarted(android.view.ActionMode!);
+ method public void onAttachedToWindow();
+ method public void onContentChanged();
+ method public boolean onCreatePanelMenu(int, android.view.Menu!);
+ method public android.view.View! onCreatePanelView(int);
+ method public void onDetachedFromWindow();
+ method public boolean onMenuItemSelected(int, android.view.MenuItem!);
+ method public boolean onMenuOpened(int, android.view.Menu!);
+ method public void onPanelClosed(int, android.view.Menu!);
+ method public boolean onPreparePanel(int, android.view.View!, android.view.Menu!);
+ method @RequiresApi(23) public boolean onSearchRequested(android.view.SearchEvent!);
+ method public boolean onSearchRequested();
+ method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams!);
+ method public void onWindowFocusChanged(boolean);
+ method public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!);
+ method @RequiresApi(23) public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!, int);
+ }
+
+}
+
+package androidx.appcompat.view.menu {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItem implements androidx.core.internal.view.SupportMenuItem {
+ ctor public ActionMenuItem(android.content.Context!, int, int, int, int, CharSequence!);
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu! getSubMenu();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasSubMenu();
+ method public boolean invoke();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(android.view.View!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(int);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public androidx.appcompat.view.menu.ActionMenuItem! setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public androidx.core.internal.view.SupportMenuItem! setShowAsActionFlags(int);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItemView extends androidx.appcompat.widget.AppCompatTextView implements androidx.appcompat.widget.ActionMenuView.ActionMenuChildView androidx.appcompat.view.menu.MenuView.ItemView android.view.View.OnClickListener {
+ ctor public ActionMenuItemView(android.content.Context!);
+ ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public boolean hasText();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean needsDividerAfter();
+ method public boolean needsDividerBefore();
+ method public void onClick(android.view.View!);
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setExpandedFormat(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setItemInvoker(androidx.appcompat.view.menu.MenuBuilder.ItemInvoker!);
+ method public void setPopupCallback(androidx.appcompat.view.menu.ActionMenuItemView.PopupCallback!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ public abstract static class ActionMenuItemView.PopupCallback {
+ ctor public ActionMenuItemView.PopupCallback();
+ method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseMenuPresenter implements androidx.appcompat.view.menu.MenuPresenter {
+ ctor public BaseMenuPresenter(android.content.Context!, int, int);
+ method protected void addItemView(android.view.View!, int);
+ method public abstract void bindItemView(androidx.appcompat.view.menu.MenuItemImpl!, androidx.appcompat.view.menu.MenuView.ItemView!);
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public androidx.appcompat.view.menu.MenuView.ItemView! createItemView(android.view.ViewGroup!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method protected boolean filterLeftoverView(android.view.ViewGroup!, int);
+ method public boolean flagActionItems();
+ method public androidx.appcompat.view.menu.MenuPresenter.Callback! getCallback();
+ method public int getId();
+ method public android.view.View! getItemView(androidx.appcompat.view.menu.MenuItemImpl!, android.view.View!, android.view.ViewGroup!);
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setId(int);
+ method public boolean shouldIncludeItem(int, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public void updateMenuView(boolean);
+ field protected android.content.Context! mContext;
+ field protected android.view.LayoutInflater! mInflater;
+ field protected androidx.appcompat.view.menu.MenuBuilder! mMenu;
+ field protected androidx.appcompat.view.menu.MenuView! mMenuView;
+ field protected android.content.Context! mSystemContext;
+ field protected android.view.LayoutInflater! mSystemInflater;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ExpandedMenuView extends android.widget.ListView implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+ ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getWindowAnimations();
+ method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public void onItemClick(android.widget.AdapterView!, android.view.View!, int, long);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuItemView extends android.widget.LinearLayout implements android.widget.AbsListView.SelectionBoundsAdjuster androidx.appcompat.view.menu.MenuView.ItemView {
+ ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+ method public void adjustListItemSelectionBounds(android.graphics.Rect!);
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setForceShowIcon(boolean);
+ method public void setGroupDividerEnabled(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuPresenter implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuPresenter {
+ ctor public ListMenuPresenter(android.content.Context!, int);
+ ctor public ListMenuPresenter(int, int);
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean flagActionItems();
+ method public android.widget.ListAdapter! getAdapter();
+ method public int getId();
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onItemClick(android.widget.AdapterView<?>!, android.view.View!, int, long);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void restoreHierarchyState(android.os.Bundle!);
+ method public void saveHierarchyState(android.os.Bundle!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setId(int);
+ method public void setItemIndexOffset(int);
+ method public void updateMenuView(boolean);
+ field public static final String VIEWS_TAG = "android:menu:list";
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuAdapter extends android.widget.BaseAdapter {
+ ctor public MenuAdapter(androidx.appcompat.view.menu.MenuBuilder!, android.view.LayoutInflater!, boolean, int);
+ method public androidx.appcompat.view.menu.MenuBuilder! getAdapterMenu();
+ method public int getCount();
+ method public boolean getForceShowIcon();
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItem(int);
+ method public long getItemId(int);
+ method public android.view.View! getView(int, android.view.View!, android.view.ViewGroup!);
+ method public void setForceShowIcon(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuBuilder implements androidx.core.internal.view.SupportMenu {
+ ctor public MenuBuilder(android.content.Context!);
+ method public android.view.MenuItem! add(CharSequence!);
+ method public android.view.MenuItem! add(int);
+ method public android.view.MenuItem! add(int, int, int, CharSequence!);
+ method public android.view.MenuItem! add(int, int, int, int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+ method protected android.view.MenuItem! addInternal(int, int, int, CharSequence!);
+ method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+ method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!, android.content.Context!);
+ method public android.view.SubMenu! addSubMenu(CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int);
+ method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int, int, int, int);
+ method public void changeMenuMode();
+ method public void clear();
+ method public void clearAll();
+ method public void clearHeader();
+ method public final void close(boolean);
+ method public void close();
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public int findGroupIndex(int);
+ method public int findGroupIndex(int, int);
+ method public android.view.MenuItem! findItem(int);
+ method public int findItemIndex(int);
+ method public void flagActionItems();
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getActionItems();
+ method protected String! getActionViewStatesKey();
+ method public android.content.Context! getContext();
+ method public androidx.appcompat.view.menu.MenuItemImpl! getExpandedItem();
+ method public android.graphics.drawable.Drawable! getHeaderIcon();
+ method public CharSequence! getHeaderTitle();
+ method public android.view.View! getHeaderView();
+ method public android.view.MenuItem! getItem(int);
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getNonActionItems();
+ method public androidx.appcompat.view.menu.MenuBuilder! getRootMenu();
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!> getVisibleItems();
+ method public boolean hasVisibleItems();
+ method public boolean isGroupDividerEnabled();
+ method public boolean isShortcutKey(int, android.view.KeyEvent!);
+ method public boolean isShortcutsVisible();
+ method public void onItemsChanged(boolean);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performItemAction(android.view.MenuItem!, int);
+ method public boolean performItemAction(android.view.MenuItem!, androidx.appcompat.view.menu.MenuPresenter!, int);
+ method public boolean performShortcut(int, android.view.KeyEvent!, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void removeItemAt(int);
+ method public void removeMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+ method public void restoreActionViewStates(android.os.Bundle!);
+ method public void restorePresenterStates(android.os.Bundle!);
+ method public void saveActionViewStates(android.os.Bundle!);
+ method public void savePresenterStates(android.os.Bundle!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setCurrentMenuInfo(android.view.ContextMenu.ContextMenuInfo!);
+ method public androidx.appcompat.view.menu.MenuBuilder! setDefaultShowAsAction(int);
+ method public void setGroupCheckable(int, boolean, boolean);
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(android.graphics.drawable.Drawable!);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(int);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(CharSequence!);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(int);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderViewInt(android.view.View!);
+ method public void setOptionalIconsVisible(boolean);
+ method public void setOverrideVisibleItems(boolean);
+ method public void setQwertyMode(boolean);
+ method public void setShortcutsVisible(boolean);
+ method public int size();
+ method public void startDispatchingItemsChanged();
+ method public void stopDispatchingItemsChanged();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.Callback {
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.ItemInvoker {
+ method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class MenuItemImpl implements androidx.core.internal.view.SupportMenuItem {
+ method public void actionFormatChanged();
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public int getOrdering();
+ method public android.view.SubMenu! getSubMenu();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasCollapsibleActionView();
+ method public boolean hasSubMenu();
+ method public boolean invoke();
+ method public boolean isActionButton();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isExclusiveCheckable();
+ method public boolean isVisible();
+ method public boolean requestsActionButton();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(android.view.View!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(int);
+ method public void setActionViewExpanded(boolean);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCallback(Runnable!);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public void setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public void setIsActionButton(boolean);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public androidx.core.internal.view.SupportMenuItem! setShowAsActionFlags(int);
+ method public void setSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ method public boolean shouldShowIcon();
+ method public boolean showsTextAsAction();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuItemWrapperICS implements android.view.MenuItem {
+ ctor public MenuItemWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenuItem!);
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu! getSubMenu();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasSubMenu();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public android.view.MenuItem! setActionView(android.view.View!);
+ method public android.view.MenuItem! setActionView(int);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public void setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public android.view.MenuItem! setShowAsActionFlags(int);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupHelper {
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public int getGravity();
+ method public android.widget.ListView! getListView();
+ method public boolean isShowing();
+ method protected void onDismiss();
+ method public void setAnchorView(android.view.View);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setPresenterCallback(androidx.appcompat.view.menu.MenuPresenter.Callback?);
+ method public void show();
+ method public void show(int, int);
+ method public boolean tryShow();
+ method public boolean tryShow(int, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuPresenter {
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean flagActionItems();
+ method public int getId();
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void updateMenuView(boolean);
+ }
+
+ public static interface MenuPresenter.Callback {
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder, boolean);
+ method public boolean onOpenSubMenu(androidx.appcompat.view.menu.MenuBuilder);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuView {
+ method public int getWindowAnimations();
+ method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ }
+
+ public static interface MenuView.ItemView {
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setEnabled(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuWrapperICS implements android.view.Menu {
+ ctor public MenuWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenu!);
+ method public android.view.MenuItem! add(CharSequence!);
+ method public android.view.MenuItem! add(int);
+ method public android.view.MenuItem! add(int, int, int, CharSequence!);
+ method public android.view.MenuItem! add(int, int, int, int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+ method public android.view.SubMenu! addSubMenu(CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int);
+ method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int, int, int, int);
+ method public void clear();
+ method public void close();
+ method public android.view.MenuItem! findItem(int);
+ method public android.view.MenuItem! getItem(int);
+ method public boolean hasVisibleItems();
+ method public boolean isShortcutKey(int, android.view.KeyEvent!);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performShortcut(int, android.view.KeyEvent!, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void setGroupCheckable(int, boolean, boolean);
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method public void setQwertyMode(boolean);
+ method public int size();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ShowableListMenu {
+ method public void dismiss();
+ method public android.widget.ListView! getListView();
+ method public boolean isShowing();
+ method public void show();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SubMenuBuilder extends androidx.appcompat.view.menu.MenuBuilder implements android.view.SubMenu {
+ ctor public SubMenuBuilder(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public String! getActionViewStatesKey();
+ method public android.view.MenuItem! getItem();
+ method public android.view.Menu! getParentMenu();
+ method public boolean isQwertyMode();
+ method public android.view.SubMenu! setHeaderIcon(android.graphics.drawable.Drawable!);
+ method public android.view.SubMenu! setHeaderIcon(int);
+ method public android.view.SubMenu! setHeaderTitle(CharSequence!);
+ method public android.view.SubMenu! setHeaderTitle(int);
+ method public android.view.SubMenu! setHeaderView(android.view.View!);
+ method public android.view.SubMenu! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.SubMenu! setIcon(int);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContainer extends android.widget.FrameLayout {
+ ctor public ActionBarContainer(android.content.Context!);
+ ctor public ActionBarContainer(android.content.Context!, android.util.AttributeSet!);
+ method public android.view.View! getTabContainer();
+ method public void onFinishInflate();
+ method public void onLayout(boolean, int, int, int, int);
+ method public void onMeasure(int, int);
+ method public void setPrimaryBackground(android.graphics.drawable.Drawable!);
+ method public void setSplitBackground(android.graphics.drawable.Drawable!);
+ method public void setStackedBackground(android.graphics.drawable.Drawable!);
+ method public void setTabContainer(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setTransitioning(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContextView extends android.view.ViewGroup {
+ ctor public ActionBarContextView(android.content.Context);
+ ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?);
+ ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?, int);
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void closeMode();
+ method public void dismissPopupMenus();
+ method public int getAnimatedVisibility();
+ method public int getContentHeight();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public boolean hideOverflowMenu();
+ method public void initForMode(androidx.appcompat.view.ActionMode!);
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isOverflowReserved();
+ method public boolean isTitleOptional();
+ method public void killMode();
+ method public void onDetachedFromWindow();
+ method public void postShowOverflowMenu();
+ method public void setContentHeight(int);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setTitleOptional(boolean);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarOverlayLayout extends android.view.ViewGroup implements androidx.appcompat.widget.DecorContentParent androidx.core.view.NestedScrollingParent androidx.core.view.NestedScrollingParent2 androidx.core.view.NestedScrollingParent3 {
+ ctor public ActionBarOverlayLayout(android.content.Context);
+ ctor public ActionBarOverlayLayout(android.content.Context, android.util.AttributeSet?);
+ method public boolean canShowOverflowMenu();
+ method public void dismissPopups();
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method protected androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method public int getActionBarHideOffset();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initFeature(int);
+ method public boolean isHideOnContentScrollEnabled();
+ method public boolean isInOverlayMode();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public void onNestedPreScroll(android.view.View!, int, int, int[]!, int);
+ method public void onNestedScroll(android.view.View!, int, int, int, int, int, int[]!);
+ method public void onNestedScroll(android.view.View!, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View!, android.view.View!, int, int);
+ method public boolean onStartNestedScroll(android.view.View!, android.view.View!, int, int);
+ method public void onStopNestedScroll(android.view.View!, int);
+ method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setActionBarHideOffset(int);
+ method public void setActionBarVisibilityCallback(androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback!);
+ method public void setHasNonEmbeddedTabs(boolean);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuPrepared();
+ method public void setOverlayMode(boolean);
+ method public void setShowingForActionMode(boolean);
+ method public void setUiOptions(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public boolean showOverflowMenu();
+ }
+
+ public static interface ActionBarOverlayLayout.ActionBarVisibilityCallback {
+ method public void enableContentAnimations(boolean);
+ method public void hideForSystem();
+ method public void onContentScrollStarted();
+ method public void onContentScrollStopped();
+ method public void onWindowVisibilityChanged(int);
+ method public void showForSystem();
+ }
+
+ public static class ActionBarOverlayLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBarOverlayLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionBarOverlayLayout.LayoutParams(int, int);
+ ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateOverflowButtonLayoutParams();
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getWindowAnimations();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected boolean hasSupportDividerBeforeChildAt(int);
+ method public boolean hideOverflowMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowReserved();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.menu.MenuBuilder! peekMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExpandedActionViewsExclusive(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverflowReserved(boolean);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionMenuView.ActionMenuChildView {
+ method public boolean needsDividerAfter();
+ method public boolean needsDividerBefore();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field public int cellsUsed;
+ field public boolean expandable;
+ field public int extraPixels;
+ field public boolean isOverflowButton;
+ field public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActivityChooserView extends android.view.ViewGroup {
+ ctor public ActivityChooserView(android.content.Context);
+ ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?);
+ ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean dismissPopup();
+ method public boolean isShowingPopup();
+ method public void setDefaultActionButtonContentDescription(int);
+ method public void setExpandActivityOverflowButtonContentDescription(int);
+ method public void setExpandActivityOverflowButtonDrawable(android.graphics.drawable.Drawable!);
+ method public void setInitialActivityCount(int);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setProvider(androidx.core.view.ActionProvider!);
+ method public boolean showPopup();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ActivityChooserView.InnerLayout extends android.widget.LinearLayout {
+ ctor public ActivityChooserView.InnerLayout(android.content.Context!, android.util.AttributeSet!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AlertDialogLayout extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public AlertDialogLayout(android.content.Context?);
+ ctor public AlertDialogLayout(android.content.Context?, android.util.AttributeSet?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class AppCompatDrawableManager {
+ ctor public AppCompatDrawableManager();
+ method public static androidx.appcompat.widget.AppCompatDrawableManager! get();
+ method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+ method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+ method public void onConfigurationChanged(android.content.Context);
+ method public static void preload();
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AppCompatImageHelper {
+ ctor public AppCompatImageHelper(android.widget.ImageView);
+ method public void loadFromAttributes(android.util.AttributeSet!, int);
+ method public void setImageResource(int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ButtonBarLayout extends android.widget.LinearLayout {
+ ctor public ButtonBarLayout(android.content.Context, android.util.AttributeSet?);
+ method public void setAllowStacking(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorContentParent {
+ method public boolean canShowOverflowMenu();
+ method public void dismissPopups();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initFeature(int);
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuPrepared();
+ method public void setUiOptions(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorToolbar {
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method public android.content.Context! getContext();
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getDropdownItemCount();
+ method public int getDropdownSelectedPosition();
+ method public int getHeight();
+ method public android.view.Menu! getMenu();
+ method public int getNavigationMode();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public android.view.ViewGroup! getViewGroup();
+ method public int getVisibility();
+ method public boolean hasEmbeddedTabs();
+ method public boolean hasExpandedActionView();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initIndeterminateProgress();
+ method public void initProgress();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isTitleTruncated();
+ method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCollapsible(boolean);
+ method public void setCustomView(android.view.View!);
+ method public void setDefaultNavigationContentDescription(int);
+ method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setDisplayOptions(int);
+ method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+ method public void setDropdownSelectedPosition(int);
+ method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setHomeButtonEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setMenuPrepared();
+ method public void setNavigationContentDescription(CharSequence!);
+ method public void setNavigationContentDescription(int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setNavigationIcon(int);
+ method public void setNavigationMode(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setVisibility(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DialogTitle extends androidx.appcompat.widget.AppCompatTextView {
+ ctor public DialogTitle(android.content.Context, android.util.AttributeSet?, int);
+ ctor public DialogTitle(android.content.Context, android.util.AttributeSet?);
+ ctor public DialogTitle(android.content.Context);
+ }
+
+ public interface EmojiCompatConfigurationView {
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsFrameLayout extends android.widget.FrameLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+ ctor public FitWindowsFrameLayout(android.content.Context);
+ ctor public FitWindowsFrameLayout(android.content.Context, android.util.AttributeSet?);
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsLinearLayout extends android.widget.LinearLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+ ctor public FitWindowsLinearLayout(android.content.Context);
+ ctor public FitWindowsLinearLayout(android.content.Context, android.util.AttributeSet?);
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface FitWindowsViewGroup {
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ public static interface FitWindowsViewGroup.OnFitSystemWindowsListener {
+ method public void onFitSystemWindows(android.graphics.Rect!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ForwardingListener implements android.view.View.OnAttachStateChangeListener android.view.View.OnTouchListener {
+ ctor public ForwardingListener(android.view.View!);
+ method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+ method protected boolean onForwardingStarted();
+ method protected boolean onForwardingStopped();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
+ method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+ method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+ method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+ method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(@GravityInt int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(@androidx.appcompat.widget.LinearLayoutCompat.OrientationMode int);
+ method public void setShowDividers(@androidx.appcompat.widget.LinearLayoutCompat.DividerMode int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ @IntDef(flag=true, value={androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_NONE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_BEGINNING, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_MIDDLE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.DividerMode {
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ @IntDef({androidx.appcompat.widget.LinearLayoutCompat.HORIZONTAL, androidx.appcompat.widget.LinearLayoutCompat.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.OrientationMode {
+ }
+
+ public class ListPopupWindow implements androidx.appcompat.view.menu.ShowableListMenu {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isDropDownAlwaysVisible();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDropDownAlwaysVisible(boolean);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setForceIgnoreOutsideTouch(boolean);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverlapAnchor(boolean);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuItemHoverListener {
+ method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupWindow extends androidx.appcompat.widget.ListPopupWindow implements androidx.appcompat.widget.MenuItemHoverListener {
+ ctor public MenuPopupWindow(android.content.Context, android.util.AttributeSet?, int, int);
+ method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void setEnterTransition(Object!);
+ method public void setExitTransition(Object!);
+ method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+ method public void setTouchModal(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class MenuPopupWindow.MenuDropDownListView extends android.widget.ListView {
+ ctor public MenuPopupWindow.MenuDropDownListView(android.content.Context!, boolean);
+ method public void clearSelection();
+ method public int lookForSelectablePosition(int, boolean);
+ method public int measureHeightOfChildrenCompat(int, int, int, int, int);
+ method public boolean onForwardedEvent(android.view.MotionEvent!, int);
+ method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+ field public static final int INVALID_POSITION = -1; // 0xffffffff
+ field public static final int NO_POSITION = -1; // 0xffffffff
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ScrollingTabContainerView extends android.widget.HorizontalScrollView implements android.widget.AdapterView.OnItemSelectedListener {
+ ctor public ScrollingTabContainerView(android.content.Context);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public void animateToTab(int);
+ method public void animateToVisibility(int);
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void onItemSelected(android.widget.AdapterView<?>!, android.view.View!, int, long);
+ method public void onMeasure(int, int);
+ method public void onNothingSelected(android.widget.AdapterView<?>!);
+ method public void removeAllTabs();
+ method public void removeTabAt(int);
+ method public void setAllowCollapse(boolean);
+ method public void setContentHeight(int);
+ method public void setTabSelected(int);
+ method public void updateTab(int);
+ field protected final androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! mVisAnimListener;
+ field protected android.view.ViewPropertyAnimator! mVisibilityAnim;
+ }
+
+ protected class ScrollingTabContainerView.VisibilityAnimListener extends android.animation.AnimatorListenerAdapter {
+ ctor protected ScrollingTabContainerView.VisibilityAnimListener();
+ method public androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! withFinalVisibility(android.view.ViewPropertyAnimator!, int);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+ method public int getInputType();
+ method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAppSearchData(android.os.Bundle!);
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SearchView.SearchAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
+ ctor public SearchView.SearchAutoComplete(android.content.Context!);
+ ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!);
+ ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!, int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+ method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void onMeasure(int, int);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintTypedArray {
+ method public boolean getBoolean(int, boolean);
+ method @RequiresApi(21) public int getChangingConfigurations();
+ method public int getColor(int, int);
+ method public android.content.res.ColorStateList! getColorStateList(int);
+ method public float getDimension(int, float);
+ method public int getDimensionPixelOffset(int, int);
+ method public int getDimensionPixelSize(int, int);
+ method public android.graphics.drawable.Drawable! getDrawable(int);
+ method public android.graphics.drawable.Drawable! getDrawableIfKnown(int);
+ method public float getFloat(int, float);
+ method public android.graphics.Typeface? getFont(@StyleableRes int, int, androidx.core.content.res.ResourcesCompat.FontCallback?);
+ method public float getFraction(int, int, int, float);
+ method public int getIndex(int);
+ method public int getIndexCount();
+ method public int getInt(int, int);
+ method public int getInteger(int, int);
+ method public int getLayoutDimension(int, String!);
+ method public int getLayoutDimension(int, int);
+ method public String! getNonResourceString(int);
+ method public String! getPositionDescription();
+ method public int getResourceId(int, int);
+ method public android.content.res.Resources! getResources();
+ method public String! getString(int);
+ method public CharSequence! getText(int);
+ method public CharSequence![]! getTextArray(int);
+ method public int getType(int);
+ method public boolean getValue(int, android.util.TypedValue!);
+ method public android.content.res.TypedArray! getWrappedTypeArray();
+ method public boolean hasValue(int);
+ method public int length();
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!);
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!, int, int);
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, int, int[]!);
+ method public android.util.TypedValue! peekValue(int);
+ method public void recycle();
+ }
+
+ public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.DecorToolbar! getWrapper();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @MainThread public void invalidateMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+ method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setCollapsible(boolean);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ToolbarWidgetWrapper implements androidx.appcompat.widget.DecorToolbar {
+ ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean);
+ ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean, int, int);
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method public android.content.Context! getContext();
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getDropdownItemCount();
+ method public int getDropdownSelectedPosition();
+ method public int getHeight();
+ method public android.view.Menu! getMenu();
+ method public int getNavigationMode();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public android.view.ViewGroup! getViewGroup();
+ method public int getVisibility();
+ method public boolean hasEmbeddedTabs();
+ method public boolean hasExpandedActionView();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initIndeterminateProgress();
+ method public void initProgress();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isTitleTruncated();
+ method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCollapsible(boolean);
+ method public void setCustomView(android.view.View!);
+ method public void setDefaultNavigationContentDescription(int);
+ method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setDisplayOptions(int);
+ method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+ method public void setDropdownSelectedPosition(int);
+ method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setHomeButtonEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setMenuPrepared();
+ method public void setNavigationContentDescription(CharSequence!);
+ method public void setNavigationContentDescription(int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setNavigationIcon(int);
+ method public void setNavigationMode(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setVisibility(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewStubCompat extends android.view.View {
+ ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?, int);
+ method public int getInflatedId();
+ method public android.view.LayoutInflater! getLayoutInflater();
+ method public int getLayoutResource();
+ method public android.view.View! inflate();
+ method public void setInflatedId(int);
+ method public void setLayoutInflater(android.view.LayoutInflater!);
+ method public void setLayoutResource(int);
+ method public void setOnInflateListener(androidx.appcompat.widget.ViewStubCompat.OnInflateListener!);
+ }
+
+ public static interface ViewStubCompat.OnInflateListener {
+ method public void onInflate(androidx.appcompat.widget.ViewStubCompat!, android.view.View!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewUtils {
+ method public static void computeFitSystemWindows(android.view.View!, android.graphics.Rect!, android.graphics.Rect!);
+ method public static boolean isLayoutRtl(android.view.View!);
+ method public static void makeOptionalFitsSystemWindows(android.view.View!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WithHint {
+ method public CharSequence? getHint();
+ }
+
+}
+
diff --git a/appcompat/appcompat/api/restricted_1.4.0-beta02.txt b/appcompat/appcompat/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..6055b36a
--- /dev/null
+++ b/appcompat/appcompat/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,2242 @@
+// Signature format: 4.0
+package androidx.appcompat.app {
+
+ public abstract class ActionBar {
+ ctor public ActionBar();
+ method public abstract void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method @Deprecated public abstract void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean closeOptionsMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean collapseActionView();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void dispatchMenuVisibilityChanged(boolean);
+ method public abstract android.view.View! getCustomView();
+ method @androidx.appcompat.app.ActionBar.DisplayOptions public abstract int getDisplayOptions();
+ method public float getElevation();
+ method public abstract int getHeight();
+ method public int getHideOffset();
+ method @Deprecated public abstract int getNavigationItemCount();
+ method @Deprecated @androidx.appcompat.app.ActionBar.NavigationMode public abstract int getNavigationMode();
+ method @Deprecated public abstract int getSelectedNavigationIndex();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab? getSelectedTab();
+ method public abstract CharSequence? getSubtitle();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method @Deprecated public abstract int getTabCount();
+ method public android.content.Context! getThemedContext();
+ method public abstract CharSequence? getTitle();
+ method public abstract void hide();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invalidateOptionsMenu();
+ method public boolean isHideOnContentScrollEnabled();
+ method public abstract boolean isShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! newTab();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void onConfigurationChanged(android.content.res.Configuration!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onKeyShortcut(int, android.view.KeyEvent!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean onMenuKeyEvent(android.view.KeyEvent!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean openOptionsMenu();
+ method @Deprecated public abstract void removeAllTabs();
+ method public abstract void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method @Deprecated public abstract void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method @Deprecated public abstract void removeTabAt(int);
+ method @Deprecated public abstract void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public abstract void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public abstract void setCustomView(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDefaultDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayHomeAsUpEnabled(boolean);
+ method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int);
+ method public abstract void setDisplayOptions(@androidx.appcompat.app.ActionBar.DisplayOptions int, @androidx.appcompat.app.ActionBar.DisplayOptions int);
+ method public abstract void setDisplayShowCustomEnabled(boolean);
+ method public abstract void setDisplayShowHomeEnabled(boolean);
+ method public abstract void setDisplayShowTitleEnabled(boolean);
+ method public abstract void setDisplayUseLogoEnabled(boolean);
+ method public void setElevation(float);
+ method public void setHideOffset(int);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setHomeActionContentDescription(CharSequence?);
+ method public void setHomeActionContentDescription(@StringRes int);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable?);
+ method public void setHomeAsUpIndicator(@DrawableRes int);
+ method public void setHomeButtonEnabled(boolean);
+ method public abstract void setIcon(@DrawableRes int);
+ method public abstract void setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public abstract void setLogo(@DrawableRes int);
+ method public abstract void setLogo(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract void setNavigationMode(@androidx.appcompat.app.ActionBar.NavigationMode int);
+ method @Deprecated public abstract void setSelectedNavigationItem(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setShowHideAnimationEnabled(boolean);
+ method public void setSplitBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setStackedBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(@StringRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setWindowTitle(CharSequence!);
+ method public abstract void show();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.ActionMode! startActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ field public static final int DISPLAY_HOME_AS_UP = 4; // 0x4
+ field public static final int DISPLAY_SHOW_CUSTOM = 16; // 0x10
+ field public static final int DISPLAY_SHOW_HOME = 2; // 0x2
+ field public static final int DISPLAY_SHOW_TITLE = 8; // 0x8
+ field public static final int DISPLAY_USE_LOGO = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_LIST = 1; // 0x1
+ field @Deprecated public static final int NAVIGATION_MODE_STANDARD = 0; // 0x0
+ field @Deprecated public static final int NAVIGATION_MODE_TABS = 2; // 0x2
+ }
+
+ @IntDef(flag=true, value={androidx.appcompat.app.ActionBar.DISPLAY_USE_LOGO, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_HOME, androidx.appcompat.app.ActionBar.DISPLAY_HOME_AS_UP, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_TITLE, androidx.appcompat.app.ActionBar.DISPLAY_SHOW_CUSTOM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.DisplayOptions {
+ }
+
+ public static class ActionBar.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public ActionBar.LayoutParams(int, int);
+ ctor public ActionBar.LayoutParams(int, int, int);
+ ctor public ActionBar.LayoutParams(int);
+ ctor public ActionBar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public ActionBar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ field public int gravity;
+ }
+
+ @IntDef({androidx.appcompat.app.ActionBar.NAVIGATION_MODE_STANDARD, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_LIST, androidx.appcompat.app.ActionBar.NAVIGATION_MODE_TABS}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ActionBar.NavigationMode {
+ }
+
+ public static interface ActionBar.OnMenuVisibilityListener {
+ method public void onMenuVisibilityChanged(boolean);
+ }
+
+ @Deprecated public static interface ActionBar.OnNavigationListener {
+ method @Deprecated public boolean onNavigationItemSelected(int, long);
+ }
+
+ @Deprecated public abstract static class ActionBar.Tab {
+ ctor @Deprecated public ActionBar.Tab();
+ method @Deprecated public abstract CharSequence! getContentDescription();
+ method @Deprecated public abstract android.view.View! getCustomView();
+ method @Deprecated public abstract android.graphics.drawable.Drawable! getIcon();
+ method @Deprecated public abstract int getPosition();
+ method @Deprecated public abstract Object! getTag();
+ method @Deprecated public abstract CharSequence! getText();
+ method @Deprecated public abstract void select();
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(@StringRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setIcon(@DrawableRes int);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method @Deprecated public abstract androidx.appcompat.app.ActionBar.Tab! setText(int);
+ field @Deprecated public static final int INVALID_POSITION = -1; // 0xffffffff
+ }
+
+ @Deprecated public static interface ActionBar.TabListener {
+ method @Deprecated public void onTabReselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabSelected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ method @Deprecated public void onTabUnselected(androidx.appcompat.app.ActionBar.Tab!, androidx.fragment.app.FragmentTransaction!);
+ }
+
+ public class ActionBarDrawerToggle implements androidx.drawerlayout.widget.DrawerLayout.DrawerListener {
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, @StringRes int, @StringRes int);
+ ctor public ActionBarDrawerToggle(android.app.Activity!, androidx.drawerlayout.widget.DrawerLayout!, androidx.appcompat.widget.Toolbar!, @StringRes int, @StringRes int);
+ method public androidx.appcompat.graphics.drawable.DrawerArrowDrawable getDrawerArrowDrawable();
+ method public android.view.View.OnClickListener! getToolbarNavigationClickListener();
+ method public boolean isDrawerIndicatorEnabled();
+ method public boolean isDrawerSlideAnimationEnabled();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDrawerClosed(android.view.View!);
+ method public void onDrawerOpened(android.view.View!);
+ method public void onDrawerSlide(android.view.View!, float);
+ method public void onDrawerStateChanged(int);
+ method public boolean onOptionsItemSelected(android.view.MenuItem!);
+ method public void setDrawerArrowDrawable(androidx.appcompat.graphics.drawable.DrawerArrowDrawable);
+ method public void setDrawerIndicatorEnabled(boolean);
+ method public void setDrawerSlideAnimationEnabled(boolean);
+ method public void setHomeAsUpIndicator(android.graphics.drawable.Drawable!);
+ method public void setHomeAsUpIndicator(int);
+ method public void setToolbarNavigationClickListener(android.view.View.OnClickListener!);
+ method public void syncState();
+ }
+
+ public static interface ActionBarDrawerToggle.Delegate {
+ method public android.content.Context! getActionBarThemedContext();
+ method public android.graphics.drawable.Drawable! getThemeUpIndicator();
+ method public boolean isNavigationVisible();
+ method public void setActionBarDescription(@StringRes int);
+ method public void setActionBarUpIndicator(android.graphics.drawable.Drawable!, @StringRes int);
+ }
+
+ public static interface ActionBarDrawerToggle.DelegateProvider {
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ }
+
+ public class AlertDialog extends androidx.appcompat.app.AppCompatDialog implements android.content.DialogInterface {
+ ctor protected AlertDialog(android.content.Context);
+ ctor protected AlertDialog(android.content.Context, @StyleRes int);
+ ctor protected AlertDialog(android.content.Context, boolean, android.content.DialogInterface.OnCancelListener?);
+ method public android.widget.Button! getButton(int);
+ method public android.widget.ListView! getListView();
+ method public void setButton(int, CharSequence!, android.os.Message!);
+ method public void setButton(int, CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public void setButton(int, CharSequence!, android.graphics.drawable.Drawable!, android.content.DialogInterface.OnClickListener!);
+ method public void setCustomTitle(android.view.View!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setIconAttribute(int);
+ method public void setMessage(CharSequence!);
+ method public void setView(android.view.View!);
+ method public void setView(android.view.View!, int, int, int, int);
+ }
+
+ public static class AlertDialog.Builder {
+ ctor public AlertDialog.Builder(android.content.Context);
+ ctor public AlertDialog.Builder(android.content.Context, @StyleRes int);
+ method public androidx.appcompat.app.AlertDialog create();
+ method public android.content.Context getContext();
+ method public androidx.appcompat.app.AlertDialog.Builder! setAdapter(android.widget.ListAdapter!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCancelable(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCursor(android.database.Cursor!, android.content.DialogInterface.OnClickListener!, String!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setCustomTitle(android.view.View?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(@DrawableRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIcon(android.graphics.drawable.Drawable?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setIconAttribute(@AttrRes int);
+ method @Deprecated public androidx.appcompat.app.AlertDialog.Builder! setInverseBackgroundForced(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(@ArrayRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setItems(CharSequence![]!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMessage(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(@ArrayRes int, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(CharSequence![]!, boolean[]!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setMultiChoiceItems(android.database.Cursor!, String!, String!, android.content.DialogInterface.OnMultiChoiceClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNegativeButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setNeutralButtonIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnCancelListener(android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnDismissListener(android.content.DialogInterface.OnDismissListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setOnKeyListener(android.content.DialogInterface.OnKeyListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(@StringRes int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButton(CharSequence!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setPositiveButtonIcon(android.graphics.drawable.Drawable!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setRecycleOnMeasureEnabled(boolean);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(@ArrayRes int, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.database.Cursor!, int, String!, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(CharSequence![]!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setSingleChoiceItems(android.widget.ListAdapter!, int, android.content.DialogInterface.OnClickListener!);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(@StringRes int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setTitle(CharSequence?);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(int);
+ method public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.app.AlertDialog.Builder! setView(android.view.View!, int, int, int, int);
+ method public androidx.appcompat.app.AlertDialog! show();
+ }
+
+ public class AppCompatActivity extends androidx.fragment.app.FragmentActivity implements androidx.appcompat.app.ActionBarDrawerToggle.DelegateProvider androidx.appcompat.app.AppCompatCallback androidx.core.app.TaskStackBuilder.SupportParentable {
+ ctor public AppCompatActivity();
+ ctor @ContentView public AppCompatActivity(@LayoutRes int);
+ method public androidx.appcompat.app.AppCompatDelegate getDelegate();
+ method public androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method public androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public android.content.Intent? getSupportParentActivityIntent();
+ method public void onCreateSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method public final boolean onMenuItemSelected(int, android.view.MenuItem);
+ method protected void onNightModeChanged(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public void onPrepareSupportNavigateUpTaskStack(androidx.core.app.TaskStackBuilder);
+ method @CallSuper public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode);
+ method @CallSuper public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode);
+ method @Deprecated public void onSupportContentChanged();
+ method public boolean onSupportNavigateUp();
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method @Deprecated public void setSupportProgress(int);
+ method @Deprecated public void setSupportProgressBarIndeterminate(boolean);
+ method @Deprecated public void setSupportProgressBarIndeterminateVisibility(boolean);
+ method @Deprecated public void setSupportProgressBarVisibility(boolean);
+ method public androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ method public void supportInvalidateOptionsMenu();
+ method public void supportNavigateUpTo(android.content.Intent);
+ method public boolean supportRequestWindowFeature(int);
+ method public boolean supportShouldUpRecreateTask(android.content.Intent);
+ }
+
+ public interface AppCompatCallback {
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ }
+
+ public abstract class AppCompatDelegate {
+ method public abstract void addContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public abstract boolean applyDayNight();
+ method @Deprecated public void attachBaseContext(android.content.Context!);
+ method @CallSuper public android.content.Context attachBaseContext2(android.content.Context);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.app.Dialog, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.view.Window, androidx.appcompat.app.AppCompatCallback?);
+ method public static androidx.appcompat.app.AppCompatDelegate create(android.content.Context, android.app.Activity, androidx.appcompat.app.AppCompatCallback?);
+ method public abstract android.view.View! createView(android.view.View?, String!, android.content.Context, android.util.AttributeSet);
+ method public abstract <T extends android.view.View> T! findViewById(@IdRes int);
+ method @androidx.appcompat.app.AppCompatDelegate.NightMode public static int getDefaultNightMode();
+ method public abstract androidx.appcompat.app.ActionBarDrawerToggle.Delegate? getDrawerToggleDelegate();
+ method @androidx.appcompat.app.AppCompatDelegate.NightMode public int getLocalNightMode();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract androidx.appcompat.app.ActionBar? getSupportActionBar();
+ method public abstract boolean hasWindowFeature(int);
+ method public abstract void installViewFactory();
+ method public abstract void invalidateOptionsMenu();
+ method public static boolean isCompatVectorFromResourcesEnabled();
+ method public abstract boolean isHandleNativeActionModesEnabled();
+ method public abstract void onConfigurationChanged(android.content.res.Configuration!);
+ method public abstract void onCreate(android.os.Bundle!);
+ method public abstract void onDestroy();
+ method public abstract void onPostCreate(android.os.Bundle!);
+ method public abstract void onPostResume();
+ method public abstract void onSaveInstanceState(android.os.Bundle!);
+ method public abstract void onStart();
+ method public abstract void onStop();
+ method public abstract boolean requestWindowFeature(int);
+ method public static void setCompatVectorFromResourcesEnabled(boolean);
+ method public abstract void setContentView(android.view.View!);
+ method public abstract void setContentView(@LayoutRes int);
+ method public abstract void setContentView(android.view.View!, android.view.ViewGroup.LayoutParams!);
+ method public static void setDefaultNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public abstract void setHandleNativeActionModesEnabled(boolean);
+ method @RequiresApi(17) public abstract void setLocalNightMode(@androidx.appcompat.app.AppCompatDelegate.NightMode int);
+ method public abstract void setSupportActionBar(androidx.appcompat.widget.Toolbar?);
+ method public void setTheme(@StyleRes int);
+ method public abstract void setTitle(CharSequence?);
+ method public abstract androidx.appcompat.view.ActionMode? startSupportActionMode(androidx.appcompat.view.ActionMode.Callback);
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ field public static final int FEATURE_SUPPORT_ACTION_BAR = 108; // 0x6c
+ field public static final int FEATURE_SUPPORT_ACTION_BAR_OVERLAY = 109; // 0x6d
+ field @Deprecated public static final int MODE_NIGHT_AUTO = 0; // 0x0
+ field public static final int MODE_NIGHT_AUTO_BATTERY = 3; // 0x3
+ field @Deprecated public static final int MODE_NIGHT_AUTO_TIME = 0; // 0x0
+ field public static final int MODE_NIGHT_FOLLOW_SYSTEM = -1; // 0xffffffff
+ field public static final int MODE_NIGHT_NO = 1; // 0x1
+ field public static final int MODE_NIGHT_UNSPECIFIED = -100; // 0xffffff9c
+ field public static final int MODE_NIGHT_YES = 2; // 0x2
+ }
+
+ @IntDef({androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_NO, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_YES, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_TIME, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_FOLLOW_SYSTEM, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_UNSPECIFIED, androidx.appcompat.app.AppCompatDelegate.MODE_NIGHT_AUTO_BATTERY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AppCompatDelegate.NightMode {
+ }
+
+ public class AppCompatDialog extends android.app.Dialog implements androidx.appcompat.app.AppCompatCallback {
+ ctor public AppCompatDialog(android.content.Context!);
+ ctor public AppCompatDialog(android.content.Context!, int);
+ ctor protected AppCompatDialog(android.content.Context!, boolean, android.content.DialogInterface.OnCancelListener!);
+ method public androidx.appcompat.app.AppCompatDelegate! getDelegate();
+ method public androidx.appcompat.app.ActionBar! getSupportActionBar();
+ method public void onSupportActionModeFinished(androidx.appcompat.view.ActionMode!);
+ method public void onSupportActionModeStarted(androidx.appcompat.view.ActionMode!);
+ method public androidx.appcompat.view.ActionMode? onWindowStartingSupportActionMode(androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean supportRequestWindowFeature(int);
+ }
+
+ public class AppCompatDialogFragment extends androidx.fragment.app.DialogFragment {
+ ctor public AppCompatDialogFragment();
+ ctor public AppCompatDialogFragment(@LayoutRes int);
+ }
+
+ public class AppCompatViewInflater {
+ ctor public AppCompatViewInflater();
+ method protected androidx.appcompat.widget.AppCompatAutoCompleteTextView createAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatButton createButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckBox createCheckBox(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatCheckedTextView createCheckedTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatEditText createEditText(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageButton createImageButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatImageView createImageView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRadioButton createRadioButton(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatRatingBar createRatingBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSeekBar createSeekBar(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatSpinner createSpinner(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatTextView createTextView(android.content.Context!, android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.AppCompatToggleButton createToggleButton(android.content.Context!, android.util.AttributeSet!);
+ method protected android.view.View? createView(android.content.Context!, String!, android.util.AttributeSet!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar extends androidx.appcompat.app.ActionBar implements androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback {
+ ctor public WindowDecorActionBar(android.app.Activity!, boolean);
+ ctor public WindowDecorActionBar(android.app.Dialog!);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public WindowDecorActionBar(android.view.View!);
+ method public void addOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public void animateToMode(boolean);
+ method public void doHide(boolean);
+ method public void doShow(boolean);
+ method public void enableContentAnimations(boolean);
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getHeight();
+ method public int getNavigationItemCount();
+ method public int getNavigationMode();
+ method public int getSelectedNavigationIndex();
+ method public androidx.appcompat.app.ActionBar.Tab! getSelectedTab();
+ method public CharSequence! getSubtitle();
+ method public androidx.appcompat.app.ActionBar.Tab! getTabAt(int);
+ method public int getTabCount();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public void hide();
+ method public void hideForSystem();
+ method public boolean isShowing();
+ method public androidx.appcompat.app.ActionBar.Tab! newTab();
+ method public void onContentScrollStarted();
+ method public void onContentScrollStopped();
+ method public void onWindowVisibilityChanged(int);
+ method public void removeAllTabs();
+ method public void removeOnMenuVisibilityListener(androidx.appcompat.app.ActionBar.OnMenuVisibilityListener!);
+ method public void removeTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void removeTabAt(int);
+ method public boolean requestFocus();
+ method public void selectTab(androidx.appcompat.app.ActionBar.Tab!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCustomView(int);
+ method public void setCustomView(android.view.View!);
+ method public void setCustomView(android.view.View!, androidx.appcompat.app.ActionBar.LayoutParams!);
+ method public void setDisplayHomeAsUpEnabled(boolean);
+ method public void setDisplayOptions(int);
+ method public void setDisplayOptions(int, int);
+ method public void setDisplayShowCustomEnabled(boolean);
+ method public void setDisplayShowHomeEnabled(boolean);
+ method public void setDisplayShowTitleEnabled(boolean);
+ method public void setDisplayUseLogoEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setListNavigationCallbacks(android.widget.SpinnerAdapter!, androidx.appcompat.app.ActionBar.OnNavigationListener!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setNavigationMode(int);
+ method public void setSelectedNavigationItem(int);
+ method public void setSubtitle(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(int);
+ method public void setTitle(CharSequence!);
+ method public void show();
+ method public void showForSystem();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.ActionModeImpl extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+ ctor public WindowDecorActionBar.ActionModeImpl(android.content.Context!, androidx.appcompat.view.ActionMode.Callback!);
+ method public boolean dispatchOnCreate();
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowDecorActionBar.TabImpl extends androidx.appcompat.app.ActionBar.Tab {
+ ctor public WindowDecorActionBar.TabImpl();
+ method public androidx.appcompat.app.ActionBar.TabListener! getCallback();
+ method public CharSequence! getContentDescription();
+ method public android.view.View! getCustomView();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public int getPosition();
+ method public Object! getTag();
+ method public CharSequence! getText();
+ method public void select();
+ method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setContentDescription(CharSequence!);
+ method public androidx.appcompat.app.ActionBar.Tab! setCustomView(android.view.View!);
+ method public androidx.appcompat.app.ActionBar.Tab! setCustomView(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setIcon(android.graphics.drawable.Drawable!);
+ method public androidx.appcompat.app.ActionBar.Tab! setIcon(int);
+ method public void setPosition(int);
+ method public androidx.appcompat.app.ActionBar.Tab! setTabListener(androidx.appcompat.app.ActionBar.TabListener!);
+ method public androidx.appcompat.app.ActionBar.Tab! setTag(Object!);
+ method public androidx.appcompat.app.ActionBar.Tab! setText(CharSequence!);
+ method public androidx.appcompat.app.ActionBar.Tab! setText(int);
+ }
+
+}
+
+package androidx.appcompat.graphics.drawable {
+
+ public class DrawerArrowDrawable extends android.graphics.drawable.Drawable {
+ ctor public DrawerArrowDrawable(android.content.Context!);
+ method public void draw(android.graphics.Canvas!);
+ method public float getArrowHeadLength();
+ method public float getArrowShaftLength();
+ method public float getBarLength();
+ method public float getBarThickness();
+ method @ColorInt public int getColor();
+ method @androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection public int getDirection();
+ method public float getGapSize();
+ method public int getOpacity();
+ method public final android.graphics.Paint! getPaint();
+ method @FloatRange(from=0.0, to=1.0) public float getProgress();
+ method public boolean isSpinEnabled();
+ method public void setAlpha(int);
+ method public void setArrowHeadLength(float);
+ method public void setArrowShaftLength(float);
+ method public void setBarLength(float);
+ method public void setBarThickness(float);
+ method public void setColor(@ColorInt int);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setDirection(@androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ArrowDirection int);
+ method public void setGapSize(float);
+ method public void setProgress(@FloatRange(from=0.0, to=1.0) float);
+ method public void setSpinEnabled(boolean);
+ method public void setVerticalMirror(boolean);
+ field public static final int ARROW_DIRECTION_END = 3; // 0x3
+ field public static final int ARROW_DIRECTION_LEFT = 0; // 0x0
+ field public static final int ARROW_DIRECTION_RIGHT = 1; // 0x1
+ field public static final int ARROW_DIRECTION_START = 2; // 0x2
+ }
+
+ @IntDef({androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_LEFT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_RIGHT, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_START, androidx.appcompat.graphics.drawable.DrawerArrowDrawable.ARROW_DIRECTION_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface DrawerArrowDrawable.ArrowDirection {
+ }
+
+}
+
+package androidx.appcompat.text {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AllCapsTransformationMethod implements android.text.method.TransformationMethod {
+ ctor public AllCapsTransformationMethod(android.content.Context!);
+ method public CharSequence! getTransformation(CharSequence!, android.view.View!);
+ method public void onFocusChanged(android.view.View!, CharSequence!, boolean, int, android.graphics.Rect!);
+ }
+
+}
+
+package androidx.appcompat.view {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarPolicy {
+ method public boolean enableHomeButtonByDefault();
+ method public static androidx.appcompat.view.ActionBarPolicy! get(android.content.Context!);
+ method public int getEmbeddedMenuWidthLimit();
+ method public int getMaxActionButtons();
+ method public int getStackedTabMaxWidth();
+ method public int getTabContainerHeight();
+ method public boolean hasEmbeddedTabs();
+ method public boolean showsOverflowMenuButton();
+ }
+
+ public abstract class ActionMode {
+ ctor public ActionMode();
+ method public abstract void finish();
+ method public abstract android.view.View! getCustomView();
+ method public abstract android.view.Menu! getMenu();
+ method public abstract android.view.MenuInflater! getMenuInflater();
+ method public abstract CharSequence! getSubtitle();
+ method public Object! getTag();
+ method public abstract CharSequence! getTitle();
+ method public boolean getTitleOptionalHint();
+ method public abstract void invalidate();
+ method public boolean isTitleOptional();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isUiFocusable();
+ method public abstract void setCustomView(android.view.View!);
+ method public abstract void setSubtitle(CharSequence!);
+ method public abstract void setSubtitle(int);
+ method public void setTag(Object!);
+ method public abstract void setTitle(CharSequence!);
+ method public abstract void setTitle(int);
+ method public void setTitleOptionalHint(boolean);
+ }
+
+ public static interface ActionMode.Callback {
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @Deprecated public interface CollapsibleActionView {
+ method @Deprecated public void onActionViewCollapsed();
+ method @Deprecated public void onActionViewExpanded();
+ }
+
+ public class ContextThemeWrapper extends android.content.ContextWrapper {
+ ctor public ContextThemeWrapper();
+ ctor public ContextThemeWrapper(android.content.Context!, @StyleRes int);
+ ctor public ContextThemeWrapper(android.content.Context!, android.content.res.Resources.Theme!);
+ method public void applyOverrideConfiguration(android.content.res.Configuration!);
+ method public int getThemeResId();
+ method protected void onApplyThemeResource(android.content.res.Resources.Theme!, int, boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class StandaloneActionMode extends androidx.appcompat.view.ActionMode implements androidx.appcompat.view.menu.MenuBuilder.Callback {
+ ctor public StandaloneActionMode(android.content.Context!, androidx.appcompat.widget.ActionBarContextView!, androidx.appcompat.view.ActionMode.Callback!, boolean);
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onCloseSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportActionModeWrapper extends android.view.ActionMode {
+ ctor public SupportActionModeWrapper(android.content.Context!, androidx.appcompat.view.ActionMode!);
+ method public void finish();
+ method public android.view.View! getCustomView();
+ method public android.view.Menu! getMenu();
+ method public android.view.MenuInflater! getMenuInflater();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public void invalidate();
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitle(int);
+ method public void setTitle(CharSequence!);
+ method public void setTitle(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SupportActionModeWrapper.CallbackWrapper implements androidx.appcompat.view.ActionMode.Callback {
+ ctor public SupportActionModeWrapper.CallbackWrapper(android.content.Context!, android.view.ActionMode.Callback!);
+ method public android.view.ActionMode! getActionModeWrapper(androidx.appcompat.view.ActionMode!);
+ method public boolean onActionItemClicked(androidx.appcompat.view.ActionMode!, android.view.MenuItem!);
+ method public boolean onCreateActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ method public void onDestroyActionMode(androidx.appcompat.view.ActionMode!);
+ method public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode!, android.view.Menu!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SupportMenuInflater extends android.view.MenuInflater {
+ ctor public SupportMenuInflater(android.content.Context!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewPropertyAnimatorCompatSet {
+ ctor public ViewPropertyAnimatorCompatSet();
+ method public void cancel();
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! play(androidx.core.view.ViewPropertyAnimatorCompat!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! playSequentially(androidx.core.view.ViewPropertyAnimatorCompat!, androidx.core.view.ViewPropertyAnimatorCompat!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setDuration(long);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.appcompat.view.ViewPropertyAnimatorCompatSet! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public void start();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class WindowCallbackWrapper implements android.view.Window.Callback {
+ ctor public WindowCallbackWrapper(android.view.Window.Callback!);
+ method public boolean dispatchGenericMotionEvent(android.view.MotionEvent!);
+ method public boolean dispatchKeyEvent(android.view.KeyEvent!);
+ method public boolean dispatchKeyShortcutEvent(android.view.KeyEvent!);
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.accessibility.AccessibilityEvent!);
+ method public boolean dispatchTouchEvent(android.view.MotionEvent!);
+ method public boolean dispatchTrackballEvent(android.view.MotionEvent!);
+ method public final android.view.Window.Callback! getWrapped();
+ method public void onActionModeFinished(android.view.ActionMode!);
+ method public void onActionModeStarted(android.view.ActionMode!);
+ method public void onAttachedToWindow();
+ method public void onContentChanged();
+ method public boolean onCreatePanelMenu(int, android.view.Menu!);
+ method public android.view.View! onCreatePanelView(int);
+ method public void onDetachedFromWindow();
+ method public boolean onMenuItemSelected(int, android.view.MenuItem!);
+ method public boolean onMenuOpened(int, android.view.Menu!);
+ method public void onPanelClosed(int, android.view.Menu!);
+ method public boolean onPreparePanel(int, android.view.View!, android.view.Menu!);
+ method @RequiresApi(23) public boolean onSearchRequested(android.view.SearchEvent!);
+ method public boolean onSearchRequested();
+ method public void onWindowAttributesChanged(android.view.WindowManager.LayoutParams!);
+ method public void onWindowFocusChanged(boolean);
+ method public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!);
+ method @RequiresApi(23) public android.view.ActionMode! onWindowStartingActionMode(android.view.ActionMode.Callback!, int);
+ }
+
+}
+
+package androidx.appcompat.view.menu {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItem implements androidx.core.internal.view.SupportMenuItem {
+ ctor public ActionMenuItem(android.content.Context!, int, int, int, int, CharSequence!);
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu! getSubMenu();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasSubMenu();
+ method public boolean invoke();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(android.view.View!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(int);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public androidx.appcompat.view.menu.ActionMenuItem! setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public androidx.core.internal.view.SupportMenuItem! setShowAsActionFlags(int);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionMenuItemView extends androidx.appcompat.widget.AppCompatTextView implements androidx.appcompat.widget.ActionMenuView.ActionMenuChildView androidx.appcompat.view.menu.MenuView.ItemView android.view.View.OnClickListener {
+ ctor public ActionMenuItemView(android.content.Context!);
+ ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public boolean hasText();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean needsDividerAfter();
+ method public boolean needsDividerBefore();
+ method public void onClick(android.view.View!);
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setExpandedFormat(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setItemInvoker(androidx.appcompat.view.menu.MenuBuilder.ItemInvoker!);
+ method public void setPopupCallback(androidx.appcompat.view.menu.ActionMenuItemView.PopupCallback!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ public abstract static class ActionMenuItemView.PopupCallback {
+ ctor public ActionMenuItemView.PopupCallback();
+ method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class BaseMenuPresenter implements androidx.appcompat.view.menu.MenuPresenter {
+ ctor public BaseMenuPresenter(android.content.Context!, int, int);
+ method protected void addItemView(android.view.View!, int);
+ method public abstract void bindItemView(androidx.appcompat.view.menu.MenuItemImpl!, androidx.appcompat.view.menu.MenuView.ItemView!);
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public androidx.appcompat.view.menu.MenuView.ItemView! createItemView(android.view.ViewGroup!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method protected boolean filterLeftoverView(android.view.ViewGroup!, int);
+ method public boolean flagActionItems();
+ method public androidx.appcompat.view.menu.MenuPresenter.Callback! getCallback();
+ method public int getId();
+ method public android.view.View! getItemView(androidx.appcompat.view.menu.MenuItemImpl!, android.view.View!, android.view.ViewGroup!);
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setId(int);
+ method public boolean shouldIncludeItem(int, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public void updateMenuView(boolean);
+ field protected android.content.Context! mContext;
+ field protected android.view.LayoutInflater! mInflater;
+ field protected androidx.appcompat.view.menu.MenuBuilder! mMenu;
+ field protected androidx.appcompat.view.menu.MenuView! mMenuView;
+ field protected android.content.Context! mSystemContext;
+ field protected android.view.LayoutInflater! mSystemInflater;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ExpandedMenuView extends android.widget.ListView implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+ ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ExpandedMenuView(android.content.Context!, android.util.AttributeSet!, int);
+ method public int getWindowAnimations();
+ method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public void onItemClick(android.widget.AdapterView!, android.view.View!, int, long);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuItemView extends android.widget.LinearLayout implements android.widget.AbsListView.SelectionBoundsAdjuster androidx.appcompat.view.menu.MenuView.ItemView {
+ ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!);
+ ctor public ListMenuItemView(android.content.Context!, android.util.AttributeSet!, int);
+ method public void adjustListItemSelectionBounds(android.graphics.Rect!);
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setForceShowIcon(boolean);
+ method public void setGroupDividerEnabled(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ListMenuPresenter implements android.widget.AdapterView.OnItemClickListener androidx.appcompat.view.menu.MenuPresenter {
+ ctor public ListMenuPresenter(android.content.Context!, int);
+ ctor public ListMenuPresenter(int, int);
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean flagActionItems();
+ method public android.widget.ListAdapter! getAdapter();
+ method public int getId();
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onItemClick(android.widget.AdapterView<?>!, android.view.View!, int, long);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void restoreHierarchyState(android.os.Bundle!);
+ method public void saveHierarchyState(android.os.Bundle!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setId(int);
+ method public void setItemIndexOffset(int);
+ method public void updateMenuView(boolean);
+ field public static final String VIEWS_TAG = "android:menu:list";
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuAdapter extends android.widget.BaseAdapter {
+ ctor public MenuAdapter(androidx.appcompat.view.menu.MenuBuilder!, android.view.LayoutInflater!, boolean, int);
+ method public androidx.appcompat.view.menu.MenuBuilder! getAdapterMenu();
+ method public int getCount();
+ method public boolean getForceShowIcon();
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItem(int);
+ method public long getItemId(int);
+ method public android.view.View! getView(int, android.view.View!, android.view.ViewGroup!);
+ method public void setForceShowIcon(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuBuilder implements androidx.core.internal.view.SupportMenu {
+ ctor public MenuBuilder(android.content.Context!);
+ method public android.view.MenuItem! add(CharSequence!);
+ method public android.view.MenuItem! add(int);
+ method public android.view.MenuItem! add(int, int, int, CharSequence!);
+ method public android.view.MenuItem! add(int, int, int, int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+ method protected android.view.MenuItem! addInternal(int, int, int, CharSequence!);
+ method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+ method public void addMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!, android.content.Context!);
+ method public android.view.SubMenu! addSubMenu(CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int);
+ method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int, int, int, int);
+ method public void changeMenuMode();
+ method public void clear();
+ method public void clearAll();
+ method public void clearHeader();
+ method public final void close(boolean);
+ method public void close();
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuItemImpl!);
+ method public int findGroupIndex(int);
+ method public int findGroupIndex(int, int);
+ method public android.view.MenuItem! findItem(int);
+ method public int findItemIndex(int);
+ method public void flagActionItems();
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getActionItems();
+ method protected String! getActionViewStatesKey();
+ method public android.content.Context! getContext();
+ method public androidx.appcompat.view.menu.MenuItemImpl! getExpandedItem();
+ method public android.graphics.drawable.Drawable! getHeaderIcon();
+ method public CharSequence! getHeaderTitle();
+ method public android.view.View! getHeaderView();
+ method public android.view.MenuItem! getItem(int);
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!>! getNonActionItems();
+ method public androidx.appcompat.view.menu.MenuBuilder! getRootMenu();
+ method public java.util.ArrayList<androidx.appcompat.view.menu.MenuItemImpl!> getVisibleItems();
+ method public boolean hasVisibleItems();
+ method public boolean isGroupDividerEnabled();
+ method public boolean isShortcutKey(int, android.view.KeyEvent!);
+ method public boolean isShortcutsVisible();
+ method public void onItemsChanged(boolean);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performItemAction(android.view.MenuItem!, int);
+ method public boolean performItemAction(android.view.MenuItem!, androidx.appcompat.view.menu.MenuPresenter!, int);
+ method public boolean performShortcut(int, android.view.KeyEvent!, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void removeItemAt(int);
+ method public void removeMenuPresenter(androidx.appcompat.view.menu.MenuPresenter!);
+ method public void restoreActionViewStates(android.os.Bundle!);
+ method public void restorePresenterStates(android.os.Bundle!);
+ method public void saveActionViewStates(android.os.Bundle!);
+ method public void savePresenterStates(android.os.Bundle!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setCurrentMenuInfo(android.view.ContextMenu.ContextMenuInfo!);
+ method public androidx.appcompat.view.menu.MenuBuilder! setDefaultShowAsAction(int);
+ method public void setGroupCheckable(int, boolean, boolean);
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(android.graphics.drawable.Drawable!);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderIconInt(int);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(CharSequence!);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderTitleInt(int);
+ method protected androidx.appcompat.view.menu.MenuBuilder! setHeaderViewInt(android.view.View!);
+ method public void setOptionalIconsVisible(boolean);
+ method public void setOverrideVisibleItems(boolean);
+ method public void setQwertyMode(boolean);
+ method public void setShortcutsVisible(boolean);
+ method public int size();
+ method public void startDispatchingItemsChanged();
+ method public void stopDispatchingItemsChanged();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.Callback {
+ method public boolean onMenuItemSelected(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onMenuModeChange(androidx.appcompat.view.menu.MenuBuilder);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface MenuBuilder.ItemInvoker {
+ method public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class MenuItemImpl implements androidx.core.internal.view.SupportMenuItem {
+ method public void actionFormatChanged();
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public int getOrdering();
+ method public android.view.SubMenu! getSubMenu();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasCollapsibleActionView();
+ method public boolean hasSubMenu();
+ method public boolean invoke();
+ method public boolean isActionButton();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isExclusiveCheckable();
+ method public boolean isVisible();
+ method public boolean requestsActionButton();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(android.view.View!);
+ method public androidx.core.internal.view.SupportMenuItem! setActionView(int);
+ method public void setActionViewExpanded(boolean);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCallback(Runnable!);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public void setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public void setIsActionButton(boolean);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public androidx.core.internal.view.SupportMenuItem! setShowAsActionFlags(int);
+ method public void setSubMenu(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ method public boolean shouldShowIcon();
+ method public boolean showsTextAsAction();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuItemWrapperICS implements android.view.MenuItem {
+ ctor public MenuItemWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenuItem!);
+ method public boolean collapseActionView();
+ method public boolean expandActionView();
+ method public android.view.ActionProvider! getActionProvider();
+ method public android.view.View! getActionView();
+ method public char getAlphabeticShortcut();
+ method public int getGroupId();
+ method public android.graphics.drawable.Drawable! getIcon();
+ method public android.content.Intent! getIntent();
+ method public int getItemId();
+ method public android.view.ContextMenu.ContextMenuInfo! getMenuInfo();
+ method public char getNumericShortcut();
+ method public int getOrder();
+ method public android.view.SubMenu! getSubMenu();
+ method public CharSequence! getTitle();
+ method public CharSequence! getTitleCondensed();
+ method public boolean hasSubMenu();
+ method public boolean isActionViewExpanded();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isEnabled();
+ method public boolean isVisible();
+ method public android.view.MenuItem! setActionProvider(android.view.ActionProvider!);
+ method public android.view.MenuItem! setActionView(android.view.View!);
+ method public android.view.MenuItem! setActionView(int);
+ method public android.view.MenuItem! setAlphabeticShortcut(char);
+ method public android.view.MenuItem! setCheckable(boolean);
+ method public android.view.MenuItem! setChecked(boolean);
+ method public android.view.MenuItem! setEnabled(boolean);
+ method public void setExclusiveCheckable(boolean);
+ method public android.view.MenuItem! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.MenuItem! setIcon(int);
+ method public android.view.MenuItem! setIntent(android.content.Intent!);
+ method public android.view.MenuItem! setNumericShortcut(char);
+ method public android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem.OnActionExpandListener!);
+ method public android.view.MenuItem! setOnMenuItemClickListener(android.view.MenuItem.OnMenuItemClickListener!);
+ method public android.view.MenuItem! setShortcut(char, char);
+ method public void setShowAsAction(int);
+ method public android.view.MenuItem! setShowAsActionFlags(int);
+ method public android.view.MenuItem! setTitle(CharSequence!);
+ method public android.view.MenuItem! setTitle(int);
+ method public android.view.MenuItem! setTitleCondensed(CharSequence!);
+ method public android.view.MenuItem! setVisible(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupHelper {
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int);
+ ctor public MenuPopupHelper(android.content.Context, androidx.appcompat.view.menu.MenuBuilder, android.view.View, boolean, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public int getGravity();
+ method public android.widget.ListView! getListView();
+ method public boolean isShowing();
+ method protected void onDismiss();
+ method public void setAnchorView(android.view.View);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setPresenterCallback(androidx.appcompat.view.menu.MenuPresenter.Callback?);
+ method public void show();
+ method public void show(int, int);
+ method public boolean tryShow();
+ method public boolean tryShow(int, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuPresenter {
+ method public boolean collapseItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean expandItemActionView(androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public boolean flagActionItems();
+ method public int getId();
+ method public androidx.appcompat.view.menu.MenuView! getMenuView(android.view.ViewGroup!);
+ method public void initForMenu(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!);
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder!, boolean);
+ method public void onRestoreInstanceState(android.os.Parcelable!);
+ method public android.os.Parcelable! onSaveInstanceState();
+ method public boolean onSubMenuSelected(androidx.appcompat.view.menu.SubMenuBuilder!);
+ method public void setCallback(androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void updateMenuView(boolean);
+ }
+
+ public static interface MenuPresenter.Callback {
+ method public void onCloseMenu(androidx.appcompat.view.menu.MenuBuilder, boolean);
+ method public boolean onOpenSubMenu(androidx.appcompat.view.menu.MenuBuilder);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuView {
+ method public int getWindowAnimations();
+ method public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ }
+
+ public static interface MenuView.ItemView {
+ method public androidx.appcompat.view.menu.MenuItemImpl! getItemData();
+ method public void initialize(androidx.appcompat.view.menu.MenuItemImpl!, int);
+ method public boolean prefersCondensedTitle();
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setEnabled(boolean);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setShortcut(boolean, char);
+ method public void setTitle(CharSequence!);
+ method public boolean showsIcon();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuWrapperICS implements android.view.Menu {
+ ctor public MenuWrapperICS(android.content.Context!, androidx.core.internal.view.SupportMenu!);
+ method public android.view.MenuItem! add(CharSequence!);
+ method public android.view.MenuItem! add(int);
+ method public android.view.MenuItem! add(int, int, int, CharSequence!);
+ method public android.view.MenuItem! add(int, int, int, int);
+ method public int addIntentOptions(int, int, int, android.content.ComponentName!, android.content.Intent![]!, android.content.Intent!, int, android.view.MenuItem![]!);
+ method public android.view.SubMenu! addSubMenu(CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int);
+ method public android.view.SubMenu! addSubMenu(int, int, int, CharSequence!);
+ method public android.view.SubMenu! addSubMenu(int, int, int, int);
+ method public void clear();
+ method public void close();
+ method public android.view.MenuItem! findItem(int);
+ method public android.view.MenuItem! getItem(int);
+ method public boolean hasVisibleItems();
+ method public boolean isShortcutKey(int, android.view.KeyEvent!);
+ method public boolean performIdentifierAction(int, int);
+ method public boolean performShortcut(int, android.view.KeyEvent!, int);
+ method public void removeGroup(int);
+ method public void removeItem(int);
+ method public void setGroupCheckable(int, boolean, boolean);
+ method public void setGroupEnabled(int, boolean);
+ method public void setGroupVisible(int, boolean);
+ method public void setQwertyMode(boolean);
+ method public int size();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface ShowableListMenu {
+ method public void dismiss();
+ method public android.widget.ListView! getListView();
+ method public boolean isShowing();
+ method public void show();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SubMenuBuilder extends androidx.appcompat.view.menu.MenuBuilder implements android.view.SubMenu {
+ ctor public SubMenuBuilder(android.content.Context!, androidx.appcompat.view.menu.MenuBuilder!, androidx.appcompat.view.menu.MenuItemImpl!);
+ method public String! getActionViewStatesKey();
+ method public android.view.MenuItem! getItem();
+ method public android.view.Menu! getParentMenu();
+ method public boolean isQwertyMode();
+ method public android.view.SubMenu! setHeaderIcon(android.graphics.drawable.Drawable!);
+ method public android.view.SubMenu! setHeaderIcon(int);
+ method public android.view.SubMenu! setHeaderTitle(CharSequence!);
+ method public android.view.SubMenu! setHeaderTitle(int);
+ method public android.view.SubMenu! setHeaderView(android.view.View!);
+ method public android.view.SubMenu! setIcon(android.graphics.drawable.Drawable!);
+ method public android.view.SubMenu! setIcon(int);
+ }
+
+}
+
+package androidx.appcompat.widget {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContainer extends android.widget.FrameLayout {
+ ctor public ActionBarContainer(android.content.Context!);
+ ctor public ActionBarContainer(android.content.Context!, android.util.AttributeSet!);
+ method public android.view.View! getTabContainer();
+ method public void onFinishInflate();
+ method public void onLayout(boolean, int, int, int, int);
+ method public void onMeasure(int, int);
+ method public void setPrimaryBackground(android.graphics.drawable.Drawable!);
+ method public void setSplitBackground(android.graphics.drawable.Drawable!);
+ method public void setStackedBackground(android.graphics.drawable.Drawable!);
+ method public void setTabContainer(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setTransitioning(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarContextView extends android.view.ViewGroup {
+ ctor public ActionBarContextView(android.content.Context);
+ ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?);
+ ctor public ActionBarContextView(android.content.Context, android.util.AttributeSet?, int);
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void closeMode();
+ method public void dismissPopupMenus();
+ method public int getAnimatedVisibility();
+ method public int getContentHeight();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public boolean hideOverflowMenu();
+ method public void initForMode(androidx.appcompat.view.ActionMode!);
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isOverflowReserved();
+ method public boolean isTitleOptional();
+ method public void killMode();
+ method public void onDetachedFromWindow();
+ method public void postShowOverflowMenu();
+ method public void setContentHeight(int);
+ method public void setCustomView(android.view.View!);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setTitleOptional(boolean);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActionBarOverlayLayout extends android.view.ViewGroup implements androidx.appcompat.widget.DecorContentParent androidx.core.view.NestedScrollingParent androidx.core.view.NestedScrollingParent2 androidx.core.view.NestedScrollingParent3 {
+ ctor public ActionBarOverlayLayout(android.content.Context);
+ ctor public ActionBarOverlayLayout(android.content.Context, android.util.AttributeSet?);
+ method public boolean canShowOverflowMenu();
+ method public void dismissPopups();
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method protected androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionBarOverlayLayout.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method public int getActionBarHideOffset();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initFeature(int);
+ method public boolean isHideOnContentScrollEnabled();
+ method public boolean isInOverlayMode();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public void onNestedPreScroll(android.view.View!, int, int, int[]!, int);
+ method public void onNestedScroll(android.view.View!, int, int, int, int, int, int[]!);
+ method public void onNestedScroll(android.view.View!, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View!, android.view.View!, int, int);
+ method public boolean onStartNestedScroll(android.view.View!, android.view.View!, int, int);
+ method public void onStopNestedScroll(android.view.View!, int);
+ method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setActionBarHideOffset(int);
+ method public void setActionBarVisibilityCallback(androidx.appcompat.widget.ActionBarOverlayLayout.ActionBarVisibilityCallback!);
+ method public void setHasNonEmbeddedTabs(boolean);
+ method public void setHideOnContentScrollEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuPrepared();
+ method public void setOverlayMode(boolean);
+ method public void setShowingForActionMode(boolean);
+ method public void setUiOptions(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public boolean showOverflowMenu();
+ }
+
+ public static interface ActionBarOverlayLayout.ActionBarVisibilityCallback {
+ method public void enableContentAnimations(boolean);
+ method public void hideForSystem();
+ method public void onContentScrollStarted();
+ method public void onContentScrollStopped();
+ method public void onWindowVisibilityChanged(int);
+ method public void showForSystem();
+ }
+
+ public static class ActionBarOverlayLayout.LayoutParams extends android.view.ViewGroup.MarginLayoutParams {
+ ctor public ActionBarOverlayLayout.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionBarOverlayLayout.LayoutParams(int, int);
+ ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionBarOverlayLayout.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ public class ActionMenuView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.menu.MenuBuilder.ItemInvoker androidx.appcompat.view.menu.MenuView {
+ ctor public ActionMenuView(android.content.Context);
+ ctor public ActionMenuView(android.content.Context, android.util.AttributeSet?);
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.ActionMenuView.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.ActionMenuView.LayoutParams! generateOverflowButtonLayoutParams();
+ method public android.view.Menu! getMenu();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method public int getPopupTheme();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getWindowAnimations();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected boolean hasSupportDividerBeforeChildAt(int);
+ method public boolean hideOverflowMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void initialize(androidx.appcompat.view.menu.MenuBuilder!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean invokeItem(androidx.appcompat.view.menu.MenuItemImpl!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowReserved();
+ method public void onConfigurationChanged(android.content.res.Configuration!);
+ method public void onDetachedFromWindow();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.view.menu.MenuBuilder! peekMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setExpandedActionViewsExclusive(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.ActionMenuView.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverflowReserved(boolean);
+ method public void setPopupTheme(@StyleRes int);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionMenuView.ActionMenuChildView {
+ method public boolean needsDividerAfter();
+ method public boolean needsDividerBefore();
+ }
+
+ public static class ActionMenuView.LayoutParams extends androidx.appcompat.widget.LinearLayoutCompat.LayoutParams {
+ ctor public ActionMenuView.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public ActionMenuView.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(androidx.appcompat.widget.ActionMenuView.LayoutParams!);
+ ctor public ActionMenuView.LayoutParams(int, int);
+ field public int cellsUsed;
+ field public boolean expandable;
+ field public int extraPixels;
+ field public boolean isOverflowButton;
+ field public boolean preventEdgeOffset;
+ }
+
+ public static interface ActionMenuView.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ActivityChooserView extends android.view.ViewGroup {
+ ctor public ActivityChooserView(android.content.Context);
+ ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?);
+ ctor public ActivityChooserView(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean dismissPopup();
+ method public boolean isShowingPopup();
+ method public void setDefaultActionButtonContentDescription(int);
+ method public void setExpandActivityOverflowButtonContentDescription(int);
+ method public void setExpandActivityOverflowButtonDrawable(android.graphics.drawable.Drawable!);
+ method public void setInitialActivityCount(int);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setProvider(androidx.core.view.ActionProvider!);
+ method public boolean showPopup();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ActivityChooserView.InnerLayout extends android.widget.LinearLayout {
+ ctor public ActivityChooserView.InnerLayout(android.content.Context!, android.util.AttributeSet!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AlertDialogLayout extends androidx.appcompat.widget.LinearLayoutCompat {
+ ctor public AlertDialogLayout(android.content.Context?);
+ ctor public AlertDialogLayout(android.content.Context?, android.util.AttributeSet?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatAutoCompleteTextView extends android.widget.AutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatButton extends android.widget.Button implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatButton(android.content.Context);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setSupportAllCaps(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckBox extends android.widget.CheckBox implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatCheckBox(android.content.Context);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckBox(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatCheckedTextView extends android.widget.CheckedTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCheckedTextView {
+ ctor public AppCompatCheckedTextView(android.content.Context);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatCheckedTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class AppCompatDrawableManager {
+ ctor public AppCompatDrawableManager();
+ method public static androidx.appcompat.widget.AppCompatDrawableManager! get();
+ method public android.graphics.drawable.Drawable! getDrawable(android.content.Context, @DrawableRes int);
+ method public static android.graphics.PorterDuffColorFilter! getPorterDuffColorFilter(int, android.graphics.PorterDuff.Mode!);
+ method public void onConfigurationChanged(android.content.Context);
+ method public static void preload();
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatEditText extends android.widget.EditText implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.OnReceiveContentViewBehavior androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatEditText(android.content.Context);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatEditText(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageButton extends android.widget.ImageButton implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageButton(android.content.Context);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class AppCompatImageHelper {
+ ctor public AppCompatImageHelper(android.widget.ImageView);
+ method public void loadFromAttributes(android.util.AttributeSet!, int);
+ method public void setImageResource(int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatImageView extends android.widget.ImageView implements androidx.core.view.TintableBackgroundView androidx.core.widget.TintableImageSourceView {
+ ctor public AppCompatImageView(android.content.Context);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatImageView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportImageTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatMultiAutoCompleteTextView extends android.widget.MultiAutoCompleteTextView implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatMultiAutoCompleteTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatRadioButton extends android.widget.RadioButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundButton {
+ ctor public AppCompatRadioButton(android.content.Context!);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?);
+ ctor public AppCompatRadioButton(android.content.Context!, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportButtonTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public class AppCompatRatingBar extends android.widget.RatingBar {
+ ctor public AppCompatRatingBar(android.content.Context);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatRatingBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ public class AppCompatSeekBar extends android.widget.SeekBar {
+ ctor public AppCompatSeekBar(android.content.Context);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSeekBar(android.content.Context, android.util.AttributeSet?, int);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatSpinner extends android.widget.Spinner implements androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatSpinner(android.content.Context);
+ ctor public AppCompatSpinner(android.content.Context, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int);
+ ctor public AppCompatSpinner(android.content.Context, android.util.AttributeSet?, int, int, android.content.res.Resources.Theme!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatTextView extends android.widget.TextView implements androidx.core.widget.AutoSizeableTextView androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView androidx.core.widget.TintableCompoundDrawablesView {
+ ctor public AppCompatTextView(android.content.Context);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatTextView(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParamsCompat();
+ method public boolean isEmojiCompatEnabled();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setPrecomputedText(androidx.core.text.PrecomputedTextCompat);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTextAppearance(android.content.Context!, int);
+ method public void setTextFuture(java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>?);
+ method public void setTextMetricsParamsCompat(androidx.core.text.PrecomputedTextCompat.Params);
+ }
+
+ @androidx.resourceinspection.annotation.AppCompatShadowedAttributes public class AppCompatToggleButton extends android.widget.ToggleButton implements androidx.appcompat.widget.EmojiCompatConfigurationView androidx.core.view.TintableBackgroundView {
+ ctor public AppCompatToggleButton(android.content.Context);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?);
+ ctor public AppCompatToggleButton(android.content.Context, android.util.AttributeSet?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ButtonBarLayout extends android.widget.LinearLayout {
+ ctor public ButtonBarLayout(android.content.Context, android.util.AttributeSet?);
+ method public void setAllowStacking(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorContentParent {
+ method public boolean canShowOverflowMenu();
+ method public void dismissPopups();
+ method public CharSequence! getTitle();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initFeature(int);
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public void restoreToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveToolbarHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuPrepared();
+ method public void setUiOptions(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface DecorToolbar {
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method public android.content.Context! getContext();
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getDropdownItemCount();
+ method public int getDropdownSelectedPosition();
+ method public int getHeight();
+ method public android.view.Menu! getMenu();
+ method public int getNavigationMode();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public android.view.ViewGroup! getViewGroup();
+ method public int getVisibility();
+ method public boolean hasEmbeddedTabs();
+ method public boolean hasExpandedActionView();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initIndeterminateProgress();
+ method public void initProgress();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isTitleTruncated();
+ method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCollapsible(boolean);
+ method public void setCustomView(android.view.View!);
+ method public void setDefaultNavigationContentDescription(int);
+ method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setDisplayOptions(int);
+ method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+ method public void setDropdownSelectedPosition(int);
+ method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setHomeButtonEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setMenuPrepared();
+ method public void setNavigationContentDescription(CharSequence!);
+ method public void setNavigationContentDescription(int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setNavigationIcon(int);
+ method public void setNavigationMode(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setVisibility(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DialogTitle extends androidx.appcompat.widget.AppCompatTextView {
+ ctor public DialogTitle(android.content.Context, android.util.AttributeSet?, int);
+ ctor public DialogTitle(android.content.Context, android.util.AttributeSet?);
+ ctor public DialogTitle(android.content.Context);
+ }
+
+ public interface EmojiCompatConfigurationView {
+ method public boolean isEmojiCompatEnabled();
+ method public void setEmojiCompatEnabled(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsFrameLayout extends android.widget.FrameLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+ ctor public FitWindowsFrameLayout(android.content.Context);
+ ctor public FitWindowsFrameLayout(android.content.Context, android.util.AttributeSet?);
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FitWindowsLinearLayout extends android.widget.LinearLayout implements androidx.appcompat.widget.FitWindowsViewGroup {
+ ctor public FitWindowsLinearLayout(android.content.Context);
+ ctor public FitWindowsLinearLayout(android.content.Context, android.util.AttributeSet?);
+ method protected boolean fitSystemWindows(android.graphics.Rect!);
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface FitWindowsViewGroup {
+ method public void setOnFitSystemWindowsListener(androidx.appcompat.widget.FitWindowsViewGroup.OnFitSystemWindowsListener!);
+ }
+
+ public static interface FitWindowsViewGroup.OnFitSystemWindowsListener {
+ method public void onFitSystemWindows(android.graphics.Rect!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ForwardingListener implements android.view.View.OnAttachStateChangeListener android.view.View.OnTouchListener {
+ ctor public ForwardingListener(android.view.View!);
+ method public abstract androidx.appcompat.view.menu.ShowableListMenu! getPopup();
+ method protected boolean onForwardingStarted();
+ method protected boolean onForwardingStopped();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ }
+
+ public class LinearLayoutCompat extends android.view.ViewGroup {
+ ctor public LinearLayoutCompat(android.content.Context);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public LinearLayoutCompat(android.content.Context, android.util.AttributeSet?, int);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.LinearLayoutCompat.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAlignedChildIndex") public int getBaselineAlignedChildIndex();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:divider") public android.graphics.drawable.Drawable! getDividerDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:dividerPadding") public int getDividerPadding();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getDividerWidth();
+ method @GravityInt @androidx.resourceinspection.annotation.Attribute("android:gravity") public int getGravity();
+ method @androidx.appcompat.widget.LinearLayoutCompat.OrientationMode @androidx.resourceinspection.annotation.Attribute(value="android:orientation", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="horizontal", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="vertical", value=1)}) public int getOrientation();
+ method @androidx.appcompat.widget.LinearLayoutCompat.DividerMode @androidx.resourceinspection.annotation.Attribute(value="androidx.appcompat:showDividers", intMapping={@androidx.resourceinspection.annotation.Attribute.IntMap(name="none", value=0), @androidx.resourceinspection.annotation.Attribute.IntMap(name="beginning", value=1, mask=1), @androidx.resourceinspection.annotation.Attribute.IntMap(name="middle", value=2, mask=2), @androidx.resourceinspection.annotation.Attribute.IntMap(name="end", value=4, mask=4)}) public int getShowDividers();
+ method @androidx.resourceinspection.annotation.Attribute("android:weightSum") public float getWeightSum();
+ method @androidx.resourceinspection.annotation.Attribute("android:baselineAligned") public boolean isBaselineAligned();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:measureWithLargestChild") public boolean isMeasureWithLargestChildEnabled();
+ method public void setBaselineAligned(boolean);
+ method public void setBaselineAlignedChildIndex(int);
+ method public void setDividerDrawable(android.graphics.drawable.Drawable!);
+ method public void setDividerPadding(int);
+ method public void setGravity(@GravityInt int);
+ method public void setHorizontalGravity(int);
+ method public void setMeasureWithLargestChildEnabled(boolean);
+ method public void setOrientation(@androidx.appcompat.widget.LinearLayoutCompat.OrientationMode int);
+ method public void setShowDividers(@androidx.appcompat.widget.LinearLayoutCompat.DividerMode int);
+ method public void setVerticalGravity(int);
+ method public void setWeightSum(float);
+ field public static final int HORIZONTAL = 0; // 0x0
+ field public static final int SHOW_DIVIDER_BEGINNING = 1; // 0x1
+ field public static final int SHOW_DIVIDER_END = 4; // 0x4
+ field public static final int SHOW_DIVIDER_MIDDLE = 2; // 0x2
+ field public static final int SHOW_DIVIDER_NONE = 0; // 0x0
+ field public static final int VERTICAL = 1; // 0x1
+ }
+
+ @IntDef(flag=true, value={androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_NONE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_BEGINNING, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_MIDDLE, androidx.appcompat.widget.LinearLayoutCompat.SHOW_DIVIDER_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.DividerMode {
+ }
+
+ public static class LinearLayoutCompat.LayoutParams extends android.widget.LinearLayout.LayoutParams {
+ ctor public LinearLayoutCompat.LayoutParams(android.content.Context!, android.util.AttributeSet!);
+ ctor public LinearLayoutCompat.LayoutParams(int, int);
+ ctor public LinearLayoutCompat.LayoutParams(int, int, float);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ ctor public LinearLayoutCompat.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ }
+
+ @IntDef({androidx.appcompat.widget.LinearLayoutCompat.HORIZONTAL, androidx.appcompat.widget.LinearLayoutCompat.VERTICAL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinearLayoutCompat.OrientationMode {
+ }
+
+ public class ListPopupWindow implements androidx.appcompat.view.menu.ShowableListMenu {
+ ctor public ListPopupWindow(android.content.Context);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int);
+ ctor public ListPopupWindow(android.content.Context, android.util.AttributeSet?, @AttrRes int, @StyleRes int);
+ method public void clearListSelection();
+ method public android.view.View.OnTouchListener! createDragToOpenListener(android.view.View!);
+ method public void dismiss();
+ method public android.view.View? getAnchorView();
+ method @StyleRes public int getAnimationStyle();
+ method public android.graphics.drawable.Drawable? getBackground();
+ method public android.graphics.Rect? getEpicenterBounds();
+ method public int getHeight();
+ method public int getHorizontalOffset();
+ method public int getInputMethodMode();
+ method public android.widget.ListView? getListView();
+ method public int getPromptPosition();
+ method public Object? getSelectedItem();
+ method public long getSelectedItemId();
+ method public int getSelectedItemPosition();
+ method public android.view.View? getSelectedView();
+ method public int getSoftInputMode();
+ method public int getVerticalOffset();
+ method public int getWidth();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isDropDownAlwaysVisible();
+ method public boolean isInputMethodNotNeeded();
+ method public boolean isModal();
+ method public boolean isShowing();
+ method public boolean onKeyDown(int, android.view.KeyEvent);
+ method public boolean onKeyPreIme(int, android.view.KeyEvent);
+ method public boolean onKeyUp(int, android.view.KeyEvent);
+ method public boolean performItemClick(int);
+ method public void postShow();
+ method public void setAdapter(android.widget.ListAdapter?);
+ method public void setAnchorView(android.view.View?);
+ method public void setAnimationStyle(@StyleRes int);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable?);
+ method public void setContentWidth(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setDropDownAlwaysVisible(boolean);
+ method public void setDropDownGravity(int);
+ method public void setEpicenterBounds(android.graphics.Rect?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setForceIgnoreOutsideTouch(boolean);
+ method public void setHeight(int);
+ method public void setHorizontalOffset(int);
+ method public void setInputMethodMode(int);
+ method public void setListSelector(android.graphics.drawable.Drawable!);
+ method public void setModal(boolean);
+ method public void setOnDismissListener(android.widget.PopupWindow.OnDismissListener?);
+ method public void setOnItemClickListener(android.widget.AdapterView.OnItemClickListener?);
+ method public void setOnItemSelectedListener(android.widget.AdapterView.OnItemSelectedListener?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setOverlapAnchor(boolean);
+ method public void setPromptPosition(int);
+ method public void setPromptView(android.view.View?);
+ method public void setSelection(int);
+ method public void setSoftInputMode(int);
+ method public void setVerticalOffset(int);
+ method public void setWidth(int);
+ method public void setWindowLayoutType(int);
+ method public void show();
+ field public static final int INPUT_METHOD_FROM_FOCUSABLE = 0; // 0x0
+ field public static final int INPUT_METHOD_NEEDED = 1; // 0x1
+ field public static final int INPUT_METHOD_NOT_NEEDED = 2; // 0x2
+ field public static final int MATCH_PARENT = -1; // 0xffffffff
+ field public static final int POSITION_PROMPT_ABOVE = 0; // 0x0
+ field public static final int POSITION_PROMPT_BELOW = 1; // 0x1
+ field public static final int WRAP_CONTENT = -2; // 0xfffffffe
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface MenuItemHoverListener {
+ method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class MenuPopupWindow extends androidx.appcompat.widget.ListPopupWindow implements androidx.appcompat.widget.MenuItemHoverListener {
+ ctor public MenuPopupWindow(android.content.Context, android.util.AttributeSet?, int, int);
+ method public void onItemHoverEnter(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void onItemHoverExit(androidx.appcompat.view.menu.MenuBuilder, android.view.MenuItem);
+ method public void setEnterTransition(Object!);
+ method public void setExitTransition(Object!);
+ method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+ method public void setTouchModal(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class MenuPopupWindow.MenuDropDownListView extends android.widget.ListView {
+ ctor public MenuPopupWindow.MenuDropDownListView(android.content.Context!, boolean);
+ method public void clearSelection();
+ method public int lookForSelectablePosition(int, boolean);
+ method public int measureHeightOfChildrenCompat(int, int, int, int, int);
+ method public boolean onForwardedEvent(android.view.MotionEvent!, int);
+ method public void setHoverListener(androidx.appcompat.widget.MenuItemHoverListener!);
+ field public static final int INVALID_POSITION = -1; // 0xffffffff
+ field public static final int NO_POSITION = -1; // 0xffffffff
+ }
+
+ public class PopupMenu {
+ ctor public PopupMenu(android.content.Context, android.view.View);
+ ctor public PopupMenu(android.content.Context, android.view.View, int);
+ ctor public PopupMenu(android.content.Context, android.view.View, int, @AttrRes int, @StyleRes int);
+ method public void dismiss();
+ method public android.view.View.OnTouchListener getDragToOpenListener();
+ method public int getGravity();
+ method public android.view.Menu getMenu();
+ method public android.view.MenuInflater getMenuInflater();
+ method public void inflate(@MenuRes int);
+ method public void setForceShowIcon(boolean);
+ method public void setGravity(int);
+ method public void setOnDismissListener(androidx.appcompat.widget.PopupMenu.OnDismissListener?);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener?);
+ method public void show();
+ }
+
+ public static interface PopupMenu.OnDismissListener {
+ method public void onDismiss(androidx.appcompat.widget.PopupMenu!);
+ }
+
+ public static interface PopupMenu.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ScrollingTabContainerView extends android.widget.HorizontalScrollView implements android.widget.AdapterView.OnItemSelectedListener {
+ ctor public ScrollingTabContainerView(android.content.Context);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, boolean);
+ method public void addTab(androidx.appcompat.app.ActionBar.Tab!, int, boolean);
+ method public void animateToTab(int);
+ method public void animateToVisibility(int);
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void onItemSelected(android.widget.AdapterView<?>!, android.view.View!, int, long);
+ method public void onMeasure(int, int);
+ method public void onNothingSelected(android.widget.AdapterView<?>!);
+ method public void removeAllTabs();
+ method public void removeTabAt(int);
+ method public void setAllowCollapse(boolean);
+ method public void setContentHeight(int);
+ method public void setTabSelected(int);
+ method public void updateTab(int);
+ field protected final androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! mVisAnimListener;
+ field protected android.view.ViewPropertyAnimator! mVisibilityAnim;
+ }
+
+ protected class ScrollingTabContainerView.VisibilityAnimListener extends android.animation.AnimatorListenerAdapter {
+ ctor protected ScrollingTabContainerView.VisibilityAnimListener();
+ method public androidx.appcompat.widget.ScrollingTabContainerView.VisibilityAnimListener! withFinalVisibility(android.view.ViewPropertyAnimator!, int);
+ }
+
+ public class SearchView extends androidx.appcompat.widget.LinearLayoutCompat implements androidx.appcompat.view.CollapsibleActionView {
+ ctor public SearchView(android.content.Context);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?);
+ ctor public SearchView(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("android:imeOptions") public int getImeOptions();
+ method public int getInputType();
+ method @androidx.resourceinspection.annotation.Attribute("android:maxWidth") public int getMaxWidth();
+ method public CharSequence! getQuery();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:queryHint") public CharSequence? getQueryHint();
+ method public androidx.cursoradapter.widget.CursorAdapter! getSuggestionsAdapter();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:iconifiedByDefault") public boolean isIconfiedByDefault();
+ method public boolean isIconified();
+ method public boolean isQueryRefinementEnabled();
+ method public boolean isSubmitButtonEnabled();
+ method public void onActionViewCollapsed();
+ method public void onActionViewExpanded();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setAppSearchData(android.os.Bundle!);
+ method public void setIconified(boolean);
+ method public void setIconifiedByDefault(boolean);
+ method public void setImeOptions(int);
+ method public void setInputType(int);
+ method public void setMaxWidth(int);
+ method public void setOnCloseListener(androidx.appcompat.widget.SearchView.OnCloseListener!);
+ method public void setOnQueryTextFocusChangeListener(android.view.View.OnFocusChangeListener!);
+ method public void setOnQueryTextListener(androidx.appcompat.widget.SearchView.OnQueryTextListener!);
+ method public void setOnSearchClickListener(android.view.View.OnClickListener!);
+ method public void setOnSuggestionListener(androidx.appcompat.widget.SearchView.OnSuggestionListener!);
+ method public void setQuery(CharSequence!, boolean);
+ method public void setQueryHint(CharSequence?);
+ method public void setQueryRefinementEnabled(boolean);
+ method public void setSearchableInfo(android.app.SearchableInfo!);
+ method public void setSubmitButtonEnabled(boolean);
+ method public void setSuggestionsAdapter(androidx.cursoradapter.widget.CursorAdapter!);
+ }
+
+ public static interface SearchView.OnCloseListener {
+ method public boolean onClose();
+ }
+
+ public static interface SearchView.OnQueryTextListener {
+ method public boolean onQueryTextChange(String!);
+ method public boolean onQueryTextSubmit(String!);
+ }
+
+ public static interface SearchView.OnSuggestionListener {
+ method public boolean onSuggestionClick(int);
+ method public boolean onSuggestionSelect(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class SearchView.SearchAutoComplete extends androidx.appcompat.widget.AppCompatAutoCompleteTextView {
+ ctor public SearchView.SearchAutoComplete(android.content.Context!);
+ ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!);
+ ctor public SearchView.SearchAutoComplete(android.content.Context!, android.util.AttributeSet!, int);
+ }
+
+ public class ShareActionProvider extends androidx.core.view.ActionProvider {
+ ctor public ShareActionProvider(android.content.Context!);
+ method public android.view.View! onCreateActionView();
+ method public void setOnShareTargetSelectedListener(androidx.appcompat.widget.ShareActionProvider.OnShareTargetSelectedListener!);
+ method public void setShareHistoryFileName(String!);
+ method public void setShareIntent(android.content.Intent!);
+ field public static final String DEFAULT_SHARE_HISTORY_FILE_NAME = "share_history.xml";
+ }
+
+ public static interface ShareActionProvider.OnShareTargetSelectedListener {
+ method public boolean onShareTargetSelected(androidx.appcompat.widget.ShareActionProvider!, android.content.Intent!);
+ }
+
+ public class SwitchCompat extends android.widget.CompoundButton implements androidx.appcompat.widget.EmojiCompatConfigurationView {
+ ctor public SwitchCompat(android.content.Context);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public SwitchCompat(android.content.Context, android.util.AttributeSet?, int);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:showText") public boolean getShowText();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:splitTrack") public boolean getSplitTrack();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchMinWidth") public int getSwitchMinWidth();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:switchPadding") public int getSwitchPadding();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOff") public CharSequence! getTextOff();
+ method @androidx.resourceinspection.annotation.Attribute("android:textOn") public CharSequence! getTextOn();
+ method @androidx.resourceinspection.annotation.Attribute("android:thumb") public android.graphics.drawable.Drawable! getThumbDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTextPadding") public int getThumbTextPadding();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTint") public android.content.res.ColorStateList? getThumbTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:thumbTintMode") public android.graphics.PorterDuff.Mode? getThumbTintMode();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:track") public android.graphics.drawable.Drawable! getTrackDrawable();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTint") public android.content.res.ColorStateList? getTrackTintList();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:trackTintMode") public android.graphics.PorterDuff.Mode? getTrackTintMode();
+ method public boolean isEmojiCompatEnabled();
+ method public void onMeasure(int, int);
+ method public void setEmojiCompatEnabled(boolean);
+ method public void setShowText(boolean);
+ method public void setSplitTrack(boolean);
+ method public void setSwitchMinWidth(int);
+ method public void setSwitchPadding(int);
+ method public void setSwitchTextAppearance(android.content.Context!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!, int);
+ method public void setSwitchTypeface(android.graphics.Typeface!);
+ method public void setTextOff(CharSequence!);
+ method public void setTextOn(CharSequence!);
+ method public void setThumbDrawable(android.graphics.drawable.Drawable!);
+ method public void setThumbResource(int);
+ method public void setThumbTextPadding(int);
+ method public void setThumbTintList(android.content.res.ColorStateList?);
+ method public void setThumbTintMode(android.graphics.PorterDuff.Mode?);
+ method public void setTrackDrawable(android.graphics.drawable.Drawable!);
+ method public void setTrackResource(int);
+ method public void setTrackTintList(android.content.res.ColorStateList?);
+ method public void setTrackTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface ThemedSpinnerAdapter extends android.widget.SpinnerAdapter {
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ public static final class ThemedSpinnerAdapter.Helper {
+ ctor public ThemedSpinnerAdapter.Helper(android.content.Context);
+ method public android.view.LayoutInflater getDropDownViewInflater();
+ method public android.content.res.Resources.Theme? getDropDownViewTheme();
+ method public void setDropDownViewTheme(android.content.res.Resources.Theme?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TintTypedArray {
+ method public boolean getBoolean(int, boolean);
+ method @RequiresApi(21) public int getChangingConfigurations();
+ method public int getColor(int, int);
+ method public android.content.res.ColorStateList! getColorStateList(int);
+ method public float getDimension(int, float);
+ method public int getDimensionPixelOffset(int, int);
+ method public int getDimensionPixelSize(int, int);
+ method public android.graphics.drawable.Drawable! getDrawable(int);
+ method public android.graphics.drawable.Drawable! getDrawableIfKnown(int);
+ method public float getFloat(int, float);
+ method public android.graphics.Typeface? getFont(@StyleableRes int, int, androidx.core.content.res.ResourcesCompat.FontCallback?);
+ method public float getFraction(int, int, int, float);
+ method public int getIndex(int);
+ method public int getIndexCount();
+ method public int getInt(int, int);
+ method public int getInteger(int, int);
+ method public int getLayoutDimension(int, String!);
+ method public int getLayoutDimension(int, int);
+ method public String! getNonResourceString(int);
+ method public String! getPositionDescription();
+ method public int getResourceId(int, int);
+ method public android.content.res.Resources! getResources();
+ method public String! getString(int);
+ method public CharSequence! getText(int);
+ method public CharSequence![]! getTextArray(int);
+ method public int getType(int);
+ method public boolean getValue(int, android.util.TypedValue!);
+ method public android.content.res.TypedArray! getWrappedTypeArray();
+ method public boolean hasValue(int);
+ method public int length();
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!);
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, android.util.AttributeSet!, int[]!, int, int);
+ method public static androidx.appcompat.widget.TintTypedArray! obtainStyledAttributes(android.content.Context!, int, int[]!);
+ method public android.util.TypedValue! peekValue(int);
+ method public void recycle();
+ }
+
+ public class Toolbar extends android.view.ViewGroup implements androidx.core.view.MenuHost {
+ ctor public Toolbar(android.content.Context);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?);
+ ctor public Toolbar(android.content.Context, android.util.AttributeSet?, int);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method @MainThread public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateDefaultLayoutParams();
+ method public androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.util.AttributeSet!);
+ method protected androidx.appcompat.widget.Toolbar.LayoutParams! generateLayoutParams(android.view.ViewGroup.LayoutParams!);
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseContentDescription") public CharSequence? getCollapseContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:collapseIcon") public android.graphics.drawable.Drawable? getCollapseIcon();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEnd") public int getContentInsetEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetEndWithActions") public int getContentInsetEndWithActions();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetLeft") public int getContentInsetLeft();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetRight") public int getContentInsetRight();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStart") public int getContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:contentInsetStartWithNavigation") public int getContentInsetStartWithNavigation();
+ method public int getCurrentContentInsetEnd();
+ method public int getCurrentContentInsetLeft();
+ method public int getCurrentContentInsetRight();
+ method public int getCurrentContentInsetStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logo") public android.graphics.drawable.Drawable! getLogo();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:logoDescription") public CharSequence! getLogoDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:menu") public android.view.Menu! getMenu();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationContentDescription") public CharSequence? getNavigationContentDescription();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:navigationIcon") public android.graphics.drawable.Drawable? getNavigationIcon();
+ method public android.graphics.drawable.Drawable? getOverflowIcon();
+ method @StyleRes @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:popupTheme") public int getPopupTheme();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:subtitle") public CharSequence! getSubtitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:title") public CharSequence! getTitle();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginBottom") public int getTitleMarginBottom();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginEnd") public int getTitleMarginEnd();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginStart") public int getTitleMarginStart();
+ method @androidx.resourceinspection.annotation.Attribute("androidx.appcompat:titleMarginTop") public int getTitleMarginTop();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.appcompat.widget.DecorToolbar! getWrapper();
+ method public boolean hasExpandedActionView();
+ method public boolean hideOverflowMenu();
+ method public void inflateMenu(@MenuRes int);
+ method @MainThread public void invalidateMenu();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean isTitleTruncated();
+ method @MainThread public void removeMenuProvider(androidx.core.view.MenuProvider);
+ method public void setCollapseContentDescription(@StringRes int);
+ method public void setCollapseContentDescription(CharSequence?);
+ method public void setCollapseIcon(@DrawableRes int);
+ method public void setCollapseIcon(android.graphics.drawable.Drawable?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setCollapsible(boolean);
+ method public void setContentInsetEndWithActions(int);
+ method public void setContentInsetStartWithNavigation(int);
+ method public void setContentInsetsAbsolute(int, int);
+ method public void setContentInsetsRelative(int, int);
+ method public void setLogo(@DrawableRes int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setLogoDescription(@StringRes int);
+ method public void setLogoDescription(CharSequence!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setNavigationContentDescription(@StringRes int);
+ method public void setNavigationContentDescription(CharSequence?);
+ method public void setNavigationIcon(@DrawableRes int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable?);
+ method public void setNavigationOnClickListener(android.view.View.OnClickListener!);
+ method public void setOnMenuItemClickListener(androidx.appcompat.widget.Toolbar.OnMenuItemClickListener!);
+ method public void setOverflowIcon(android.graphics.drawable.Drawable?);
+ method public void setPopupTheme(@StyleRes int);
+ method public void setSubtitle(@StringRes int);
+ method public void setSubtitle(CharSequence!);
+ method public void setSubtitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setSubtitleTextColor(@ColorInt int);
+ method public void setSubtitleTextColor(android.content.res.ColorStateList);
+ method public void setTitle(@StringRes int);
+ method public void setTitle(CharSequence!);
+ method public void setTitleMargin(int, int, int, int);
+ method public void setTitleMarginBottom(int);
+ method public void setTitleMarginEnd(int);
+ method public void setTitleMarginStart(int);
+ method public void setTitleMarginTop(int);
+ method public void setTitleTextAppearance(android.content.Context!, @StyleRes int);
+ method public void setTitleTextColor(@ColorInt int);
+ method public void setTitleTextColor(android.content.res.ColorStateList);
+ method public boolean showOverflowMenu();
+ }
+
+ public static class Toolbar.LayoutParams extends androidx.appcompat.app.ActionBar.LayoutParams {
+ ctor public Toolbar.LayoutParams(android.content.Context, android.util.AttributeSet!);
+ ctor public Toolbar.LayoutParams(int, int);
+ ctor public Toolbar.LayoutParams(int, int, int);
+ ctor public Toolbar.LayoutParams(int);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.widget.Toolbar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(androidx.appcompat.app.ActionBar.LayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.MarginLayoutParams!);
+ ctor public Toolbar.LayoutParams(android.view.ViewGroup.LayoutParams!);
+ }
+
+ public static interface Toolbar.OnMenuItemClickListener {
+ method public boolean onMenuItemClick(android.view.MenuItem!);
+ }
+
+ public static class Toolbar.SavedState extends androidx.customview.view.AbsSavedState {
+ ctor public Toolbar.SavedState(android.os.Parcel!);
+ ctor public Toolbar.SavedState(android.os.Parcel!, ClassLoader!);
+ ctor public Toolbar.SavedState(android.os.Parcelable!);
+ field public static final android.os.Parcelable.Creator<androidx.appcompat.widget.Toolbar.SavedState!>! CREATOR;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ToolbarWidgetWrapper implements androidx.appcompat.widget.DecorToolbar {
+ ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean);
+ ctor public ToolbarWidgetWrapper(androidx.appcompat.widget.Toolbar!, boolean, int, int);
+ method public void animateToVisibility(int);
+ method public boolean canShowOverflowMenu();
+ method public void collapseActionView();
+ method public void dismissPopupMenus();
+ method public android.content.Context! getContext();
+ method public android.view.View! getCustomView();
+ method public int getDisplayOptions();
+ method public int getDropdownItemCount();
+ method public int getDropdownSelectedPosition();
+ method public int getHeight();
+ method public android.view.Menu! getMenu();
+ method public int getNavigationMode();
+ method public CharSequence! getSubtitle();
+ method public CharSequence! getTitle();
+ method public android.view.ViewGroup! getViewGroup();
+ method public int getVisibility();
+ method public boolean hasEmbeddedTabs();
+ method public boolean hasExpandedActionView();
+ method public boolean hasIcon();
+ method public boolean hasLogo();
+ method public boolean hideOverflowMenu();
+ method public void initIndeterminateProgress();
+ method public void initProgress();
+ method public boolean isOverflowMenuShowPending();
+ method public boolean isOverflowMenuShowing();
+ method public boolean isTitleTruncated();
+ method public void restoreHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void saveHierarchyState(android.util.SparseArray<android.os.Parcelable!>!);
+ method public void setBackgroundDrawable(android.graphics.drawable.Drawable!);
+ method public void setCollapsible(boolean);
+ method public void setCustomView(android.view.View!);
+ method public void setDefaultNavigationContentDescription(int);
+ method public void setDefaultNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setDisplayOptions(int);
+ method public void setDropdownParams(android.widget.SpinnerAdapter!, android.widget.AdapterView.OnItemSelectedListener!);
+ method public void setDropdownSelectedPosition(int);
+ method public void setEmbeddedTabView(androidx.appcompat.widget.ScrollingTabContainerView!);
+ method public void setHomeButtonEnabled(boolean);
+ method public void setIcon(int);
+ method public void setIcon(android.graphics.drawable.Drawable!);
+ method public void setLogo(int);
+ method public void setLogo(android.graphics.drawable.Drawable!);
+ method public void setMenu(android.view.Menu!, androidx.appcompat.view.menu.MenuPresenter.Callback!);
+ method public void setMenuCallbacks(androidx.appcompat.view.menu.MenuPresenter.Callback!, androidx.appcompat.view.menu.MenuBuilder.Callback!);
+ method public void setMenuPrepared();
+ method public void setNavigationContentDescription(CharSequence!);
+ method public void setNavigationContentDescription(int);
+ method public void setNavigationIcon(android.graphics.drawable.Drawable!);
+ method public void setNavigationIcon(int);
+ method public void setNavigationMode(int);
+ method public void setSubtitle(CharSequence!);
+ method public void setTitle(CharSequence!);
+ method public void setVisibility(int);
+ method public void setWindowCallback(android.view.Window.Callback!);
+ method public void setWindowTitle(CharSequence!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setupAnimatorToVisibility(int, long);
+ method public boolean showOverflowMenu();
+ }
+
+ public class TooltipCompat {
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewStubCompat extends android.view.View {
+ ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?);
+ ctor public ViewStubCompat(android.content.Context, android.util.AttributeSet?, int);
+ method public int getInflatedId();
+ method public android.view.LayoutInflater! getLayoutInflater();
+ method public int getLayoutResource();
+ method public android.view.View! inflate();
+ method public void setInflatedId(int);
+ method public void setLayoutInflater(android.view.LayoutInflater!);
+ method public void setLayoutResource(int);
+ method public void setOnInflateListener(androidx.appcompat.widget.ViewStubCompat.OnInflateListener!);
+ }
+
+ public static interface ViewStubCompat.OnInflateListener {
+ method public void onInflate(androidx.appcompat.widget.ViewStubCompat!, android.view.View!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ViewUtils {
+ method public static void computeFitSystemWindows(android.view.View!, android.graphics.Rect!, android.graphics.Rect!);
+ method public static boolean isLayoutRtl(android.view.View!);
+ method public static void makeOptionalFitsSystemWindows(android.view.View!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WithHint {
+ method public CharSequence? getHint();
+ }
+
+}
+
diff --git a/appcompat/appcompat/build.gradle b/appcompat/appcompat/build.gradle
index fa5e291..84e135d 100644
--- a/appcompat/appcompat/build.gradle
+++ b/appcompat/appcompat/build.gradle
@@ -10,11 +10,11 @@
}
dependencies {
- api("androidx.annotation:annotation:1.3.0-alpha01")
+ api(project(":annotation:annotation"))
api(project(":core:core"))
- implementation(project(":emoji2:emoji2"))
- implementation(project(":emoji2:emoji2-views-helper"))
+ implementation("androidx.emoji2:emoji2:1.0.0-beta01")
+ implementation("androidx.emoji2:emoji2-views-helper:1.0.0-beta01")
implementation("androidx.collection:collection:1.0.0")
api("androidx.cursoradapter:cursoradapter:1.0.0")
api("androidx.activity:activity:1.2.4")
@@ -23,10 +23,10 @@
api("androidx.drawerlayout:drawerlayout:1.0.0")
implementation("androidx.lifecycle:lifecycle-runtime:2.3.1")
implementation("androidx.lifecycle:lifecycle-viewmodel:2.3.1")
- implementation(project(":resourceinspection:resourceinspection-annotation"))
+ implementation("androidx.resourceinspection:resourceinspection-annotation:1.0.0-beta01")
api("androidx.savedstate:savedstate:1.1.0")
- kapt(project(":resourceinspection:resourceinspection-processor"))
+ kapt("androidx.resourceinspection:resourceinspection-processor:1.0.0-beta01")
androidTestImplementation(libs.kotlinStdlib)
androidTestImplementation(libs.testExtJunit)
diff --git a/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarAccessibilityTestCase.kt b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarAccessibilityTestCase.kt
new file mode 100644
index 0000000..2efbe44
--- /dev/null
+++ b/appcompat/appcompat/src/androidTest/java/androidx/appcompat/widget/ToolbarAccessibilityTestCase.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.appcompat.widget
+
+import androidx.appcompat.test.R
+import androidx.test.core.app.ActivityScenario
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import org.junit.Assert.assertEquals
+import org.junit.Test
+
+@MediumTest
+public class ToolbarAccessibilityTestCase {
+
+ /**
+ * Test for b/200845656 which propagates the nav button's content description to its tooltip.
+ */
+ @SdkSuppress(minSdkVersion = 28)
+ @Test
+ public fun testSetNavigationContentDescriptionSetsTooltip() {
+ ActivityScenario.launch(ToolbarTestActivity::class.java).onActivity { activity ->
+ val toolbar: Toolbar = activity.requireViewById(R.id.toolbar)
+ val expectedString = "TEST"
+ toolbar.navigationContentDescription = expectedString
+
+ assertEquals(expectedString, toolbar.navButtonView?.tooltipText)
+ }
+ }
+}
diff --git a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
index 9579fd3..1f2a964 100644
--- a/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
+++ b/appcompat/appcompat/src/main/java/androidx/appcompat/widget/Toolbar.java
@@ -972,6 +972,7 @@
}
if (mNavButtonView != null) {
mNavButtonView.setContentDescription(description);
+ TooltipCompat.setTooltipText(mNavButtonView, description);
}
}
@@ -1524,6 +1525,17 @@
}
}
+ /**
+ * Returns the navigation button view.
+ *
+ * @hide Only for use in tests.
+ */
+ @RestrictTo(RestrictTo.Scope.TESTS)
+ @Nullable
+ View getNavButtonView() {
+ return mNavButtonView;
+ }
+
void ensureCollapseButtonView() {
if (mCollapseButtonView == null) {
mCollapseButtonView = new AppCompatImageButton(getContext(), null,
diff --git a/appcompat/appcompat/src/main/res/values-te/strings.xml b/appcompat/appcompat/src/main/res/values-te/strings.xml
index 9d7b606..fee0598 100644
--- a/appcompat/appcompat/src/main/res/values-te/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-te/strings.xml
@@ -22,11 +22,11 @@
<string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"మరిన్ని ఆప్షన్లు"</string>
<string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"కుదిస్తుంది"</string>
<string name="abc_searchview_description_search" msgid="3417662926640357176">"సెర్చ్"</string>
- <string name="abc_search_hint" msgid="7208076849092622260">"వెతకండి…"</string>
- <string name="abc_searchview_description_query" msgid="693312494995508443">"శోధన ప్రశ్న"</string>
+ <string name="abc_search_hint" msgid="7208076849092622260">"సెర్చ్ చేయండి…"</string>
+ <string name="abc_searchview_description_query" msgid="693312494995508443">"సెర్చ్ క్వెరీ"</string>
<string name="abc_searchview_description_clear" msgid="3741173234950517107">"ప్రశ్నను తీసివేస్తుంది"</string>
<string name="abc_searchview_description_submit" msgid="1486535517437947103">"ప్రశ్నని సమర్పిస్తుంది"</string>
- <string name="abc_searchview_description_voice" msgid="2293578557972875415">"వాయిస్ శోధన"</string>
+ <string name="abc_searchview_description_voice" msgid="2293578557972875415">"వాయిస్ సెర్చ్"</string>
<string name="abc_activitychooserview_choose_application" msgid="2165779757652331008">"యాప్ను ఎంచుకోండి"</string>
<string name="abc_activity_chooser_view_see_all" msgid="1189761859438369441">"అన్నీ చూడండి"</string>
<string name="abc_shareactionprovider_share_with_application" msgid="9055268688411532828">"<xliff:g id="APPLICATION_NAME">%s</xliff:g>తో షేర్ చేస్తుంది"</string>
diff --git a/appsearch/appsearch-debug-view/samples/lint-baseline.xml b/appsearch/appsearch-debug-view/samples/lint-baseline.xml
new file mode 100644
index 0000000..6ee30d3
--- /dev/null
+++ b/appsearch/appsearch-debug-view/samples/lint-baseline.xml
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha07" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha07)" variant="all" version="7.1.0-alpha07">
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" platformResult.getResultCode(), platformResult.getErrorMessage());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/AppSearchResultToPlatformConverter.java"
+ line="55"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" platformResult.getResultCode(), platformResult.getErrorMessage()));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/AppSearchResultToPlatformConverter.java"
+ line="72"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" failure.getValue().getResultCode(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/AppSearchResultToPlatformConverter.java"
+ line="99"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" result.getResultCode(), result.getErrorMessage()));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java"
+ line="228"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" result.getResultCode(), result.getErrorMessage()));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/PlatformStorage.java"
+ line="253"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(stringProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="86"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: StringPropertyConfig.INDEXING_TYPE_NONE, StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS, StringPropertyConfig.INDEXING_TYPE_PREFIXES"
+ errorLine1=" .setIndexingType(stringProperty.getIndexingType())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="87"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: StringPropertyConfig.TOKENIZER_TYPE_NONE, StringPropertyConfig.TOKENIZER_TYPE_PLAIN"
+ errorLine1=" .setTokenizerType(stringProperty.getTokenizerType())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="88"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(jetpackProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="93"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(jetpackProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="98"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(jetpackProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="103"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(jetpackProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="108"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(documentProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="115"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(stringProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="133"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: StringPropertyConfig.INDEXING_TYPE_NONE, StringPropertyConfig.INDEXING_TYPE_EXACT_TERMS, StringPropertyConfig.INDEXING_TYPE_PREFIXES"
+ errorLine1=" .setIndexingType(stringProperty.getIndexingType())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="134"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: StringPropertyConfig.TOKENIZER_TYPE_NONE, StringPropertyConfig.TOKENIZER_TYPE_PLAIN"
+ errorLine1=" .setTokenizerType(stringProperty.getTokenizerType())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="135"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(platformProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="140"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(platformProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="145"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(platformProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="150"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(platformProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="155"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: PropertyConfig.CARDINALITY_REPEATED, PropertyConfig.CARDINALITY_OPTIONAL, PropertyConfig.CARDINALITY_REQUIRED"
+ errorLine1=" .setCardinality(documentProperty.getCardinality())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SchemaToPlatformConverter.java"
+ line="164"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" new AppSearchException(result.getResultCode(), result.getErrorMessage()));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/SearchResultsImpl.java"
+ line="71"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: AppSearchResult.RESULT_OK, AppSearchResult.RESULT_UNKNOWN_ERROR, AppSearchResult.RESULT_INTERNAL_ERROR, AppSearchResult.RESULT_INVALID_ARGUMENT, AppSearchResult.RESULT_IO_ERROR, AppSearchResult.RESULT_OUT_OF_SPACE, AppSearchResult.RESULT_NOT_FOUND, AppSearchResult.RESULT_INVALID_SCHEMA, AppSearchResult.RESULT_SECURITY_ERROR"
+ errorLine1=" platformResult.getResultCode(), platformResult.getErrorMessage()));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/SearchSessionImpl.java"
+ line="258"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: SearchSpec.TERM_MATCH_EXACT_ONLY, SearchSpec.TERM_MATCH_PREFIX"
+ errorLine1=" .setTermMatch(jetpackSearchSpec.getTermMatch())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java"
+ line="49"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: SearchSpec.RANKING_STRATEGY_NONE, SearchSpec.RANKING_STRATEGY_DOCUMENT_SCORE, SearchSpec.RANKING_STRATEGY_CREATION_TIMESTAMP, SearchSpec.RANKING_STRATEGY_RELEVANCE_SCORE, SearchSpec.RANKING_STRATEGY_USAGE_COUNT, SearchSpec.RANKING_STRATEGY_USAGE_LAST_USED_TIMESTAMP, SearchSpec.RANKING_STRATEGY_SYSTEM_USAGE_COUNT, SearchSpec.RANKING_STRATEGY_SYSTEM_USAGE_LAST_USED_TIMESTAMP"
+ errorLine1=" .setRankingStrategy(jetpackSearchSpec.getRankingStrategy())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java"
+ line="54"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: SearchSpec.ORDER_DESCENDING, SearchSpec.ORDER_ASCENDING"
+ errorLine1=" .setOrder(jetpackSearchSpec.getOrder())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java"
+ line="55"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: SearchSpec.GROUPING_TYPE_PER_PACKAGE, SearchSpec.GROUPING_TYPE_PER_NAMESPACE"
+ errorLine1=" jetpackSearchSpec.getResultGroupingTypeFlags(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appsearch/platformstorage/converter/SearchSpecToPlatformConverter.java"
+ line="61"
+ column="21"/>
+ </issue>
+
+</issues>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-af/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-af/strings.xml
index 51f5f48..1ea13be 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-af/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-af/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Geen AppSearch-dokumente in databasis gekry nie. Verifieer dat die databasisnaam geldig is en die regte bergingtipe gekies is."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Geen AppSearch-skematipes gekry nie. Verifieer dat die databasisnaam geldig is en die regte bergingtipe gekies is."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Laai tans AppSearch-dokumente …"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Laai tans AppSearch-skematipes …"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Skemaweergawe: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Geen AppSearch-dokumente in databasis gekry nie. Verifieer dat die databasisnaam geldig is en die regte bergingtipe gekies is."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Geen AppSearch-skematipes gekry nie. Verifieer dat die databasisnaam geldig is en die regte bergingtipe gekies is."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Laai tans AppSearch-dokumente …"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Laai tans AppSearch-skematipes …"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Skemaweergawe: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-am/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-am/strings.xml
index cb135d5..c87cab4 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-am/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-am/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"በመረጃ ጎታ ውስጥ ምንም የመተግበሪያ ፍለጋ ሰነዶች አልተገኙም። የመረጃ ጎታ ስም ትክክለኛ መሆኑን እና ትክክለኛው የማከማቻ ዓይነት መመረጡን ያረጋግጡ።"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"ምንም የመተግበሪያ ፍለጋ የንድፍ አይነቶች አልተገኙም። የመረጃ ጎታ ስም ትክክለኛ መሆኑን እና ትክክለኛው የማከማቻ ዓይነት መመረጡን ያረጋግጡ።"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"የመተግበሪያ ፍለጋ ሰነዶችን በመጫን ላይ..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"የመተግበሪያ ፍለጋ የንድፍ ዓይነቶችን በመጫን ላይ..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"የንድፍ ስሪት፦ %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"በመረጃ ጎታ ውስጥ ምንም የመተግበሪያ ፍለጋ ሰነዶች አልተገኙም። የመረጃ ጎታ ስም ትክክለኛ መሆኑን እና ትክክለኛው የማከማቻ ዓይነት መመረጡን ያረጋግጡ።"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"ምንም የመተግበሪያ ፍለጋ የንድፍ አይነቶች አልተገኙም። የመረጃ ጎታ ስም ትክክለኛ መሆኑን እና ትክክለኛው የማከማቻ ዓይነት መመረጡን ያረጋግጡ።"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"የመተግበሪያ ፍለጋ ሰነዶችን በመጫን ላይ..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"የመተግበሪያ ፍለጋ የንድፍ ዓይነቶችን በመጫን ላይ..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"የንድፍ ስሪት፦ %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ar/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ar/strings.xml
index ea253a8..05642bf 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ar/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ar/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"لم يتم العثور على مستندات AppSearch في قاعدة البيانات. تأكّد من أن اسم قاعدة البيانات صالح ومن اختيار نوع وحدة تخزين صحيح."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"لم يتم العثور على أنواع مخططات AppSearch. تأكّد من أن اسم قاعدة البيانات صالح ومن اختيار نوع وحدة تخزين صحيح."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"جارٍ تحميل مستندات AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"جارٍ تحميل أنواع مخططات AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"إصدار المخطط: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"لم يتم العثور على مستندات AppSearch في قاعدة البيانات. تأكّد من أن اسم قاعدة البيانات صالح ومن اختيار نوع وحدة تخزين صحيح."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"لم يتم العثور على أنواع مخططات AppSearch. تأكّد من أن اسم قاعدة البيانات صالح ومن اختيار نوع وحدة تخزين صحيح."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"جارٍ تحميل مستندات AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"جارٍ تحميل أنواع مخططات AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"إصدار المخطط: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-as/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-as/strings.xml
index a2d4396..5273b5c 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-as/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-as/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ডেটাবেছত কোনো AppSearchৰ নথি পোৱা নগ’ল। সত্যাপন কৰক যে ডেটাবেছৰ নামটো মান্য আৰু ষ্ট’ৰেজৰ সঠিক প্ৰকাৰটো বাছনি কৰা হৈছে।"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearchৰ স্কীমাৰ কোনো প্ৰকাৰ পোৱা নগ’ল। সত্যাপন কৰক যে ডেটাবেছৰ নামটো মান্য আৰু ষ্ট’ৰেজৰ সঠিক প্ৰকাৰটো বাছনি কৰা হৈছে।"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearchৰ নথি ল’ড কৰি থকা হৈছে..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearchৰ স্কীমাৰ প্ৰকাৰ ল’ড কৰি থকা হৈছে..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"স্কীমাৰ সংস্কৰণ: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ডেটাবেছত কোনো AppSearchৰ নথি পোৱা নগ’ল। সত্যাপন কৰক যে ডেটাবেছৰ নামটো মান্য আৰু ষ্ট’ৰেজৰ সঠিক প্ৰকাৰটো বাছনি কৰা হৈছে।"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearchৰ স্কীমাৰ কোনো প্ৰকাৰ পোৱা নগ’ল। সত্যাপন কৰক যে ডেটাবেছৰ নামটো মান্য আৰু ষ্ট’ৰেজৰ সঠিক প্ৰকাৰটো বাছনি কৰা হৈছে।"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearchৰ নথি ল’ড কৰি থকা হৈছে..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearchৰ স্কীমাৰ প্ৰকাৰ ল’ড কৰি থকা হৈছে..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"স্কীমাৰ সংস্কৰণ: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-az/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-az/strings.xml
index b7744fe..33abd97 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-az/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-az/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Data bazasında AppSearch sənədləri tapılmadı. Data bazası adının doğru olduğunu və düzgün yaddaş növünün seçildiyini doğrulayın."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch sxem növləri tapılmadı. Data bazası adının doğru olduğunu və düzgün yaddaş növünün seçildiyini doğrulayın."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch sənədləri yüklənir..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch sxem növləri yüklənir..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Sxem Versiyası: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Data bazasında AppSearch sənədləri tapılmadı. Data bazası adının doğru olduğunu və düzgün yaddaş növünün seçildiyini doğrulayın."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch sxem növləri tapılmadı. Data bazası adının doğru olduğunu və düzgün yaddaş növünün seçildiyini doğrulayın."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch sənədləri yüklənir..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch sxem növləri yüklənir..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Sxem Versiyası: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-b+sr+Latn/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-b+sr+Latn/strings.xml
index b1344d4..f8d4a09 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-b+sr+Latn/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-b+sr+Latn/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Nije pronađet nijedan AppSearch dokument u bazi podataka. Verifikujte da je baza podataka važeća i da je izabran ispravan tip memorijskog prostora."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nije pronađen nijedan tip AppSearch šeme. Verifikujte da je baza podataka važeća i da je izabran ispravan tip memorijskog prostora."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Učitavaju se AppSearch dokumenti..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Tipovi AppSearch šeme se učitavaju..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Verzija šeme: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nije pronađet nijedan AppSearch dokument u bazi podataka. Verifikujte da je baza podataka važeća i da je izabran ispravan tip memorijskog prostora."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nije pronađen nijedan tip AppSearch šeme. Verifikujte da je baza podataka važeća i da je izabran ispravan tip memorijskog prostora."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Učitavaju se AppSearch dokumenti..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Tipovi AppSearch šeme se učitavaju..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Verzija šeme: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-be/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-be/strings.xml
index 461f4e4..e9690459 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-be/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-be/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Дакументы AppSearch не знойдзены ў базе даных. Пераканайцеся ў тым, што вы ўвялі сапраўдную назву базы даных і выбралі правільны тып сховішча."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Тыпы схемы AppSearch не знойдзены. Пераканайцеся ў тым, што вы ўвялі сапраўдную назву базы даных і выбралі правільны тып сховішча."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Загрузка дакументаў AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Загрузка тыпаў схемы AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Версія схемы: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Дакументы AppSearch не знойдзены ў базе даных. Пераканайцеся ў тым, што вы ўвялі сапраўдную назву базы даных і выбралі правільны тып сховішча."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Тыпы схемы AppSearch не знойдзены. Пераканайцеся ў тым, што вы ўвялі сапраўдную назву базы даных і выбралі правільны тып сховішча."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Загрузка дакументаў AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Загрузка тыпаў схемы AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Версія схемы: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-bg/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-bg/strings.xml
index 8773eb6..52cf8e5 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-bg/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-bg/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"В базата от данни не бяха намерени документи от AppSearch. Уверете се, че името на базата от данни е валидно и сте избрали правилния тип на хранилището."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Не бяха открити типове схема за AppSearch. Уверете се, че името на базата от данни е валидно и сте избрали правилния тип на хранилището."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Документите от AppSearch се зареждат…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Типовете схема за AppSearch се зареждат…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Версия на схемата: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"В базата от данни не бяха намерени документи от AppSearch. Уверете се, че името на базата от данни е валидно и сте избрали правилния тип на хранилището."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Не бяха открити типове схема за AppSearch. Уверете се, че името на базата от данни е валидно и сте избрали правилния тип на хранилището."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Документите от AppSearch се зареждат…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Типовете схема за AppSearch се зареждат…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Версия на схемата: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-bn/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-bn/strings.xml
index 0ff4244..9664463 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-bn/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-bn/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ডেটাবেসে AppSearch-এর কোনও ডকুমেন্ট খুঁজে পাওয়া যায়নি। ডেটাবেসের নাম ঠিক আছে এবং স্টোরেজের সঠিক ধরন সঠিক বেছে নেওয়া হয়েছে কিনা তা যাচাই করুন।"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"কোনও AppSearch স্কিমা খুঁজে পাওয়া যায়নি। ডেটাবেসের নাম ঠিক আছে এবং স্টোরেজের সঠিক ধরন সঠিক বেছে নেওয়া হয়েছে কিনা তা যাচাই করুন।"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch-এর ডকুমেন্ট লোড করা হচ্ছে..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"বিভিন্ন ধরনের AppSearch স্কিমা লোড করা হচ্ছে..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"স্কিমা ভার্সন: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ডেটাবেসে AppSearch-এর কোনও ডকুমেন্ট খুঁজে পাওয়া যায়নি। ডেটাবেসের নাম ঠিক আছে এবং স্টোরেজের সঠিক ধরন সঠিক বেছে নেওয়া হয়েছে কিনা তা যাচাই করুন।"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"কোনও AppSearch স্কিমা খুঁজে পাওয়া যায়নি। ডেটাবেসের নাম ঠিক আছে এবং স্টোরেজের সঠিক ধরন সঠিক বেছে নেওয়া হয়েছে কিনা তা যাচাই করুন।"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch-এর ডকুমেন্ট লোড করা হচ্ছে..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"বিভিন্ন ধরনের AppSearch স্কিমা লোড করা হচ্ছে..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"স্কিমা ভার্সন: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-bs/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-bs/strings.xml
index 5c643b0..ccba55e 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-bs/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-bs/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Nijedan dokument na usluzi AppSearch nije pronađen u bazi podataka. Potvrdite da je naziv baze podataka važeći i da je odabrana ispravna vrsta pohrane."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nije pronađena nijedna vrsta šema na usluzi AppSearch. Potvrdite da je naziv baze podataka važeći i da je odabrana ispravna vrsta pohrane."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Učitavanje dokumenata na usluzi AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Učitavanje vrsta šema na usluzi AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Verzija šeme: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nijedan dokument na usluzi AppSearch nije pronađen u bazi podataka. Potvrdite da je naziv baze podataka važeći i da je odabrana ispravna vrsta pohrane."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nije pronađena nijedna vrsta šema na usluzi AppSearch. Potvrdite da je naziv baze podataka važeći i da je odabrana ispravna vrsta pohrane."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Učitavanje dokumenata na usluzi AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Učitavanje vrsta šema na usluzi AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Verzija šeme: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ca/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ca/strings.xml
index 6e81fa0..565c186 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ca/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ca/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No s\'ha trobat cap document d\'AppSearch a la base de dades. Comprova que el nom de la base de dades sigui vàlid i que hagis seleccionat el tipus d\'emmagatzematge correcte."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No s\'ha trobat cap tipus d\'esquema d\'AppSearch. Comprova que el nom de la base de dades sigui vàlid i que hagis seleccionat el tipus d\'emmagatzematge correcte."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"S\'estan carregant els documents d\'AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"S\'estan carregant els tipus d\'esquema d\'AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versió de l\'esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No s\'ha trobat cap document d\'AppSearch a la base de dades. Comprova que el nom de la base de dades sigui vàlid i que hagis seleccionat el tipus d\'emmagatzematge correcte."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No s\'ha trobat cap tipus d\'esquema d\'AppSearch. Comprova que el nom de la base de dades sigui vàlid i que hagis seleccionat el tipus d\'emmagatzematge correcte."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"S\'estan carregant els documents d\'AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"S\'estan carregant els tipus d\'esquema d\'AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versió de l\'esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-cs/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-cs/strings.xml
index 162dfa0..c1c4707 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-cs/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-cs/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"V databázi nebyly nalezeny žádné dokumenty AppSearch. Zkontrolujte, zda je název databáze platný a zda byl vybrán správný typ úložiště."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nebyly nalezeny žádné typy schémat AppSearch. Zkontrolujte, zda je název databáze platný a zda byl vybrán správný typ úložiště."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Načítání dokumentů AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Načítání typů schémat AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Verze schématu: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"V databázi nebyly nalezeny žádné dokumenty AppSearch. Zkontrolujte, zda je název databáze platný a zda byl vybrán správný typ úložiště."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nebyly nalezeny žádné typy schémat AppSearch. Zkontrolujte, zda je název databáze platný a zda byl vybrán správný typ úložiště."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Načítání dokumentů AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Načítání typů schémat AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Verze schématu: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-da/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-da/strings.xml
index 54bccbc..160ec59 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-da/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-da/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Der blev ikke fundet nogen AppSearch-dokumenter i databasen. Bekræft, at databasens navn er gyldigt, og at du har valgt den korrekte lagertype."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Der blev ikke fundet nogen AppSearch-skematyper. Bekræft, at databasens navn er gyldigt, og at du har valgt den korrekte lagertype."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Indlæser AppSearch-dokumenter…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Indlæser AppSearch-skematyper…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Skemaversion: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Der blev ikke fundet nogen AppSearch-dokumenter i databasen. Bekræft, at databasens navn er gyldigt, og at du har valgt den korrekte lagertype."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Der blev ikke fundet nogen AppSearch-skematyper. Bekræft, at databasens navn er gyldigt, og at du har valgt den korrekte lagertype."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Indlæser AppSearch-dokumenter…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Indlæser AppSearch-skematyper…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Skemaversion: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-de/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-de/strings.xml
index 04b2784..ef7662e 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-de/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-de/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"In der Datenbank wurden keine AppSearch-Dokumente gefunden. Überprüfe, ob der Name der Datenbank gültig ist und der richtige Speichertyp ausgewählt wurde."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Es wurden keine AppSearch-Schematypen gefunden. Überprüfe, ob der Name der Datenbank gültig ist und der richtige Speichertyp ausgewählt wurde."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch-Dokumente werden geladen…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch-Schematypen werden geladen…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schemaversion: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"In der Datenbank wurden keine AppSearch-Dokumente gefunden. Überprüfe, ob der Name der Datenbank gültig ist und der richtige Speichertyp ausgewählt wurde."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Es wurden keine AppSearch-Schematypen gefunden. Überprüfe, ob der Name der Datenbank gültig ist und der richtige Speichertyp ausgewählt wurde."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch-Dokumente werden geladen…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch-Schematypen werden geladen…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schemaversion: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-el/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-el/strings.xml
index 11e3c8b..4364cc0 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-el/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-el/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Δεν βρέθηκαν έγγραφα AppSearch στη βάση δεδομένων. Επαληθεύστε ότι το όνομα της βάσης δεδομένων είναι έγκυρο και ότι έχει επιλεγεί ο σωστός τύπος αποθηκευτικού χώρου."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Δεν βρέθηκαν τύποι σχήματος AppSearch. Επαληθεύστε ότι το όνομα της βάσης δεδομένων είναι έγκυρο και ότι έχει επιλεγεί ο σωστός τύπος αποθηκευτικού χώρου."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Φόρτωση εγγράφων AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Φόρτωση τύπων σχήματος AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Έκδοση σχήματος: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Δεν βρέθηκαν έγγραφα AppSearch στη βάση δεδομένων. Επαληθεύστε ότι το όνομα της βάσης δεδομένων είναι έγκυρο και ότι έχει επιλεγεί ο σωστός τύπος αποθηκευτικού χώρου."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Δεν βρέθηκαν τύποι σχήματος AppSearch. Επαληθεύστε ότι το όνομα της βάσης δεδομένων είναι έγκυρο και ότι έχει επιλεγεί ο σωστός τύπος αποθηκευτικού χώρου."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Φόρτωση εγγράφων AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Φόρτωση τύπων σχήματος AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Έκδοση σχήματος: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-en-rAU/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-en-rAU/strings.xml
index 81d3a2d..a166069 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-en-rAU/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-en-rAU/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Loading AppSearch documents…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Loading AppSearch schema types…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schema version: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Loading AppSearch documents…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Loading AppSearch schema types…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schema version: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-en-rCA/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-en-rCA/strings.xml
index 81d3a2d..a166069 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-en-rCA/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-en-rCA/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Loading AppSearch documents…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Loading AppSearch schema types…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schema version: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Loading AppSearch documents…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Loading AppSearch schema types…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schema version: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-en-rGB/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-en-rGB/strings.xml
index 81d3a2d..a166069 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-en-rGB/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-en-rGB/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Loading AppSearch documents…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Loading AppSearch schema types…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schema version: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Loading AppSearch documents…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Loading AppSearch schema types…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schema version: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-en-rIN/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-en-rIN/strings.xml
index 81d3a2d..a166069 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-en-rIN/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-en-rIN/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Loading AppSearch documents…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Loading AppSearch schema types…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schema version: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No AppSearch documents found in database. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No AppSearch schema types found. Verify that the database name is valid and that the correct storage type was selected."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Loading AppSearch documents…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Loading AppSearch schema types…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schema version: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-en-rXC/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-en-rXC/strings.xml
index b65f0b8..ccce78f 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-en-rXC/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-en-rXC/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No AppSearch documents found in database. Verify that the database name is valid and the correct storage type was selected."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No AppSearch schema types found. Verify that the database name is valid and the correct storage type was selected."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Loading AppSearch documents..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Loading AppSearch schema types..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schema Version: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No AppSearch documents found in database. Verify that the database name is valid and the correct storage type was selected."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No AppSearch schema types found. Verify that the database name is valid and the correct storage type was selected."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Loading AppSearch documents..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Loading AppSearch schema types..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schema Version: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-es-rUS/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-es-rUS/strings.xml
index 432a7b6..9834289 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-es-rUS/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-es-rUS/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No se encontró ningún documento de AppSearch en la base de datos. Verifica que el nombre de la base de datos sea válido y que hayas seleccionado el tipo de almacenamiento correcto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No se encontró ningún tipo de esquema de AppSearch. Verifica que el nombre de la base de datos sea válido y que hayas seleccionado el tipo de almacenamiento correcto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Cargando documentos de AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Cargando tipos de esquema de AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versión del esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No se encontró ningún documento de AppSearch en la base de datos. Verifica que el nombre de la base de datos sea válido y que hayas seleccionado el tipo de almacenamiento correcto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No se encontró ningún tipo de esquema de AppSearch. Verifica que el nombre de la base de datos sea válido y que hayas seleccionado el tipo de almacenamiento correcto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Cargando documentos de AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Cargando tipos de esquema de AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versión del esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-es/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-es/strings.xml
index b37ba84b..9da812a 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-es/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-es/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"No se ha encontrado ningún documento de AppSearch en la base de datos. Comprueba que el nombre de la base de datos sea válido y que esté seleccionado el tipo de almacenamiento correcto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"No se han encontrado ningún tipo de esquema de AppSearch. Comprueba que el nombre de la base de datos sea válido y que esté seleccionado el tipo de almacenamiento correcto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Cargando documentos de AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Cargando tipos de esquema de AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versión del esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"No se ha encontrado ningún documento de AppSearch en la base de datos. Comprueba que el nombre de la base de datos sea válido y que esté seleccionado el tipo de almacenamiento correcto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"No se ha encontrado ningún tipo de esquema de AppSearch. Comprueba que el nombre de la base de datos sea válido y que esté seleccionado el tipo de almacenamiento correcto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Cargando documentos de AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Cargando tipos de esquema de AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versión de esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-et/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-et/strings.xml
index bbe743b..fb4314c 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-et/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-et/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Andmebaasist ei leitud ühtegi AppSearchi dokumenti. Veenduge, et andmebaasi nimi oleks kehtiv ja valitud oleks õige salvestusruumi tüüp."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Ühtegi AppSearchi skeemi tüüpi ei leitud. Veenduge, et andmebaasi nimi oleks kehtiv ja valitud oleks õige salvestusruumi tüüp."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearchi dokumentide laadimine …"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearchi skeemi tüüpide laadimine …"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Skeemi versioon: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Andmebaasist ei leitud ühtegi AppSearchi dokumenti. Veenduge, et andmebaasi nimi oleks kehtiv ja valitud oleks õige salvestusruumi tüüp."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Ühtegi AppSearchi skeemi tüüpi ei leitud. Veenduge, et andmebaasi nimi oleks kehtiv ja valitud oleks õige salvestusruumi tüüp."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearchi dokumentide laadimine …"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearchi skeemi tüüpide laadimine …"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Skeemi versioon: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-eu/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-eu/strings.xml
index 757465d..de5ba59 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-eu/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-eu/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Ez da aurkitu AppSearch-eko dokumenturik datu-basean. Egiaztatu datu-basearen izenak balio duela eta biltegiratze mota zuzena hautatu dela."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Ez da aurkitu AppSearch-en eskema motarik. Egiaztatu datu-basearen izenak balio duela eta biltegiratze mota zuzena hautatu dela."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch-eko dokumentuak kargatzen…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch-en eskema motak kargatzen…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Eskemaren bertsioa: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Ez da aurkitu AppSearch-eko dokumenturik datu-basean. Egiaztatu datu-basearen izenak balio duela eta biltegiratze mota zuzena hautatu dela."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Ez da aurkitu AppSearch-en eskema motarik. Egiaztatu datu-basearen izenak balio duela eta biltegiratze mota zuzena hautatu dela."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch-eko dokumentuak kargatzen…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch-en eskema motak kargatzen…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Eskemaren bertsioa: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-fa/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-fa/strings.xml
index 48e62ff..58d34bb 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-fa/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-fa/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"هیچ سندی از AppSearch در پایگاه داده پیدا نشد. تأیید کنید که نام پایگاه داده معتبر است و نوع صحیح فضای ذخیرهسازی انتخاب شده است."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"هیچ نوعی از طرح AppSearch پیدا نشد. تأیید کنید که نام پایگاه داده معتبر است و نوع صحیح فضای ذخیرهسازی انتخاب شده است."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"درحال بار کردن اسناد AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"درحال بار کردن انواع طرح AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"نسخه طرح: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"هیچ سندی از AppSearch در پایگاه داده پیدا نشد. تأیید کنید که نام پایگاه داده معتبر است و نوع صحیح فضای ذخیرهسازی انتخاب شده است."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"هیچ نوعی از طرح AppSearch پیدا نشد. تأیید کنید که نام پایگاه داده معتبر است و نوع صحیح فضای ذخیرهسازی انتخاب شده است."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"درحال بار کردن اسناد AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"درحال بار کردن انواع طرح AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"نسخه طرح: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-fi/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-fi/strings.xml
index 3fda0ea..affa5a8 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-fi/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-fi/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"AppSearchin dokumentteja ei löytynyt tietokannasta. Varmista, että tietokannan nimi on oikea ja että olet valinnut oikean tallennustilatyypin."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearchin mallityyppejä ei löytynyt tietokannasta. Varmista, että tietokannan nimi on oikea ja että olet valinnut oikean tallennustilatyypin."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Ladataan AppSearchin dokumentteja…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Ladataan AppSearchin mallityyppejä…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Mallin versio: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"AppSearchin dokumentteja ei löytynyt tietokannasta. Varmista, että tietokannan nimi on oikea ja että olet valinnut oikean tallennustilatyypin."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearchin mallityyppejä ei löytynyt tietokannasta. Varmista, että tietokannan nimi on oikea ja että olet valinnut oikean tallennustilatyypin."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Ladataan AppSearchin dokumentteja…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Ladataan AppSearchin mallityyppejä…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Mallin versio: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-fr-rCA/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-fr-rCA/strings.xml
index b306b21..257a405 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-fr-rCA/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-fr-rCA/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Aucun document AppSearch trouvé dans la base de données. Vérifiez que le nom de la base de données est correct et que le bon type d\'espace de stockage a été sélectionné."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Aucun type de schéma AppSearch trouvé. Vérifiez que le nom de la base de données est correct et que le bon type d\'espace de stockage a été sélectionné."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Chargement des documents AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Chargement des types de schémas AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Version du schéma : %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Aucun document AppSearch trouvé dans la base de données. Vérifiez que le nom de la base de données est correct et que le bon type d\'espace de stockage a été sélectionné."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Aucun type de schéma AppSearch trouvé. Vérifiez que le nom de la base de données est correct et que le bon type d\'espace de stockage a été sélectionné."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Chargement des documents AppSearch en cours…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Chargement des types de schémas AppSearch en cours…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Version du schéma : %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-fr/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-fr/strings.xml
index 96553cc..f69fcb7 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-fr/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-fr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Aucun document AppSearch trouvé dans la base de données. Vérifiez que le nom de la base de données est valide et que vous avez sélectionné le type d\'espace de stockage correct."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Aucun type de schéma AppSearch trouvé. Vérifiez que le nom de la base de données est valide et que vous avez sélectionné le type d\'espace de stockage correct."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Chargement des documents AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Chargement des types de schémas AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Version du schéma : %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Aucun document AppSearch trouvé dans la base de données. Vérifiez que le nom de la base de données est valide et que vous avez sélectionné le type d\'espace de stockage correct."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Aucun type de schéma AppSearch trouvé. Vérifiez que le nom de la base de données est valide et que vous avez sélectionné le type d\'espace de stockage correct."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Chargement des documents AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Chargement des types de schémas AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Version du schéma : %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-gl/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-gl/strings.xml
index ce3ecf9..c9887d1 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-gl/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-gl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Non se atoparon documentos de AppSearch na base de datos. Comproba que o nome da base de datos sexa válido e que se seleccionase o tipo de almacenamento correcto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Non se atoparon tipos de esquemas de AppSearch. Comproba que o nome da base de datos sexa válido e que se seleccionase o tipo de almacenamento correcto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Cargando documentos de AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Cargando tipos de esquemas de AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versión do esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Non se atoparon documentos de AppSearch na base de datos. Comproba que o nome da base de datos sexa válido e que se seleccionase o tipo de almacenamento correcto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Non se atoparon tipos de esquemas de AppSearch. Comproba que o nome da base de datos sexa válido e que se seleccionase o tipo de almacenamento correcto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Cargando documentos de AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Cargando tipos de esquemas de AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versión do esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-gu/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-gu/strings.xml
index 4aeaffa..a94d8f1 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-gu/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-gu/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ડેટાબેઝમાં AppSearchના કોઈ દસ્તાવેજ મળ્યા નથી. ડેટાબેઝનું નામ માન્ય હોવાની અને પસંદ કરેલા સ્ટોરેજનો પ્રકાર યોગ્ય હોવાની ચકાસણી કરો."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch સ્કીમાના કોઈ પ્રકાર મળ્યા નથી. ડેટાબેઝનું નામ માન્ય હોવાની અને પસંદ કરેલા સ્ટોરેજનો પ્રકાર યોગ્ય હોવાની ચકાસણી કરો."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearchના દસ્તાવેજો લોડ કરી રહ્યાં છીએ…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch સ્કીમાના પ્રકારો લોડ કરી રહ્યાં છીએ…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"સ્કીમા વર્ઝન: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ડેટાબેઝમાં AppSearchના કોઈ દસ્તાવેજ મળ્યા નથી. ડેટાબેઝનું નામ માન્ય હોવાની અને પસંદ કરેલા સ્ટોરેજનો પ્રકાર યોગ્ય હોવાની ચકાસણી કરો."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch સ્કીમાના કોઈ પ્રકાર મળ્યા નથી. ડેટાબેઝનું નામ માન્ય હોવાની અને પસંદ કરેલા સ્ટોરેજનો પ્રકાર યોગ્ય હોવાની ચકાસણી કરો."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearchના દસ્તાવેજો લોડ કરી રહ્યાં છીએ…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch સ્કીમાના પ્રકારો લોડ કરી રહ્યાં છીએ…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"સ્કીમા વર્ઝન: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-hi/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-hi/strings.xml
index c2c5525..d0ea1a8 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-hi/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-hi/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"डेटाबेस में, AppSearch का कोई दस्तावेज़ नहीं मिला. पुष्टि करें कि डेटाबेस का नाम मान्य है और डिवाइस के स्टोरेज का सही टाइप चुना गया है."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch का कोई स्कीमा टाइप नहीं मिला. पुष्टि करें कि डेटाबेस का नाम मान्य है और डिवाइस के स्टोरेज का सही टाइप चुना गया है."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch के दस्तावेज़ लोड हो रहे हैं..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch के स्कीमा टाइप लोड हो रहे हैं..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"स्कीमा वर्शन %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"डेटाबेस में, AppSearch का कोई दस्तावेज़ नहीं मिला. पुष्टि करें कि डेटाबेस का नाम मान्य है और डिवाइस के स्टोरेज का सही टाइप चुना गया है."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch का कोई स्कीमा टाइप नहीं मिला. पुष्टि करें कि डेटाबेस का नाम मान्य है और डिवाइस के स्टोरेज का सही टाइप चुना गया है."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch के दस्तावेज़ लोड हो रहे हैं..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch के स्कीमा टाइप लोड हो रहे हैं..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"स्कीमा वर्शन: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-hr/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-hr/strings.xml
index 0ebf67a4..806bee0 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-hr/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-hr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"U bazi podataka nije pronađen nijedan AppSearch dokument. Potvrdite da je naziv baze podataka važeći i da je odabrana točna vrsta pohrane."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nije pronađena nijedna vrsta AppSearch sheme. Potvrdite da je naziv baze podataka važeći i da je odabrana točna vrsta pohrane."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Učitavanje AppSearch dokumenata..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Učitavanje vrsta AppSearch shema..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Verzija sheme: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"U bazi podataka nije pronađen nijedan AppSearch dokument. Potvrdite da je naziv baze podataka važeći i da je odabrana točna vrsta pohrane."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nije pronađena nijedna vrsta AppSearch sheme. Potvrdite da je naziv baze podataka važeći i da je odabrana točna vrsta pohrane."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Učitavanje AppSearch dokumenata..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Učitavanje vrsta AppSearch shema..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Verzija sheme: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-hu/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-hu/strings.xml
index d6c2de3..592e9dc 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-hu/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-hu/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Nem találhatók Alkalmazáskereső-dokumentumok az adatbázisban. Ellenőrizze az adatbázis nevének érvényességét és a kiválasztott tárhelytípus helyességét."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nem találhatók Alkalmazáskereső-sématípusok. Ellenőrizze az adatbázis nevének érvényességét és a kiválasztott tárhelytípus helyességét."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Alkalmazáskereső-dokumentumok betöltése…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Alkalmazáskereső-sématípusok betöltése…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Séma-verziószám: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nem találhatók Alkalmazáskereső-dokumentumok az adatbázisban. Ellenőrizze az adatbázis nevének érvényességét és a kiválasztott tárhelytípus helyességét."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nem találhatók Alkalmazáskereső-sématípusok. Ellenőrizze az adatbázis nevének érvényességét és a kiválasztott tárhelytípus helyességét."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Alkalmazáskereső-dokumentumok betöltése…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Alkalmazáskereső-sématípusok betöltése…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Séma-verziószám: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-hy/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-hy/strings.xml
index f078b38..409cca7 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-hy/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-hy/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Տվյալների շտեմարանում AppSearch-ի փաստաթղթեր չեն գտնվել։ Համոզվեք, որ տվյալների շտեմարանի անունը վավեր է և հիշողության ճիշտ տեսակն է ընտրված։"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch-ի սխեմաների տեսակներ չեն գտնվել։ Համոզվեք, որ տվյալների շտեմարանի անունը վավեր է և հիշողության ճիշտ տեսակն է ընտրված։"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch-ի փաստաթղթերը բեռնվում են..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch-ի սխեմաների տեսակները բեռնվում են..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Սխեմայի տարբերակը՝ %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Տվյալների շտեմարանում AppSearch-ի փաստաթղթեր չեն գտնվել։ Համոզվեք, որ տվյալների շտեմարանի անունը վավեր է և հիշողության ճիշտ տեսակն է ընտրված։"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch-ի սխեմաների տեսակներ չեն գտնվել։ Համոզվեք, որ տվյալների շտեմարանի անունը վավեր է և հիշողության ճիշտ տեսակն է ընտրված։"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch-ի փաստաթղթերը բեռնվում են…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch-ի սխեմաների տեսակները բեռնվում են…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Սխեմայի տարբերակը՝ %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-in/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-in/strings.xml
index f01fd3c..de9ee37 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-in/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-in/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Tidak ada dokumen AppSearch yang ditemukan di database. Pastikan nama database valid dan jenis penyimpanan yang tepat telah dipilih."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Tidak ada jenis skema AppSearch yang ditemukan. Pastikan nama database valid dan jenis penyimpanan yang tepat telah dipilih."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Memuat dokumen AppSearch ..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Memuat jenis skema AppSearch ..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versi Skema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Tidak ada dokumen AppSearch yang ditemukan di database. Pastikan nama database valid dan jenis penyimpanan yang tepat telah dipilih."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Tidak ada jenis skema AppSearch yang ditemukan. Pastikan nama database valid dan jenis penyimpanan yang tepat telah dipilih."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Memuat dokumen AppSearch ..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Memuat jenis skema AppSearch ..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versi Skema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-is/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-is/strings.xml
index 81160a7..a71e0e59 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-is/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-is/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Engin skjöl forritaleitar fundust í gagnagrunni. Staðfestu að heiti gagnagrunns sé gilt og að rétt geymslugerð sé valin."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Engar skemagerðir forritaleitar fundust. Staðfestu að heiti gagnagrunns sé gilt og að rétt geymslugerð sé valin."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Hleður skjölum forritaleitar..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Hleður skemagerðum forritaleitar..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Útgáfa skema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Engin skjöl forritaleitar fundust í gagnagrunni. Staðfestu að heiti gagnagrunns sé gilt og að rétt geymslugerð sé valin."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Engar skemagerðir forritaleitar fundust. Staðfestu að heiti gagnagrunns sé gilt og að rétt geymslugerð sé valin."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Hleður skjölum forritaleitar..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Hleður skemagerðum forritaleitar..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Útgáfa skema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-it/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-it/strings.xml
index 2924f40..952d041 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-it/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-it/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Nessun documento AppSearch trovato nel database. Verifica che il nome del database sia valido e di aver selezionato il tipo di spazio di archiviazione corretto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nessun tipo di schema AppSearch trovato. Verifica che il nome del database sia valido e di aver selezionato il tipo di spazio di archiviazione corretto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Caricamento dei documenti AppSearch in corso…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Caricamento dei tipi di schemi AppSearch in corso…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versione schema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nessun documento AppSearch trovato nel database. Verifica che il nome del database sia valido e di aver selezionato il tipo di spazio di archiviazione corretto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nessun tipo di schema AppSearch trovato. Verifica che il nome del database sia valido e di aver selezionato il tipo di spazio di archiviazione corretto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Caricamento dei documenti AppSearch in corso…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Caricamento dei tipi di schemi AppSearch in corso…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versione schema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-iw/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-iw/strings.xml
index 0db6e25..8f29c8a 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-iw/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-iw/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"לא נמצאו מסמכי AppSearch במסד הנתונים. צריך לוודא שהשם של מסד הנתונים תקין ושבחרת בסוג האחסון הנכון."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"לא נמצאו סוגי סכימה של AppSearch. צריך לוודא שהשם של מסד הנתונים תקין ושבחרת בסוג האחסון הנכון."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"מסמכי AppSearch נטענים…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"סוגי הסכימה של AppSearch נטענים…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"גרסת הסכימה: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"לא נמצאו מסמכי AppSearch במסד הנתונים. צריך לוודא שהשם של מסד הנתונים תקין ושבחרת בסוג האחסון הנכון."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"לא נמצאו סוגי סכימה של AppSearch. צריך לוודא שהשם של מסד הנתונים תקין ושבחרת בסוג האחסון הנכון."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"מסמכי AppSearch נטענים…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"סוגי הסכימה של AppSearch נטענים…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"גרסת הסכימה: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ja/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ja/strings.xml
index f5fad78..7a70b0e 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ja/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ja/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"データベースに AppSearch ドキュメントはありませんでした。データベース名が有効であり、正しいストレージのタイプが選択されていることをご確認ください。"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch スキーマタイプは見つかりませんでした。データベース名が有効であり、正しいストレージのタイプが選択されていることをご確認ください。"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ドキュメントを読み込んでいます..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch スキーマタイプを読み込んでいます..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"スキーマ バージョン: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"データベースに AppSearch ドキュメントは見つかりませんでした。データベース名が有効であり、正しいストレージのタイプが選択されていることをご確認ください。"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch スキーマタイプは見つかりませんでした。データベース名が有効であり、正しいストレージのタイプが選択されていることをご確認ください。"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ドキュメントを読み込んでいます..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch スキーマタイプを読み込んでいます..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"スキーマ バージョン: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ka/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ka/strings.xml
index ec7b4d4..9227662 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ka/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ka/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"AppSearch დოკუმენტები მონაცემთა ბაზაში ვერ მოიძებნა. დაადასტურეთ, რომ მონაცემთა ბაზის სახელი სწორია და არჩეულია მეხსიერების საჭირო ტიპი."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch-ის სქემის ტიპი ვერ მოიძებნა. დაადასტურეთ, რომ მონაცემთა ბაზის სახელი სწორია და არჩეულია მეხსიერების საჭირო ტიპი."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"მიმდინარეობს AppSearch დოკუმენტების ჩატვირთვა..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"მიმდინარეობს AppSearch-ის სქემის ტიპების ჩატვირთვა..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"სქემის ვერსია: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"AppSearch დოკუმენტები მონაცემთა ბაზაში ვერ მოიძებნა. დაადასტურეთ, რომ მონაცემთა ბაზის სახელი სწორია და არჩეულია მეხსიერების საჭირო ტიპი."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch-ის სქემის ტიპი ვერ მოიძებნა. დაადასტურეთ, რომ მონაცემთა ბაზის სახელი სწორია და არჩეულია მეხსიერების საჭირო ტიპი."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"მიმდინარეობს AppSearch დოკუმენტების ჩატვირთვა..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"მიმდინარეობს AppSearch-ის სქემის ტიპების ჩატვირთვა..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"სქემის ვერსია: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-kk/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-kk/strings.xml
index 150203b..81c44c4 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-kk/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-kk/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Дерекқорда ешбір AppSearch құжаты табылмады. Дерекқор атауы жарамды екенін және дұрыс жад түрі таңдалғанын растаңыз."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Ешбір AppSearch схема түрі табылмады. Дерекқор атауы жарамды екенін және дұрыс жад түрі таңдалғанын растаңыз."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch құжаттары жүктелуде…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch схема түрлері жүктелуде…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Схема нұсқасы: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Дерекқорда ешбір AppSearch құжаты табылмады. Дерекқор атауы жарамды екенін және дұрыс жад түрі таңдалғанын растаңыз."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Ешбір AppSearch схема түрі табылмады. Дерекқор атауы жарамды екенін және дұрыс жад түрі таңдалғанын растаңыз."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch құжаттары жүктелуде…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch схема түрлері жүктелуде…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Схема нұсқасы: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-km/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-km/strings.xml
index b8c14f9..4a432c1 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-km/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-km/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"រកមិនឃើញឯកសារ AppSearch នៅក្នុងមូលដ្ឋានទិន្នន័យទេ។ ផ្ទៀងផ្ទាត់ថាឈ្មោះមូលដ្ឋានទិន្នន័យមានភាពត្រឹមត្រូវ និងបានជ្រើសរើសប្រភេទទំហំផ្ទុកដែលត្រឹមត្រូវ។"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"រកមិនឃើញប្រភេទគ្រោងតាង AppSearch ទេ។ ផ្ទៀងផ្ទាត់ថាឈ្មោះមូលដ្ឋានទិន្នន័យមានភាពត្រឹមត្រូវ និងបានជ្រើសរើសប្រភេទទំហំផ្ទុកដែលត្រឹមត្រូវ។"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"កំពុងផ្ទុកឯកសារ AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"កំពុងផ្ទុកប្រភេទគ្រោងតាង AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"កំណែគ្រោងតាង៖ %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"រកមិនឃើញឯកសារ AppSearch នៅក្នុងមូលដ្ឋានទិន្នន័យទេ។ ផ្ទៀងផ្ទាត់ថាឈ្មោះមូលដ្ឋានទិន្នន័យមានភាពត្រឹមត្រូវ និងបានជ្រើសរើសប្រភេទទំហំផ្ទុកដែលត្រឹមត្រូវ។"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"រកមិនឃើញប្រភេទគ្រោងតាង AppSearch ទេ។ ផ្ទៀងផ្ទាត់ថាឈ្មោះមូលដ្ឋានទិន្នន័យមានភាពត្រឹមត្រូវ និងបានជ្រើសរើសប្រភេទទំហំផ្ទុកដែលត្រឹមត្រូវ។"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"កំពុងផ្ទុកឯកសារ AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"កំពុងផ្ទុកប្រភេទគ្រោងតាង AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"កំណែគ្រោងតាង៖ %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-kn/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-kn/strings.xml
index 3b80458..6e34e42 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-kn/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-kn/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಯಾವುದೇ AppSearch ಡಾಕ್ಯುಮೆಂಟ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಡೇಟಾಬೇಸ್ ಹೆಸರು ಮಾನ್ಯವಾಗಿದೆಯೆ ಮತ್ತು ಸರಿಯಾದ ಸಂಗ್ರಹಣೆಯ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"ಯಾವುದೇ AppSearch ರೂಪುರೇಷೆ ಪ್ರಕಾರಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಡೇಟಾಬೇಸ್ ಹೆಸರು ಮಾನ್ಯವಾಗಿದೆಯೆ ಮತ್ತು ಸರಿಯಾದ ಸಂಗ್ರಹಣೆಯ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆಯೆ ಎಂದು ಪರಿಶೀಲಿಸಿ."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch ರೂಪುರೇಷೆ ಪ್ರಕಾರಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"ರೂಪುರೇಷೆ ಆವೃತ್ತಿ: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ಡೇಟಾಬೇಸ್ನಲ್ಲಿ ಯಾವುದೇ AppSearch ಡಾಕ್ಯುಮೆಂಟ್ಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಡೇಟಾಬೇಸ್ನ ಹೆಸರು ಮಾನ್ಯವಾಗಿದೆಯೇ ಮತ್ತು ಸರಿಯಾದ ಸಂಗ್ರಹಣೆಯ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಿ."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"ಯಾವುದೇ AppSearch ರೂಪುರೇಷೆ ಪ್ರಕಾರಗಳು ಕಂಡುಬಂದಿಲ್ಲ. ಡೇಟಾಬೇಸ್ನ ಹೆಸರು ಮಾನ್ಯವಾಗಿದೆಯೇ ಮತ್ತು ಸರಿಯಾದ ಸಂಗ್ರಹಣೆಯ ಪ್ರಕಾರವನ್ನು ಆಯ್ಕೆ ಮಾಡಲಾಗಿದೆಯೇ ಎಂಬುದನ್ನು ಪರಿಶೀಲಿಸಿ."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ಡಾಕ್ಯುಮೆಂಟ್ಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch ರೂಪುರೇಷೆ ಪ್ರಕಾರಗಳನ್ನು ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"ರೂಪುರೇಷೆ ಆವೃತ್ತಿ: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ko/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ko/strings.xml
index 906947a..a9581e1 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ko/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ko/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"데이터베이스에서 AppSearch 문서를 찾을 수 없습니다. 데이터베이스 이름이 유효하고 올바른 저장공간 유형이 선택되어 있는지 확인하세요."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch 스키마 유형을 찾을 수 없습니다. 데이터베이스 이름이 유효하고 올바른 저장공간 유형이 선택되어 있는지 확인하세요."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch 문서 로드 중..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch 스키마 유형 로드 중..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"스키마 버전: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"데이터베이스에서 AppSearch 문서를 찾을 수 없습니다. 데이터베이스 이름이 유효하고 올바른 저장공간 유형이 선택되어 있는지 확인하세요."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch 스키마 유형을 찾을 수 없습니다. 데이터베이스 이름이 유효하고 올바른 저장공간 유형이 선택되어 있는지 확인하세요."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch 문서 로드 중..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch 스키마 유형 로드 중..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"스키마 버전: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ky/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ky/strings.xml
index 499749c..59336f3 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ky/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ky/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Дайындар базасынан AppSearch документтери табылган жок. Дайындар базасынын аталышы жарактуу экенин жана сактагычтын түрү туура тандалганын текшериңиз."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch cхемаларынын түрлөрү табылган жок. Дайындар базасынын аталышы жарактуу экенин жана сактагычтын түрү туура тандалганын текшериңиз."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch документтери жүктөлүүдө..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch cхемаларынын түрлөрү жүктөлүүдө..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Схеманын версиясы: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Дайындар базасынан AppSearch документтери табылган жок. Дайындар базасынын аталышы жарактуу экенин жана сактагычтын түрү туура тандалганын текшериңиз."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch cхемаларынын түрлөрү табылган жок. Дайындар базасынын аталышы жарактуу экенин жана сактагычтын түрү туура тандалганын текшериңиз."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch документтери жүктөлүүдө..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch cхемаларынын түрлөрү жүктөлүүдө..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Схеманын версиясы: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-lo/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-lo/strings.xml
index f69e046..a62f1e9 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-lo/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-lo/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ບໍ່ພົບເອກະສານ AppSearch ໃນຖານຂໍ້ມູນ. ກະລຸນາຢັ້ງຢືນວ່າຊື່ຖານຂໍ້ມູນນັ້ນຖືກຕ້ອງ ແລະ ໄດ້ເລືອກປະເພດບ່ອນຈັດເກັບຂໍ້ມູນທີ່ຖືກຕ້ອງແລ້ວ."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"ບໍ່ພົບປະເພດຮູບແບບ AppSearch. ກະລຸນາຢັ້ງຢືນວ່າຊື່ຖານຂໍ້ມູນນັ້ນຖືກຕ້ອງ ແລະ ໄດ້ເລືອກປະເພດບ່ອນຈັດເກັບຂໍ້ມູນທີ່ຖືກຕ້ອງແລ້ວ."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"ກຳລັງໂຫຼດເອກະສານ AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"ກຳລັງໂຫຼດປະເພດຮູບແບບ AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"ເວີຊັນຮູບແບບ: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ບໍ່ພົບເອກະສານ AppSearch ໃນຖານຂໍ້ມູນ. ກະລຸນາຢັ້ງຢືນວ່າຊື່ຖານຂໍ້ມູນນັ້ນຖືກຕ້ອງ ແລະ ໄດ້ເລືອກປະເພດບ່ອນຈັດເກັບຂໍ້ມູນທີ່ຖືກຕ້ອງແລ້ວ."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"ບໍ່ພົບປະເພດຮູບແບບ AppSearch. ກະລຸນາຢັ້ງຢືນວ່າຊື່ຖານຂໍ້ມູນນັ້ນຖືກຕ້ອງ ແລະ ໄດ້ເລືອກປະເພດບ່ອນຈັດເກັບຂໍ້ມູນທີ່ຖືກຕ້ອງແລ້ວ."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"ກຳລັງໂຫຼດເອກະສານ AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"ກຳລັງໂຫຼດປະເພດຮູບແບບ AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"ເວີຊັນຮູບແບບ: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-lt/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-lt/strings.xml
index c4f1d03..f909e2f 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-lt/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-lt/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Duomenų bazėje nerasta jokių „AppSearch“ dokumentų. Įsitikinkite, kad nurodytas tinkamas duomenų bazės pavadinimas ir kad pasirinktas tinkamas saugyklos tipas."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nerasta jokių „AppSearch“ schemos tipų. Įsitikinkite, kad nurodytas tinkamas duomenų bazės pavadinimas ir kad pasirinktas tinkamas saugyklos tipas."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Įkeliami „AppSearch“ dokumentai..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Įkeliami „AppSearch“ schemos tipai..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schemos versija: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Duomenų bazėje nerasta jokių „AppSearch“ dokumentų. Įsitikinkite, kad nurodytas tinkamas duomenų bazės pavadinimas ir kad pasirinktas tinkamas saugyklos tipas."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nerasta jokių „AppSearch“ schemos tipų. Įsitikinkite, kad nurodytas tinkamas duomenų bazės pavadinimas ir kad pasirinktas tinkamas saugyklos tipas."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Įkeliami „AppSearch“ dokumentai..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Įkeliami „AppSearch“ schemos tipai..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schemos versija: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-lv/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-lv/strings.xml
index b156b36..e9e0c7e 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-lv/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-lv/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Datu bāzē netika atrasts neviens AppSearch dokuments. Pārbaudiet, vai datu bāzes nosaukums ir derīgs un vai tika atlasīts pareizais krātuves veids."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Netika atrasts neviens AppSearch shēmas veids. Pārbaudiet, vai datu bāzes nosaukums ir derīgs un vai tika atlasīts pareizais krātuves veids."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Notiek AppSearch dokumentu ielāde..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Notiek AppSearch shēmu veidu ielāde..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Shēmas versija: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Datu bāzē netika atrasts neviens AppSearch dokuments. Pārbaudiet, vai datu bāzes nosaukums ir derīgs un vai tika atlasīts pareizais krātuves veids."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Netika atrasts neviens AppSearch shēmas veids. Pārbaudiet, vai datu bāzes nosaukums ir derīgs un vai tika atlasīts pareizais krātuves veids."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Notiek AppSearch dokumentu ielāde..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Notiek AppSearch shēmu veidu ielāde..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Shēmas versija: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-mk/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-mk/strings.xml
index e9ffe20..de81c5c 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-mk/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-mk/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Нема документи за AppSearch во базата на податоци. Потврдете дека името на базата на податоци е точно и дека е избран точниот вид меморија."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Не се пронајдени видови шема за AppSearch. Потврдете дека името на базата на податоци е точно и дека е избран точниот вид меморија."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Се вчитуваат документи за AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Се вчитуваат видови шема за AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Верзија на шема: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Нема документи за AppSearch во базата на податоци. Потврдете дека името на базата на податоци е точно и дека е избран точниот тип капацитет."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Не се пронајдени типови шеми за AppSearch. Потврдете дека името на базата на податоци е точно и дека е избран точниот тип капацитет."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Се вчитуваат документи за AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Се вчитуваат типови шеми за AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Верзија на шема: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ml/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ml/strings.xml
index 2a61573..323721f 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ml/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ml/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ഡാറ്റാബേസിൽ AppSearch ഡോക്യുമെന്റുകളൊന്നും കണ്ടെത്തിയില്ല. ഡാറ്റാബേസിന്റെ പേര് സാധുവാണെന്നും ശരിയായ സ്റ്റോറേജ് തരമാണ് തിരഞ്ഞെടുത്തതെന്നും പരിശോധിച്ചുറപ്പിക്കുക."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch സ്കീമ തരങ്ങളൊന്നും കണ്ടെത്തിയില്ല. ഡാറ്റാബേസിന്റെ പേര് സാധുവാണെന്നും ശരിയായ സ്റ്റോറേജ് തരമാണ് തിരഞ്ഞെടുത്തതെന്നും പരിശോധിച്ചുറപ്പിക്കുക."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ഡോക്യുമെന്റുകൾ ലോഡ് ചെയ്യുന്നു..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch സ്കീമ തരങ്ങൾ ലോഡ് ചെയ്യുന്നു..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"സ്കീമ പതിപ്പ്: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ഡാറ്റാബേസിൽ AppSearch ഡോക്യുമെന്റുകളൊന്നും കണ്ടെത്തിയില്ല. ഡാറ്റാബേസിന്റെ പേര് സാധുവാണെന്നും ശരിയായ സ്റ്റോറേജ് തരമാണ് തിരഞ്ഞെടുത്തതെന്നും പരിശോധിച്ചുറപ്പിക്കുക."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch സ്കീമ തരങ്ങളൊന്നും കണ്ടെത്തിയില്ല. ഡാറ്റാബേസിന്റെ പേര് സാധുവാണെന്നും ശരിയായ സ്റ്റോറേജ് തരമാണ് തിരഞ്ഞെടുത്തതെന്നും പരിശോധിച്ചുറപ്പിക്കുക."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ഡോക്യുമെന്റുകൾ ലോഡ് ചെയ്യുന്നു..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch സ്കീമ തരങ്ങൾ ലോഡ് ചെയ്യുന്നു..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"സ്കീമ പതിപ്പ്: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-mn/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-mn/strings.xml
index 04b5530..9e56f61 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-mn/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-mn/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Өгөгдлийн баазаас AppSearch-н документ олдсонгүй. Өгөгдлийн нэр хүчинтэй бөгөөд хадгалах сангийн зөв төрөл сонгосон эсэхийг баталгаажуулна уу."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch-н схемийн төрөл олдсонгүй. Өгөгдлийн нэр хүчинтэй бөгөөд хадгалах сангийн зөв төрөл сонгосон эсэхийг баталгаажуулна уу."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch-н документуудыг ачаалж байна..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch-н схемийн төрлийг ачаалж байна..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Схемийн хувилбар: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Өгөгдлийн баазаас AppSearch-н документууд олдсонгүй. Өгөгдлийн баазын нэр хүчинтэй бөгөөд хадгалах сангийн зөв төрлийг сонгосон эсэхийг баталгаажуулна уу."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch-н схемийн төрөл олдсонгүй. Өгөгдлийн баазын нэр хүчинтэй бөгөөд хадгалах сангийн зөв төрлийг сонгосон эсэхийг баталгаажуулна уу."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch-н документуудыг ачаалж байна..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch-н схемийн төрлийг ачаалж байна..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Схемийн хувилбар: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-mr/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-mr/strings.xml
index c0bee96..932c048 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-mr/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-mr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"डेटाबेसमध्ये कोणतेही AppSearch दस्तऐवज मिळाले नाहीत. डेटाबेसचे नाव वैध असल्याची आणि योग्य स्टोरेज प्रकार निवडला असल्याची पडताळणी करा."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"कोणतेही AppSearch स्कीमा प्रकार आढळले नाहीत. डेटाबेसचे नाव वैध असल्याची आणि योग्य स्टोरेज प्रकार निवडला असल्याची पडताळणी करा."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch दस्तऐवज लोड करत आहे..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch स्कीमा प्रकार लोड करत आहे..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"स्कीमा आवृत्ती: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"डेटाबेसमध्ये कोणतेही AppSearch दस्तऐवज आढळले नाहीत. डेटाबेसचे नाव वैध असल्याची आणि योग्य स्टोरेज प्रकार निवडला असल्याची पडताळणी करा."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"कोणतेही AppSearch स्कीमा प्रकार आढळले नाहीत. डेटाबेसचे नाव वैध असल्याची आणि योग्य स्टोरेज प्रकार निवडला असल्याची पडताळणी करा."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch दस्तऐवज लोड करत आहे..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch स्कीमा प्रकार लोड करत आहे..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"स्कीमा आवृत्ती: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ms/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ms/strings.xml
index e0396b3..417be72 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ms/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ms/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Tiada dokumen AppSearch dijumpai dalam pangkalan data. Sahkan bahawa nama pangkalan data adalah sah dan jenis storan yang dipilih adalah betul."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Jenis skema AppSearch tidak dijumpai. Sahkan bahawa nama pangkalan data adalah sah dan jenis storan yang dipilih adalah betul."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Memuatkan dokumen AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Memuatkan jenis skema AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versi Skema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Tiada dokumen AppSearch ditemukan dalam pangkalan data. Sahkan bahawa nama pangkalan data adalah sah dan jenis storan yang dipilih adalah betul."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Jenis skema AppSearch tidak ditemukan. Sahkan bahawa nama pangkalan data adalah sah dan jenis storan yang dipilih adalah betul."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Memuatkan dokumen AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Memuatkan jenis skema AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versi Skema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-my/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-my/strings.xml
index ae265a1..378a3af 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-my/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-my/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ဒေတာဘေ့စ်တွင် AppSearch မှတ်တမ်းများ မတွေ့ပါ။ ဒေတာဘေ့စ် အမည်သည် မှန်ကန်ပြီး မှန်ကန်သော သိုလှောင်ခန်းအမျိုးအစားကို ရွေးထားကြောင်း အတည်ပြုရန် စစ်ဆေးပါ။"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch ရှေမားအမျိုးအစားများ မတွေ့ပါ။ ဒေတာဘေ့စ် အမည်သည် မှန်ကန်ပြီး မှန်ကန်သော သိုလှောင်ခန်းအမျိုးအစားကို ရွေးထားကြောင်း အတည်ပြုရန် စစ်ဆေးပါ။"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch မှတ်တမ်းများကို ဖွင့်နေသည်..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch ရှေမားအမျိုးအစားများကို ဖွင့်နေသည်..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"ရှေမား ဗားရှင်း- %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ဒေတာဘေ့စ်တွင် AppSearch မှတ်တမ်းများ မတွေ့ပါ။ ဒေတာဘေ့စ်အမည်နှင့် ရွေးချယ်ထားသော သိုလှောင်ခန်းအမျိုးအစား မှန်ကန်ကြောင်း အတည်ပြုရန် စစ်ဆေးပါ။"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch ရှေမားအမျိုးအစားများ မတွေ့ပါ။ ဒေတာဘေ့စ်အမည်နှင့် ရွေးချယ်ထားသော သိုလှောင်ခန်းအမျိုးအစား မှန်ကန်ကြောင်း အတည်ပြုရန် စစ်ဆေးပါ။"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch မှတ်တမ်းများကို ဖွင့်နေသည်..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch ရှေမားအမျိုးအစားများကို ဖွင့်နေသည်..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"ရှေမား ဗားရှင်း- %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-nb/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-nb/strings.xml
index 7950119..c63a96e 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-nb/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-nb/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Fant ingen AppSearch-dokumenter i databasen. Bekreft at databasenavnet er gyldig, og at riktig lagringstype er valgt."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Fant ingen AppSearch-oppsettyper. Bekreft at databasenavnet er gyldig, og at riktig lagringstype er valgt."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Laster inn AppSearch-dokumenter …"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Laster inn AppSearch-oppsettyper …"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Oppsettversjon: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Fant ingen AppSearch-dokumenter i databasen. Bekreft at databasenavnet er gyldig, og at riktig lagringstype er valgt."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Fant ingen AppSearch-oppsettyper. Bekreft at databasenavnet er gyldig, og at riktig lagringstype er valgt."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Laster inn AppSearch-dokumenter …"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Laster inn AppSearch-oppsettyper …"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Oppsettversjon: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ne/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ne/strings.xml
index f96675e..5906648 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ne/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ne/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"डेटाबेसमा कुनै पनि AppSearch डकुमेन्ट फेला परेन। डेटाबेसको नाम वैध छ र डिभाइसको सही प्रकारको भण्डारण चयन गरिएको छ भन्ने कुरा पुष्टि गर्नुहोस्।"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"कुनै पनि प्रकारको AppSearch योजना फेला परेन। डेटाबेसको नाम वैध छ र डिभाइसको सही प्रकारको भण्डारण चयन गरिएको छ भन्ने कुरा पुष्टि गर्नुहोस्।"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch डकुमेन्टहरू लोड गरिँदै छ..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"विभिन्न प्रकारका AppSearch योजना लोड गरिँदै छन्..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"योजनाको संस्करण: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"डेटाबेसमा AppSearch सम्बन्धी कुनै पनि डकुमेन्ट भेटिएन। डेटाबेसको नाम वैध छ र सही प्रकारको भण्डारण चयन गरिएको छ भन्ने कुरा पुष्टि गर्नुहोस्।"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"कुनै पनि प्रकारको AppSearch योजना भेटिएन। डेटाबेसको नाम वैध छ र सही प्रकारको भण्डारण चयन गरिएको छ भन्ने कुरा पुष्टि गर्नुहोस्।"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch सम्बन्धी डकुमेन्टहरू लोड गरिँदै छन्..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"विभिन्न प्रकारका AppSearch योजना लोड गरिँदै छन्..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"योजनाको संस्करण: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-nl/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-nl/strings.xml
index 2ae5bf7..d91bd63 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-nl/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-nl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Geen AppSearch-documenten gevonden in database. Check of de databasenaam geldig is en of het juiste opslagtype is geselecteerd."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Geen AppSearch-schematypen gevonden. Check of de databasenaam geldig is en of het juiste opslagtype is geselecteerd."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch-documenten laden..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch-schematypen laden..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schemaversie: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Geen AppSearch-documenten gevonden in database. Check of de databasenaam geldig is en of het juiste opslagtype is geselecteerd."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Geen AppSearch-schematypen gevonden. Check of de databasenaam geldig is en of het juiste opslagtype is geselecteerd."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch-documenten laden..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch-schematypen laden..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schemaversie: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-or/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-or/strings.xml
index a026025..1df0165 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-or/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-or/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ଡାଟାବେସରେ କୌଣସି AppSearch ଡକ୍ୟୁମେଣ୍ଟ ମିଳିଲା ନାହିଁ। ଡାଟାବେସର ନାମ ବୈଧ ଥିବା ଏବଂ ସଠିକ୍ ଷ୍ଟୋରେଜ୍ ପ୍ରକାରକୁ ଚୟନ କରାଯାଇଥିବା ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"କୌଣସି AppSearch ସ୍କିମା ପ୍ରକାର ମିଳିଲା ନାହିଁ। ଡାଟାବେସର ନାମ ବୈଧ ଥିବା ଏବଂ ସଠିକ୍ ଷ୍ଟୋରେଜ୍ ପ୍ରକାରକୁ ଚୟନ କରାଯାଇଥିବା ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ଡକ୍ୟୁମେଣ୍ଟଗୁଡ଼ିକ ଲୋଡ୍ ହେଉଛି..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch ସ୍କିମା ପ୍ରକାରଗୁଡ଼ିକ ଲୋଡ୍ ହେଉଛି..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"ସ୍କିମା ସଂସ୍କରଣ: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ଡାଟାବେସରେ କୌଣସି AppSearch ଡକ୍ୟୁମେଣ୍ଟ ମିଳିଲା ନାହିଁ। ଡାଟାବେସର ନାମ ବୈଧ ଅଛି ଏବଂ ସଠିକ୍ ଷ୍ଟୋରେଜ ପ୍ରକାରକୁ ଚୟନ କରାଯାଇଥିଲା ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"କୌଣସି AppSearch ସ୍କିମା ପ୍ରକାର ମିଳିଲା ନାହିଁ। ଡାଟାବେସର ନାମ ବୈଧ ଅଛି ଏବଂ ସଠିକ୍ ଷ୍ଟୋରେଜ ପ୍ରକାରକୁ ଚୟନ କରାଯାଇଥିଲା ବୋଲି ଯାଞ୍ଚ କରନ୍ତୁ।"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ଡକ୍ୟୁମେଣ୍ଟଗୁଡ଼ିକ ଲୋଡ ହେଉଛି..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch ସ୍କିମା ପ୍ରକାରଗୁଡ଼ିକ ଲୋଡ ହେଉଛି..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"ସ୍କିମା ସଂସ୍କରଣ: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-pa/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-pa/strings.xml
index b7c0c95..8ec21c7 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-pa/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-pa/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ਡਾਟਾਬੇਸ ਵਿੱਚ ਕੋਈ AppSearch ਦਸਤਾਵੇਜ਼ ਨਹੀਂ ਮਿਲੇ। ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਡਾਟਾਬੇਸ ਦਾ ਨਾਮ ਵੈਧ ਹੈ ਅਤੇ ਸਟੋਰੇਜ ਦੀ ਇੱਕ ਸਹੀ ਕਿਸਮ ਚੁਣੀ ਗਈ ਸੀ।"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch ਸਕੀਮਾ ਦੀ ਕੋਈ ਕਿਸਮ ਨਹੀਂ ਮਿਲੀ। ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਡਾਟਾਬੇਸ ਦਾ ਨਾਮ ਵੈਧ ਹੈ ਅਤੇ ਸਟੋਰੇਜ ਦੀ ਇੱਕ ਸਹੀ ਕਿਸਮ ਚੁਣੀ ਗਈ ਸੀ।"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch ਸਕੀਮਾ ਦੀਆਂ ਕਿਸਮਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"ਸਕੀਮਾ ਵਰਜਨ: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ਡਾਟਾਬੇਸ ਵਿੱਚ ਕੋਈ AppSearch ਦਸਤਾਵੇਜ਼ ਨਹੀਂ ਮਿਲਿਆ। ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਡਾਟਾਬੇਸ ਦਾ ਨਾਮ ਵੈਧ ਹੈ ਅਤੇ ਸਟੋਰੇਜ ਦੀ ਸਹੀ ਕਿਸਮ ਚੁਣੀ ਗਈ ਸੀ।"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch ਸਕੀਮਾ ਦੀ ਕੋਈ ਕਿਸਮ ਨਹੀਂ ਮਿਲੀ। ਪੁਸ਼ਟੀ ਕਰੋ ਕਿ ਡਾਟਾਬੇਸ ਦਾ ਨਾਮ ਵੈਧ ਹੈ ਅਤੇ ਸਟੋਰੇਜ ਦੀ ਸਹੀ ਕਿਸਮ ਚੁਣੀ ਗਈ ਸੀ।"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ਦਸਤਾਵੇਜ਼ਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch ਸਕੀਮਾ ਦੀਆਂ ਕਿਸਮਾਂ ਨੂੰ ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"ਸਕੀਮਾ ਵਰਜਨ: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-pl/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-pl/strings.xml
index 0cab68f..2dc8454 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-pl/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-pl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"W bazie danych nie znaleziono dokumentów AppSearch. Sprawdź, czy nazwa bazy danych jest prawidłowa i czy wybrano odpowiedni typ pamięci."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nie znaleziono typów schematów AppSearch. Sprawdź, czy nazwa bazy danych jest prawidłowa i czy wybrano odpowiedni typ pamięci."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Wczytuję dokumenty AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Wczytuję typy schematów AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Wersja schematu: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"W bazie danych nie znaleziono dokumentów AppSearch. Sprawdź, czy nazwa bazy danych jest prawidłowa i czy wybrano odpowiedni typ pamięci."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nie znaleziono typów schematów AppSearch. Sprawdź, czy nazwa bazy danych jest prawidłowa i czy wybrano odpowiedni typ pamięci."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Wczytuję dokumenty AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Wczytuję typy schematów AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Wersja schematu: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-pt-rBR/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-pt-rBR/strings.xml
index 35bc29b..f47f6aa 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-pt-rBR/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-pt-rBR/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Não foram encontrados documentos do AppSearch no banco de dados. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Não foram encontrados tipos de esquema do AppSearch. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Carregando documentos do AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Carregando tipos de esquema do AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versão do esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nenhum documento do AppSearch encontrado no banco de dados. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nenhum tipo de esquema do AppSearch encontrado. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Carregando documentos do AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Carregando tipos de esquema do AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versão do esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-pt-rPT/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-pt-rPT/strings.xml
index a4fb83f..dc59838 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-pt-rPT/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-pt-rPT/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Não foram encontrados documentos da AppSearch na base de dados. Valide o nome da base de dados e confirme se foi selecionado o tipo de armazenamento correto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Não foram encontrados tipos de esquemas da AppSearch. Valide o nome da base de dados e confirme se foi selecionado o tipo de armazenamento correto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"A carregar os documentos da AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"A carregar os tipos de esquemas da AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versão do esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Não foram encontrados documentos da AppSearch na base de dados. Valide o nome da base de dados e confirme se foi selecionado o tipo de armazenamento correto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Não foram encontrados tipos de esquemas da AppSearch. Valide o nome da base de dados e confirme se foi selecionado o tipo de armazenamento correto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"A carregar os documentos da AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"A carregar os tipos de esquemas da AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versão do esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-pt/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-pt/strings.xml
index 35bc29b..f47f6aa 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-pt/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-pt/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Não foram encontrados documentos do AppSearch no banco de dados. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Não foram encontrados tipos de esquema do AppSearch. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Carregando documentos do AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Carregando tipos de esquema do AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versão do esquema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nenhum documento do AppSearch encontrado no banco de dados. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nenhum tipo de esquema do AppSearch encontrado. Verifique se o nome do banco de dados é válido e se você selecionou o tipo de armazenamento correto."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Carregando documentos do AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Carregando tipos de esquema do AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versão do esquema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ro/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ro/strings.xml
index f5c4056..88b5e75 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ro/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ro/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Nu s-au găsit documente AppSearch în baza de date. Verificați dacă numele bazei de date este valid și s-a selectat tipul corect de stocare."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nu s-au găsit tipuri de scheme AppSearch. Verificați dacă numele bazei de date este valid și s-a selectat tipul corect de stocare."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Se încarcă documentele AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Se încarcă tipurile de scheme AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versiunea schemei: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nu s-au găsit documente AppSearch în baza de date. Verificați dacă numele bazei de date este valid și s-a selectat tipul corect de stocare."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nu s-au găsit tipuri de scheme AppSearch. Verificați dacă numele bazei de date este valid și s-a selectat tipul corect de stocare."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Se încarcă documentele AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Se încarcă tipurile de scheme AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versiunea schemei: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ru/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ru/strings.xml
index 0fef687..7b508467 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ru/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ru/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"В базе данных нет документов AppSearch. Убедитесь, что вы правильно указали название базы данных и тип хранилища."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Типы схемы AppSearch не найдены. Убедитесь, что вы правильно указали название базы данных и тип хранилища."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Загрузка документов AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Загрузка типов схемы AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Версия схемы: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"В базе данных нет документов AppSearch. Убедитесь, что вы правильно указали название базы данных и тип хранилища."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Типы схемы AppSearch не найдены. Убедитесь, что вы правильно указали название базы данных и тип хранилища."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Загрузка документов AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Загрузка типов схемы AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Версия схемы: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-si/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-si/strings.xml
index 37564f3..b525e2f 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-si/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-si/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"දත්ත සමුදායේ AppSearch ලේඛන හමු නොවීය. දත්ත සමුදායේ නම වලංගු බව සහ නිවැරදි ගබඩා වර්ගය තෝරා ගත් බව සත්යාපනය කරන්න."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch නිරූපණ වර්ග හමු විය. දත්ත සමුදායේ නම වලංගු බව සහ නිවැරදි ගබඩා වර්ගය තෝරා ගත් බව සත්යාපනය කරන්න."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ලේඛන පූරණය කරමින්..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch නිරූපණ වර්ග පූරණය කරමින්..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"නිරූපණ අනුවාදය: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"දත්ත සමුදායේ AppSearch ලේඛන හමු නොවීය. දත්ත සමුදායේ නම වලංගු බව සහ නිවැරදි ගබඩා වර්ගය තෝරා ගත් බව සත්යාපනය කරන්න."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch නිරූපණ වර්ග හමු විය. දත්ත සමුදායේ නම වලංගු බව සහ නිවැරදි ගබඩා වර්ගය තෝරා ගත් බව සත්යාපනය කරන්න."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ලේඛන පූරණය කරමින්..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch නිරූපණ වර්ග පූරණය කරමින්..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"නිරූපණ අනුවාදය: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-sk/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-sk/strings.xml
index acae3cb..a5d9310 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-sk/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-sk/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"V databáze sa nenašli žiadne dokumenty služby AppSearch. Overte, či je názov databázy platný a či bol vybraný správny typ priestoru."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nenašli sa žiadne typy schém služby AppSearch. Overte, či je názov databázy platný a či bol vybraný správny typ priestoru."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Načítavajú sa dokumenty služby AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Načítavajú sa typy schém služby AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Verzia schémy: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"V databáze neboli nájdené žiadne dokumenty služby AppSearch. Overte, či je názov databázy platný a či bol vybraný správny typ priestoru."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Neboli nájdené žiadne typy schém služby AppSearch. Overte, či je názov databázy platný a či bol vybraný správny typ priestoru."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Načítavajú sa dokumenty služby AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Načítavajú sa typy schém služby AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Verzia schémy: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-sl/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-sl/strings.xml
index bf2015e..bcad78d 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-sl/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-sl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"V zbirki podatkov ni bil najden noben dokument AppSearch. Preverite, ali je ime zbirke podatkov veljavno in ali je bila izbrana prava vrsta shrambe."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Najdena ni bila nobena vrsta sheme AppSearch. Preverite, ali je ime zbirke podatkov veljavno in ali je bila izbrana prava vrsta shrambe."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Nalaganje dokumentov AppSearch …"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Nalaganje vrst shem AppSearch …"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Različica sheme: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"V zbirki podatkov ni bil najden noben dokument AppSearch. Preverite, ali je ime zbirke podatkov veljavno in ali je bila izbrana prava vrsta shrambe."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Najdena ni bila nobena vrsta sheme AppSearch. Preverite, ali je ime zbirke podatkov veljavno in ali je bila izbrana prava vrsta shrambe."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Nalaganje dokumentov AppSearch …"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Nalaganje vrst shem AppSearch …"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Različica sheme: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-sq/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-sq/strings.xml
index f7e82bf..56a0a1c6 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-sq/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-sq/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Nuk u gjet asnjë dokument i AppSearch në bazën e të dhënave. Verifiko që emri i bazës së të dhënave është i vlefshëm dhe që është zgjedhur lloji i duhur i hapësirës ruajtëse."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Nuk u gjet asnjë lloj i skemave së AppSearch. Verifiko që emri i bazës së të dhënave është i vlefshëm dhe që është zgjedhur lloji i duhur i hapësirës ruajtëse."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Dokumentet e AppSearch po ngarkohen..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Llojet e skemave të AppSearch po ngarkohen..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Versioni i skemës: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Nuk u gjet asnjë dokument i AppSearch në bazën e të dhënave. Verifiko që emri i bazës së të dhënave është i vlefshëm dhe që është zgjedhur lloji i duhur i hapësirës ruajtëse."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Nuk u gjet asnjë lloj i skemave së AppSearch. Verifiko që emri i bazës së të dhënave është i vlefshëm dhe që është zgjedhur lloji i duhur i hapësirës ruajtëse."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Dokumentet e AppSearch po ngarkohen..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Llojet e skemave të AppSearch po ngarkohen..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Versioni i skemës: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-sr/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-sr/strings.xml
index 660dda9..78d78ea 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-sr/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-sr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Није пронађет ниједан AppSearch документ у бази података. Верификујте да је база података важећа и да је изабран исправан тип меморијског простора."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Није пронађен ниједан тип AppSearch шеме. Верификујте да је база података важећа и да је изабран исправан тип меморијског простора."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Учитавају се AppSearch документи..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Типови AppSearch шеме се учитавају..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Верзија шеме: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Није пронађет ниједан AppSearch документ у бази података. Верификујте да је база података важећа и да је изабран исправан тип меморијског простора."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Није пронађен ниједан тип AppSearch шеме. Верификујте да је база података важећа и да је изабран исправан тип меморијског простора."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Учитавају се AppSearch документи..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Типови AppSearch шеме се учитавају..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Верзија шеме: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-sv/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-sv/strings.xml
index df6a335..b9d9a2f 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-sv/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-sv/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Inget AppSearch-dokument hittades i databasen. Kontrollera att databasnamnet är giltigt och att rätt lagringstyp har angetts."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Ingen AppSearch-schematyp hittades. Kontrollera att databasnamnet är giltigt och att rätt lagringstyp har angetts."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Läser in AppSearch-dokument …"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Läser in AppSearch-schematyper …"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Schemaversion: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Inget AppSearch-dokument hittades i databasen. Kontrollera att databasnamnet är giltigt och att rätt lagringstyp har angetts."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Ingen AppSearch-schematyp hittades. Kontrollera att databasnamnet är giltigt och att rätt lagringstyp har angetts."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Läser in AppSearch-dokument …"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Läser in AppSearch-schematyper …"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Schemaversion: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-sw/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-sw/strings.xml
index 9750eb9..f606d3d 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-sw/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-sw/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Hakuna hati za Utafutaji wa Programu zilizopatikana katika hifadhidata. Thibitisha kuwa jina la hifadhidata ni sahihi na aina sahihi ya hifadhi imechaguliwa."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Hakuna aina za taratibu za Utafutaji wa Programu zilizopatikana. Thibitisha kuwa jina la hifadhidata ni sahihi na aina sahihi ya hifadhi imechaguliwa."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Inapakia hati za Utafutaji wa Programu..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Inapakia aina za taratibu za Utafutaji wa Programu..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Toleo la Taratibu: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Hakuna hati za Utafutaji wa Programu zilizopatikana katika hifadhidata. Thibitisha kuwa jina la hifadhidata ni sahihi na aina sahihi ya hifadhi imechaguliwa."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Hakuna aina za taratibu za Utafutaji wa Programu zilizopatikana. Thibitisha kuwa jina la hifadhidata ni sahihi na aina sahihi ya hifadhi imechaguliwa."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Inapakia hati za Utafutaji wa Programu..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Inapakia aina za taratibu za Utafutaji wa Programu..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Toleo la Taratibu: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ta/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ta/strings.xml
index 3d44fe9..da9bcc3 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ta/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ta/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"தரவுத்தளத்தில் AppSearch ஆவணங்கள் எதுவுமில்லை. தரவுத்தளத்தின் பெயர் சரியானதுதான் என்பதையும் சரியான சேமிப்பக வகை தேர்ந்தெடுக்கப்பட்டுள்ளதையும் உறுதிசெய்யவும்."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch திட்டப்பணித் தரவு வகைகள் எதுவுமில்லை. தரவுத்தளத்தின் பெயர் சரியானதுதான் என்பதையும் சரியான சேமிப்பக வகை தேர்ந்தெடுக்கப்பட்டுள்ளதையும் உறுதிசெய்யவும்."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch ஆவணங்களை ஏற்றுகிறது..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch திட்டப்பணித் தரவு வகைகளை ஏற்றுகிறது..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"திட்டப்பணித் தரவுப் பதிப்பு: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"தரவுத்தளத்தில் AppSearch ஆவணங்கள் எதுவுமில்லை. தரவுத்தளத்தின் பெயர் சரியானதுதான் என்பதையும் சரியான சேமிப்பக வகை தேர்ந்தெடுக்கப்பட்டுள்ளதையும் உறுதிசெய்யவும்."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch திட்டப்பணித் தரவு வகைகள் எதுவுமில்லை. தரவுத்தளத்தின் பெயர் சரியானதுதான் என்பதையும் சரியான சேமிப்பக வகை தேர்ந்தெடுக்கப்பட்டுள்ளதையும் உறுதிசெய்யவும்."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch ஆவணங்களை ஏற்றுகிறது..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch திட்டப்பணித் தரவு வகைகளை ஏற்றுகிறது..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"திட்டப்பணித் தரவுப் பதிப்பு: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-te/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-te/strings.xml
index 44a1570..b96c50c 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-te/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-te/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"డేటాబేస్లో AppSearch డాక్యుమెంట్లు కనుగొనబడలేదు. డేటాబేస్ పేరు చెల్లుబాటులో ఉందని వెరిఫై చేయండి, సరైన స్టోరేజ్ రకం ఎంచుకోబడింది."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch స్కీమా రకాలు కనుగొనబడలేదు. డేటాబేస్ పేరు చెల్లుబాటులో ఉందని వెరిఫై చేయండి, సరైన స్టోరేజ్ రకం ఎంచుకోబడింది."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch డాక్యుమెంట్లను లోడ్ చేస్తోంది..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch స్కీమా రకాలు లోడ్ అవుతున్నయి..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"స్కీమా వెర్షన్: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"డేటాబేస్లో AppSearch డాక్యుమెంట్లు ఏవీ కనుగొనబడలేదు. డేటాబేస్ పేరు సరైనదేనని, అలాగే సరైన స్టోరేజ్ రకం ఎంచుకోబడిందని వెరిఫై చేయండి."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch స్కీమా రకాలు ఏవీ కనుగొనబడలేదు. డేటాబేస్ పేరు సరైనదేనని, అలాగే సరైన స్టోరేజ్ రకం ఎంచుకోబడిందని వెరిఫై చేయండి."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch డాక్యుమెంట్లను లోడ్ చేస్తోంది..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch స్కీమా రకాలు లోడ్ అవుతున్నాయి..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"స్కీమా వెర్షన్: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-th/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-th/strings.xml
index af1bd8d..a761a26 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-th/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-th/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ไม่พบเอกสาร AppSearch ในฐานข้อมูล ตรวจสอบความถูกต้องของชื่อฐานข้อมูลและประเภทพื้นที่เก็บข้อมูลที่เลือก"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"ไม่พบประเภทสคีมาของ AppSearch ตรวจสอบความถูกต้องของชื่อฐานข้อมูลและประเภทพื้นที่เก็บข้อมูลที่เลือก"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"กำลังโหลดเอกสาร AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"กำลังโหลดประเภทสคีมาของ AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"เวอร์ชันของสคีมา: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ไม่พบเอกสาร AppSearch ในฐานข้อมูล ตรวจสอบความถูกต้องของชื่อฐานข้อมูลและประเภทพื้นที่เก็บข้อมูลที่เลือก"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"ไม่พบประเภทสคีมาของ AppSearch ตรวจสอบความถูกต้องของชื่อฐานข้อมูลและประเภทพื้นที่เก็บข้อมูลที่เลือก"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"กำลังโหลดเอกสาร AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"กำลังโหลดประเภทสคีมาของ AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"เวอร์ชันของสคีมา: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-tl/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-tl/strings.xml
index febd912..9fad0ee 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-tl/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-tl/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Walang nakitang dokumento ng AppSearch sa database. I-verify na valid ang pangalan ng database at tamang uri ng storage ang napili."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Walang nakitang uri ng schema ng AppSearch. I-verify na valid ang pangalan ng database at tamang uri ng storage ang napili."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Nilo-load ang mga dokumento ng AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Naglo-load ng mga uri ng schema ng AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Bersyon ng Schema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Walang nakitang dokumento ng AppSearch sa database. I-verify na valid ang pangalan ng database at tamang uri ng storage ang napili."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Walang nakitang uri ng schema ng AppSearch. I-verify na valid ang pangalan ng database at tamang uri ng storage ang napili."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Nilo-load ang mga dokumento ng AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Naglo-load ng mga uri ng schema ng AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Bersyon ng Schema: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-tr/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-tr/strings.xml
index cb5e867..83cd0b5 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-tr/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-tr/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Veritabanında AppSearch belgesi bulunamadı. Veritabanı adının geçerli olduğunu ve doğru depolama türünün seçildiğini doğrulayın."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch şema türü bulunamadı. Veritabanı adının geçerli olduğunu ve doğru depolama türünün seçildiğini doğrulayın."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch belgeleri yükleniyor..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch şema türleri yükleniyor..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Şema Sürümü: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Veritabanında AppSearch dokümanı bulunamadı. Veritabanı adının geçerli olduğunu ve doğru depolama alanı türünün seçildiğini onaylayın."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch şema türü bulunamadı. Veritabanı adının geçerli olduğunu ve doğru depolama alanı türünün seçildiğini onaylayın."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch dokümanları yükleniyor..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch şema türleri yükleniyor..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Şema Sürümü: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-uk/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-uk/strings.xml
index ce896d3..597ecf3 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-uk/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-uk/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"У базі даних немає документів AppSearch. Підтвердьте, що назва бази даних дійсна й вибрано правильний тип сховища."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Типів схеми AppSearch не знайдено. Підтвердьте, що назва бази даних дійсна й вибрано правильний тип сховища."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Завантаження документів AppSearch…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Завантаження типів схеми AppSearch…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Версія схеми: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"У базі даних немає документів AppSearch. Підтвердьте, що назва бази даних дійсна й вибрано правильний тип сховища."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Типів схеми AppSearch не знайдено. Підтвердьте, що назва бази даних дійсна й вибрано правильний тип сховища."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Завантаження документів AppSearch…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Завантаження типів схеми AppSearch…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Версія схеми: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-ur/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-ur/strings.xml
index c88f789..0380006 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-ur/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-ur/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"ڈیٹا بیس میں کوئی AppSearch دستاویز نہیں ملا۔ توثیق کریں کہ ڈیٹا بیس کا نام درست ہے اور اسٹوریج کی صحیح قسم منتخب کی گئی تھی۔"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"AppSearch سکیما کی کوئی قسم نہیں ملی۔ توثیق کریں کہ ڈیٹا بیس کا نام درست ہے اور اسٹوریج کی صحیح قسم منتخب کی گئی تھی۔"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch دستاویزات لوڈ ہو رہے ہیں..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch سکیما کی اقسام لوڈ ہو رہی ہیں..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"سکیما ورژن: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"ڈیٹا بیس میں AppSearch کی کوئی دستاویز نہیں ملی۔ توثیق کریں کہ ڈیٹا بیس کا نام درست ہے اور اسٹوریج کی صحیح قسم منتخب کی گئی تھی۔"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"AppSearch سکیما کی کوئی قسم نہیں ملی۔ توثیق کریں کہ ڈیٹا بیس کا نام درست ہے اور اسٹوریج کی صحیح قسم منتخب کی گئی تھی۔"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch کی دستاویزات لوڈ ہو رہی ہیں..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch سکیما کی اقسام لوڈ ہو رہی ہیں..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"سکیما ورژن: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-uz/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-uz/strings.xml
index 46fa912..614266b 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-uz/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-uz/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Ma’lumotlar bazasidan hech qanday AppSearch hujjatlari topilmadi. Ma’lumotlar bazasi yaroqli va xatosiz xotira tanlanganini tasdiqlang."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Hech qanday AppSearch sxemasi topilmadi. Ma’lumotlar bazasi yaroqli va xatosiz xotira tanlanganini tasdiqlang."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"AppSearch hujjatlari yuklanmoqda..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"AppSearch sxemasi turlari yuklanmoqda..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Sxema versiyasi: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Maʼlumotlar bazasidan hech qanday AppSearch hujjatlari topilmadi. Maʼlumotlar bazasi yaroqli va xatosiz xotira tanlanganini tasdiqlang."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Hech qanday AppSearch sxemasi topilmadi. Maʼlumotlar bazasi yaroqli va xatosiz xotira tanlanganini tasdiqlang."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"AppSearch hujjatlari yuklanmoqda..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"AppSearch sxemasi turlari yuklanmoqda..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Sxema versiyasi: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-vi/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-vi/strings.xml
index 7024d29..3ee3e0d 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-vi/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-vi/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Không tìm thấy tài liệu AppSearch trong cơ sở dữ liệu. Hãy xác minh rằng tên cơ sở dữ liệu là hợp lệ và bạn đã chọn đúng loại bộ nhớ."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Không tìm thấy loại giản đồ AppSearch. Hãy xác minh rằng tên cơ sở dữ liệu là hợp lệ và bạn đã chọn đúng loại bộ nhớ."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Đang tải các tài liệu AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Đang tải các loại giản đồ AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Phiên bản giản đồ: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Không tìm thấy tài liệu AppSearch trong cơ sở dữ liệu. Hãy xác minh rằng tên cơ sở dữ liệu là hợp lệ và bạn đã chọn đúng loại bộ nhớ."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Không tìm thấy loại giản đồ AppSearch. Hãy xác minh rằng tên cơ sở dữ liệu là hợp lệ và bạn đã chọn đúng loại bộ nhớ."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Đang tải các tài liệu AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Đang tải các loại giản đồ AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Phiên bản giản đồ: %d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-zh-rCN/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-zh-rCN/strings.xml
index ec6d36e..fa1ecad74 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-zh-rCN/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-zh-rCN/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"未在数据库中找到任何 AppSearch 文档。请确认数据库名称有效且选择的存储类型正确。"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"未找到任何 AppSearch 架构类型。请确认数据库名称有效且选择的存储类型正确。"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"正在加载 AppSearch 文档…"</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"正在加载 AppSearch 架构类型…"</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"架构版本:%d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"未在数据库中找到任何 AppSearch 文档。请确认数据库名称有效且选择的存储类型正确。"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"未找到任何 AppSearch 架构类型。请确认数据库名称有效且选择的存储类型正确。"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"正在加载 AppSearch 文档…"</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"正在加载 AppSearch 架构类型…"</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"架构版本:%d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-zh-rHK/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-zh-rHK/strings.xml
index a2e6f05..2dfaa42 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-zh-rHK/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-zh-rHK/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"資料庫中找不到 AppSearch 文件。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"找不到 AppSearch 結構定義類型。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"正在載入 AppSearch 文件..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"正在載入 AppSearch 結構定義類型..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"結構定義版本:%d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"資料庫中找不到 AppSearch 文件。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"找不到 AppSearch 結構定義類型。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"正在載入 AppSearch 文件..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"正在載入 AppSearch 結構定義類型..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"結構定義版本:%d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-zh-rTW/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-zh-rTW/strings.xml
index a2e6f05..2dfaa42 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-zh-rTW/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-zh-rTW/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"資料庫中找不到 AppSearch 文件。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"找不到 AppSearch 結構定義類型。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"正在載入 AppSearch 文件..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"正在載入 AppSearch 結構定義類型..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"結構定義版本:%d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"資料庫中找不到 AppSearch 文件。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"找不到 AppSearch 結構定義類型。請確認資料庫名稱有效,並選取正確的儲存空間類型。"</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"正在載入 AppSearch 文件..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"正在載入 AppSearch 結構定義類型..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"結構定義版本:%d"</string>
</resources>
diff --git a/appsearch/appsearch-debug-view/src/main/res/values-zu/strings.xml b/appsearch/appsearch-debug-view/src/main/res/values-zu/strings.xml
index ea093a0..7b36008 100644
--- a/appsearch/appsearch-debug-view/src/main/res/values-zu/strings.xml
+++ b/appsearch/appsearch-debug-view/src/main/res/values-zu/strings.xml
@@ -17,9 +17,9 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="appsearch_no_documents_error" msgid="2371906054857961621">"Awekho amadokhumenti we-AppSearch atholakele kusizindalwazi. Qinisekisa ukuthi igama lesizindalwazi livumelekile nokuthi kukhethwe uhlobo lwesitoreji esifanele."</string>
- <string name="appsearch_no_schema_types_error" msgid="6040453370924007774">"Azikho izinhlobo ze-schema se-AppSearch ezitholakele. Qinisekisa ukuthi igama lesizindalwazi livumelekile nokuthi kukhethwe uhlobo lwesitoreji esifanele."</string>
- <string name="appsearch_documents_loading" msgid="3079225167662255666">"Ilayisha amadokhumenti we-AppSearch..."</string>
- <string name="appsearch_schema_types_loading" msgid="5223743742396711620">"Ilayisha izinhlobo ze-schema se-AppSearch..."</string>
- <string name="appsearch_schema_version" msgid="5289450345246068014">"Uhlobo lwe-Schema: %d"</string>
+ <string name="appsearch_no_documents_error" msgid="7957333381856121779">"Awekho amadokhumenti we-AppSearch atholakele kusizindalwazi. Qinisekisa ukuthi igama lesizindalwazi livumelekile nokuthi kukhethwe uhlobo lwesitoreji esifanele."</string>
+ <string name="appsearch_no_schema_types_error" msgid="5825283982305113887">"Azikho izinhlobo ze-schema se-AppSearch ezitholakele. Qinisekisa ukuthi igama lesizindalwazi livumelekile nokuthi kukhethwe uhlobo lwesitoreji esifanele."</string>
+ <string name="appsearch_documents_loading" msgid="1689893533003672860">"Ilayisha amadokhumenti we-AppSearch..."</string>
+ <string name="appsearch_schema_types_loading" msgid="4961123108404531766">"Ilayisha izinhlobo ze-schema se-AppSearch..."</string>
+ <string name="appsearch_schema_version" msgid="7000254633719373917">"Uhlobo lwe-Schema: %d"</string>
</resources>
diff --git a/biometric/biometric-ktx/build.gradle b/biometric/biometric-ktx/build.gradle
index b71d2f3..e4d54d3 100755
--- a/biometric/biometric-ktx/build.gradle
+++ b/biometric/biometric-ktx/build.gradle
@@ -27,6 +27,8 @@
api(libs.kotlinStdlib)
api(libs.kotlinCoroutinesCore)
api(project(":biometric:biometric"))
+
+ samples(project(":biometric:biometric-ktx-samples"))
}
androidx {
diff --git a/biometric/biometric-ktx/samples/build.gradle b/biometric/biometric-ktx/samples/build.gradle
index 4835be3c..1433fd3 100644
--- a/biometric/biometric-ktx/samples/build.gradle
+++ b/biometric/biometric-ktx/samples/build.gradle
@@ -35,10 +35,3 @@
inceptionYear = "2021"
description = "Contains the sample code for the AndroidX Biometric library"
}
-
-android {
- lintOptions {
- // Crashes due tob/187418637
- disable "EnforceSampledAnnotation"
- }
-}
diff --git a/biometric/biometric-ktx/samples/lint-baseline.xml b/biometric/biometric-ktx/samples/lint-baseline.xml
new file mode 100644
index 0000000..50b37a7
--- /dev/null
+++ b/biometric/biometric-ktx/samples/lint-baseline.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha07" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha07)" variant="all" version="7.1.0-alpha07">
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: BiometricPrompt.AUTHENTICATION_RESULT_TYPE_UNKNOWN, BiometricPrompt.AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL, BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC, but could be BiometricPrompt.AUTHENTICATION_RESULT_TYPE_DEVICE_CREDENTIAL, BiometricPrompt.AUTHENTICATION_RESULT_TYPE_BIOMETRIC"
+ errorLine1=" return result.getAuthenticationType();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/biometric/AuthenticationCallbackProvider.java"
+ line="189"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: BiometricManager.BIOMETRIC_SUCCESS, BiometricManager.BIOMETRIC_STATUS_UNKNOWN, BiometricManager.BIOMETRIC_ERROR_UNSUPPORTED, BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE, BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED, BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE, BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED, but could be BiometricManager.BIOMETRIC_SUCCESS, BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE, BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED, BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE, BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED"
+ errorLine1=" return biometricManager.canAuthenticate(authenticators);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/biometric/BiometricManager.java"
+ line="532"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: BiometricManager.BIOMETRIC_SUCCESS, BiometricManager.BIOMETRIC_STATUS_UNKNOWN, BiometricManager.BIOMETRIC_ERROR_UNSUPPORTED, BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE, BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED, BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE, BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED, but could be BiometricManager.BIOMETRIC_SUCCESS, BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE, BiometricManager.BIOMETRIC_ERROR_NONE_ENROLLED, BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE, BiometricManager.BIOMETRIC_ERROR_SECURITY_UPDATE_REQUIRED"
+ errorLine1=" return biometricManager.canAuthenticate();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/biometric/BiometricManager.java"
+ line="568"
+ column="20"/>
+ </issue>
+
+</issues>
diff --git a/browser/browser/api/1.4.0-beta02.txt b/browser/browser/api/1.4.0-beta02.txt
new file mode 100644
index 0000000..2f00014
--- /dev/null
+++ b/browser/browser/api/1.4.0-beta02.txt
@@ -0,0 +1,450 @@
+// Signature format: 4.0
+package androidx.browser.browseractions {
+
+ @Deprecated public class BrowserActionItem {
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+ method @Deprecated public android.app.PendingIntent getAction();
+ method @Deprecated public int getIconId();
+ method @Deprecated public String getTitle();
+ }
+
+ @Deprecated public class BrowserActionsIntent {
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+ method @Deprecated public android.content.Intent getIntent();
+ method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+ method @Deprecated public static void launchIntent(android.content.Context, android.content.Intent);
+ method @Deprecated public static void openBrowserAction(android.content.Context, android.net.Uri);
+ method @Deprecated public static void openBrowserAction(android.content.Context, android.net.Uri, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>, android.app.PendingIntent);
+ method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!> parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>);
+ field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+ field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+ field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+ field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+ field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+ field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+ field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+ field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+ field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+ field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+ field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+ field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+ field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+ field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+ field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+ field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+ field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+ field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+ }
+
+ @Deprecated public static final class BrowserActionsIntent.Builder {
+ ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context, android.net.Uri);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent build();
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setOnItemSelectedAction(android.app.PendingIntent);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setUrlType(int);
+ }
+
+}
+
+package androidx.browser.customtabs {
+
+ public final class CustomTabColorSchemeParams {
+ field @ColorInt public final Integer? navigationBarColor;
+ field @ColorInt public final Integer? navigationBarDividerColor;
+ field @ColorInt public final Integer? secondaryToolbarColor;
+ field @ColorInt public final Integer? toolbarColor;
+ }
+
+ public static final class CustomTabColorSchemeParams.Builder {
+ ctor public CustomTabColorSchemeParams.Builder();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarDividerColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+ }
+
+ public class CustomTabsCallback {
+ ctor public CustomTabsCallback();
+ method public void extraCallback(String, android.os.Bundle?);
+ method public android.os.Bundle? extraCallbackWithResult(String, android.os.Bundle?);
+ method public void onMessageChannelReady(android.os.Bundle?);
+ method public void onNavigationEvent(int, android.os.Bundle?);
+ method public void onPostMessage(String, android.os.Bundle?);
+ method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, boolean, android.os.Bundle?);
+ field public static final int NAVIGATION_ABORTED = 4; // 0x4
+ field public static final int NAVIGATION_FAILED = 3; // 0x3
+ field public static final int NAVIGATION_FINISHED = 2; // 0x2
+ field public static final int NAVIGATION_STARTED = 1; // 0x1
+ field public static final int TAB_HIDDEN = 6; // 0x6
+ field public static final int TAB_SHOWN = 5; // 0x5
+ }
+
+ public class CustomTabsClient {
+ method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean bindCustomTabsServicePreservePriority(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean connectAndInitialize(android.content.Context, String);
+ method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+ method public boolean warmup(long);
+ }
+
+ public final class CustomTabsIntent {
+ method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, int);
+ method public static int getMaxToolbarItems();
+ method public void launchUrl(android.content.Context, android.net.Uri);
+ method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent?);
+ method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
+ field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+ field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+ field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+ field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+ field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+ field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+ field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+ field @Deprecated public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+ field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+ field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+ field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+ field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+ field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+ field public static final String EXTRA_NAVIGATION_BAR_DIVIDER_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_DIVIDER_COLOR";
+ field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+ field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+ field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+ field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+ field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+ field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+ field public static final String EXTRA_SHARE_STATE = "androidx.browser.customtabs.extra.SHARE_STATE";
+ field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+ field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+ field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+ field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+ field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+ field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+ field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+ field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+ field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+ field public static final int NO_TITLE = 0; // 0x0
+ field public static final int SHARE_STATE_DEFAULT = 0; // 0x0
+ field public static final int SHARE_STATE_OFF = 2; // 0x2
+ field public static final int SHARE_STATE_ON = 1; // 0x1
+ field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+ field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+ field public final android.content.Intent intent;
+ field public final android.os.Bundle? startAnimationBundle;
+ }
+
+ public static final class CustomTabsIntent.Builder {
+ ctor public CustomTabsIntent.Builder();
+ ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+ method public androidx.browser.customtabs.CustomTabsIntent build();
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setDefaultShareMenuItemEnabled(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarDividerColor(@ColorInt int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSession(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShareState(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setUrlBarHidingEnabled(boolean);
+ }
+
+ public abstract class CustomTabsService extends android.app.Service {
+ ctor public CustomTabsService();
+ method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken);
+ method protected abstract android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri?, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
+ method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken);
+ method public android.os.IBinder onBind(android.content.Intent?);
+ method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken, String, android.os.Bundle?);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
+ method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri);
+ method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken, android.os.Bundle?);
+ method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ method protected abstract boolean warmup(long);
+ field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final String CATEGORY_TRUSTED_WEB_ACTIVITY_IMMERSIVE_MODE = "androidx.browser.trusted.category.ImmersiveMode";
+ field public static final String CATEGORY_WEB_SHARE_TARGET_V2 = "androidx.browser.trusted.category.WebShareTargetV2";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+ field public static final String KEY_SUCCESS = "androidx.browser.customtabs.SUCCESS";
+ field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+ field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+ field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+ field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+ field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+ field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+ }
+
+ @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CustomTabsService.Relation {
+ }
+
+ @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CustomTabsService.Result {
+ }
+
+ public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+ ctor public CustomTabsServiceConnection();
+ method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, androidx.browser.customtabs.CustomTabsClient);
+ method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ }
+
+ public final class CustomTabsSession {
+ method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+ method public boolean mayLaunchUrl(android.net.Uri?, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
+ method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String, android.os.Bundle?);
+ method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
+ method public boolean requestPostMessageChannel(android.net.Uri);
+ method public boolean setActionButton(android.graphics.Bitmap, String);
+ method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+ method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+ method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ }
+
+ public class CustomTabsSessionToken {
+ method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+ method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+ method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+ method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+ }
+
+ public class PostMessageService extends android.app.Service {
+ ctor public PostMessageService();
+ method public android.os.IBinder onBind(android.content.Intent?);
+ }
+
+ public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+ ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken);
+ method public boolean bindSessionToPostMessageService(android.content.Context, String);
+ method public final boolean notifyMessageChannelReady(android.os.Bundle?);
+ method public void onPostMessageServiceConnected();
+ method public void onPostMessageServiceDisconnected();
+ method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ method public final void onServiceDisconnected(android.content.ComponentName);
+ method public final boolean postMessage(String, android.os.Bundle?);
+ method public void unbindFromContext(android.content.Context);
+ }
+
+ public class TrustedWebUtils {
+ method public static boolean areSplashScreensSupported(android.content.Context, String, String);
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+ field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+ }
+
+}
+
+package androidx.browser.trusted {
+
+ public final class ScreenOrientation {
+ field public static final int ANY = 5; // 0x5
+ field public static final int DEFAULT = 0; // 0x0
+ field public static final int LANDSCAPE = 6; // 0x6
+ field public static final int LANDSCAPE_PRIMARY = 3; // 0x3
+ field public static final int LANDSCAPE_SECONDARY = 4; // 0x4
+ field public static final int NATURAL = 8; // 0x8
+ field public static final int PORTRAIT = 7; // 0x7
+ field public static final int PORTRAIT_PRIMARY = 1; // 0x1
+ field public static final int PORTRAIT_SECONDARY = 2; // 0x2
+ }
+
+ public final class Token {
+ method public static androidx.browser.trusted.Token? create(String, android.content.pm.PackageManager);
+ method public static androidx.browser.trusted.Token deserialize(byte[]);
+ method public boolean matches(String, android.content.pm.PackageManager);
+ method public byte[] serialize();
+ }
+
+ public interface TokenStore {
+ method @BinderThread public androidx.browser.trusted.Token? load();
+ method @WorkerThread public void store(androidx.browser.trusted.Token?);
+ }
+
+ public abstract class TrustedWebActivityCallback {
+ ctor public TrustedWebActivityCallback();
+ method public abstract void onExtraCallback(String, android.os.Bundle?);
+ }
+
+ public class TrustedWebActivityCallbackRemote {
+ method public void runExtraCallback(String, android.os.Bundle) throws android.os.RemoteException;
+ }
+
+ public interface TrustedWebActivityDisplayMode {
+ method public static androidx.browser.trusted.TrustedWebActivityDisplayMode fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_ID = "androidx.browser.trusted.displaymode.KEY_ID";
+ }
+
+ public static class TrustedWebActivityDisplayMode.DefaultMode implements androidx.browser.trusted.TrustedWebActivityDisplayMode {
+ ctor public TrustedWebActivityDisplayMode.DefaultMode();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static class TrustedWebActivityDisplayMode.ImmersiveMode implements androidx.browser.trusted.TrustedWebActivityDisplayMode {
+ ctor public TrustedWebActivityDisplayMode.ImmersiveMode(boolean, int);
+ method public boolean isSticky();
+ method public int layoutInDisplayCutoutMode();
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_CUTOUT_MODE = "androidx.browser.trusted.displaymode.KEY_CUTOUT_MODE";
+ field public static final String KEY_STICKY = "androidx.browser.trusted.displaymode.KEY_STICKY";
+ }
+
+ public final class TrustedWebActivityIntent {
+ method public android.content.Intent getIntent();
+ method public void launchTrustedWebActivity(android.content.Context);
+ }
+
+ public class TrustedWebActivityIntentBuilder {
+ ctor public TrustedWebActivityIntentBuilder(android.net.Uri);
+ method public androidx.browser.trusted.TrustedWebActivityIntent build(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.customtabs.CustomTabsIntent buildCustomTabsIntent();
+ method public androidx.browser.trusted.TrustedWebActivityDisplayMode getDisplayMode();
+ method public android.net.Uri getUri();
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setColorScheme(int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDisplayMode(androidx.browser.trusted.TrustedWebActivityDisplayMode);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarColor(@ColorInt int);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarDividerColor(@ColorInt int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setScreenOrientation(int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setShareParams(androidx.browser.trusted.sharing.ShareTarget, androidx.browser.trusted.sharing.ShareData);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setSplashScreenParams(android.os.Bundle);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setToolbarColor(@ColorInt int);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_DISPLAY_MODE = "androidx.browser.trusted.extra.DISPLAY_MODE";
+ field public static final String EXTRA_SCREEN_ORIENTATION = "androidx.browser.trusted.extra.SCREEN_ORIENTATION";
+ field public static final String EXTRA_SHARE_DATA = "androidx.browser.trusted.extra.SHARE_DATA";
+ field public static final String EXTRA_SHARE_TARGET = "androidx.browser.trusted.extra.SHARE_TARGET";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
+
+ public abstract class TrustedWebActivityService extends android.app.Service {
+ ctor public TrustedWebActivityService();
+ method @BinderThread public abstract androidx.browser.trusted.TokenStore getTokenStore();
+ method @BinderThread public boolean onAreNotificationsEnabled(String);
+ method @MainThread public final android.os.IBinder? onBind(android.content.Intent?);
+ method @BinderThread public void onCancelNotification(String, int);
+ method @BinderThread public android.os.Bundle? onExtraCommand(String, android.os.Bundle, androidx.browser.trusted.TrustedWebActivityCallbackRemote?);
+ method @BinderThread public android.os.Bundle onGetSmallIconBitmap();
+ method @BinderThread public int onGetSmallIconId();
+ method @BinderThread public boolean onNotifyNotificationWithChannel(String, int, android.app.Notification, String);
+ method @MainThread public final boolean onUnbind(android.content.Intent?);
+ field public static final String ACTION_TRUSTED_WEB_ACTIVITY_SERVICE = "android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE";
+ field public static final String KEY_SMALL_ICON_BITMAP = "android.support.customtabs.trusted.SMALL_ICON_BITMAP";
+ field public static final String KEY_SUCCESS = "androidx.browser.trusted.SUCCESS";
+ field public static final String META_DATA_NAME_SMALL_ICON = "android.support.customtabs.trusted.SMALL_ICON";
+ field public static final int SMALL_ICON_NOT_SET = -1; // 0xffffffff
+ }
+
+ public final class TrustedWebActivityServiceConnection {
+ method public boolean areNotificationsEnabled(String) throws android.os.RemoteException;
+ method public void cancel(String, int) throws android.os.RemoteException;
+ method public android.content.ComponentName getComponentName();
+ method public android.graphics.Bitmap? getSmallIconBitmap() throws android.os.RemoteException;
+ method public int getSmallIconId() throws android.os.RemoteException;
+ method public boolean notify(String, int, android.app.Notification, String) throws android.os.RemoteException;
+ method public android.os.Bundle? sendExtraCommand(String, android.os.Bundle, androidx.browser.trusted.TrustedWebActivityCallback?) throws android.os.RemoteException;
+ }
+
+ public final class TrustedWebActivityServiceConnectionPool {
+ method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.browser.trusted.TrustedWebActivityServiceConnection!> connect(android.net.Uri, java.util.Set<androidx.browser.trusted.Token!>, java.util.concurrent.Executor);
+ method public static androidx.browser.trusted.TrustedWebActivityServiceConnectionPool create(android.content.Context);
+ method @MainThread public boolean serviceExistsForScope(android.net.Uri, java.util.Set<androidx.browser.trusted.Token!>);
+ }
+
+}
+
+package androidx.browser.trusted.sharing {
+
+ public final class ShareData {
+ ctor public ShareData(String?, String?, java.util.List<android.net.Uri!>?);
+ method public static androidx.browser.trusted.sharing.ShareData fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_TEXT = "androidx.browser.trusted.sharing.KEY_TEXT";
+ field public static final String KEY_TITLE = "androidx.browser.trusted.sharing.KEY_TITLE";
+ field public static final String KEY_URIS = "androidx.browser.trusted.sharing.KEY_URIS";
+ field public final String? text;
+ field public final String? title;
+ field public final java.util.List<android.net.Uri!>? uris;
+ }
+
+ public final class ShareTarget {
+ ctor public ShareTarget(String, String?, String?, androidx.browser.trusted.sharing.ShareTarget.Params);
+ method public static androidx.browser.trusted.sharing.ShareTarget? fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String ENCODING_TYPE_MULTIPART = "multipart/form-data";
+ field public static final String ENCODING_TYPE_URL_ENCODED = "application/x-www-form-urlencoded";
+ field public static final String KEY_ACTION = "androidx.browser.trusted.sharing.KEY_ACTION";
+ field public static final String KEY_ENCTYPE = "androidx.browser.trusted.sharing.KEY_ENCTYPE";
+ field public static final String KEY_METHOD = "androidx.browser.trusted.sharing.KEY_METHOD";
+ field public static final String KEY_PARAMS = "androidx.browser.trusted.sharing.KEY_PARAMS";
+ field public static final String METHOD_GET = "GET";
+ field public static final String METHOD_POST = "POST";
+ field public final String action;
+ field public final String? encodingType;
+ field public final String? method;
+ field public final androidx.browser.trusted.sharing.ShareTarget.Params params;
+ }
+
+ public static final class ShareTarget.FileFormField {
+ ctor public ShareTarget.FileFormField(String, java.util.List<java.lang.String!>);
+ field public static final String KEY_ACCEPTED_TYPES = "androidx.browser.trusted.sharing.KEY_ACCEPTED_TYPES";
+ field public static final String KEY_NAME = "androidx.browser.trusted.sharing.KEY_FILE_NAME";
+ field public final java.util.List<java.lang.String!> acceptedTypes;
+ field public final String name;
+ }
+
+ public static class ShareTarget.Params {
+ ctor public ShareTarget.Params(String?, String?, java.util.List<androidx.browser.trusted.sharing.ShareTarget.FileFormField!>?);
+ field public static final String KEY_FILES = "androidx.browser.trusted.sharing.KEY_FILES";
+ field public static final String KEY_TEXT = "androidx.browser.trusted.sharing.KEY_TEXT";
+ field public static final String KEY_TITLE = "androidx.browser.trusted.sharing.KEY_TITLE";
+ field public final java.util.List<androidx.browser.trusted.sharing.ShareTarget.FileFormField!>? files;
+ field public final String? text;
+ field public final String? title;
+ }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String KEY_BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String KEY_FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String KEY_IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String KEY_SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String KEY_VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/browser/browser/api/public_plus_experimental_1.4.0-beta02.txt b/browser/browser/api/public_plus_experimental_1.4.0-beta02.txt
new file mode 100644
index 0000000..2f00014
--- /dev/null
+++ b/browser/browser/api/public_plus_experimental_1.4.0-beta02.txt
@@ -0,0 +1,450 @@
+// Signature format: 4.0
+package androidx.browser.browseractions {
+
+ @Deprecated public class BrowserActionItem {
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+ method @Deprecated public android.app.PendingIntent getAction();
+ method @Deprecated public int getIconId();
+ method @Deprecated public String getTitle();
+ }
+
+ @Deprecated public class BrowserActionsIntent {
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+ method @Deprecated public android.content.Intent getIntent();
+ method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+ method @Deprecated public static void launchIntent(android.content.Context, android.content.Intent);
+ method @Deprecated public static void openBrowserAction(android.content.Context, android.net.Uri);
+ method @Deprecated public static void openBrowserAction(android.content.Context, android.net.Uri, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>, android.app.PendingIntent);
+ method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!> parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>);
+ field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+ field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+ field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+ field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+ field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+ field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+ field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+ field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+ field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+ field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+ field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+ field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+ field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+ field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+ field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+ field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+ field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+ field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+ }
+
+ @Deprecated public static final class BrowserActionsIntent.Builder {
+ ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context, android.net.Uri);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent build();
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setOnItemSelectedAction(android.app.PendingIntent);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setUrlType(int);
+ }
+
+}
+
+package androidx.browser.customtabs {
+
+ public final class CustomTabColorSchemeParams {
+ field @ColorInt public final Integer? navigationBarColor;
+ field @ColorInt public final Integer? navigationBarDividerColor;
+ field @ColorInt public final Integer? secondaryToolbarColor;
+ field @ColorInt public final Integer? toolbarColor;
+ }
+
+ public static final class CustomTabColorSchemeParams.Builder {
+ ctor public CustomTabColorSchemeParams.Builder();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarDividerColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+ }
+
+ public class CustomTabsCallback {
+ ctor public CustomTabsCallback();
+ method public void extraCallback(String, android.os.Bundle?);
+ method public android.os.Bundle? extraCallbackWithResult(String, android.os.Bundle?);
+ method public void onMessageChannelReady(android.os.Bundle?);
+ method public void onNavigationEvent(int, android.os.Bundle?);
+ method public void onPostMessage(String, android.os.Bundle?);
+ method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, boolean, android.os.Bundle?);
+ field public static final int NAVIGATION_ABORTED = 4; // 0x4
+ field public static final int NAVIGATION_FAILED = 3; // 0x3
+ field public static final int NAVIGATION_FINISHED = 2; // 0x2
+ field public static final int NAVIGATION_STARTED = 1; // 0x1
+ field public static final int TAB_HIDDEN = 6; // 0x6
+ field public static final int TAB_SHOWN = 5; // 0x5
+ }
+
+ public class CustomTabsClient {
+ method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean bindCustomTabsServicePreservePriority(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean connectAndInitialize(android.content.Context, String);
+ method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+ method public boolean warmup(long);
+ }
+
+ public final class CustomTabsIntent {
+ method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, int);
+ method public static int getMaxToolbarItems();
+ method public void launchUrl(android.content.Context, android.net.Uri);
+ method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent?);
+ method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
+ field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+ field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+ field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+ field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+ field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+ field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+ field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+ field @Deprecated public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+ field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+ field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+ field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+ field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+ field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+ field public static final String EXTRA_NAVIGATION_BAR_DIVIDER_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_DIVIDER_COLOR";
+ field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+ field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+ field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+ field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+ field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+ field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+ field public static final String EXTRA_SHARE_STATE = "androidx.browser.customtabs.extra.SHARE_STATE";
+ field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+ field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+ field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+ field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+ field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+ field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+ field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+ field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+ field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+ field public static final int NO_TITLE = 0; // 0x0
+ field public static final int SHARE_STATE_DEFAULT = 0; // 0x0
+ field public static final int SHARE_STATE_OFF = 2; // 0x2
+ field public static final int SHARE_STATE_ON = 1; // 0x1
+ field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+ field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+ field public final android.content.Intent intent;
+ field public final android.os.Bundle? startAnimationBundle;
+ }
+
+ public static final class CustomTabsIntent.Builder {
+ ctor public CustomTabsIntent.Builder();
+ ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+ method public androidx.browser.customtabs.CustomTabsIntent build();
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setDefaultShareMenuItemEnabled(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarDividerColor(@ColorInt int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSession(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShareState(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setUrlBarHidingEnabled(boolean);
+ }
+
+ public abstract class CustomTabsService extends android.app.Service {
+ ctor public CustomTabsService();
+ method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken);
+ method protected abstract android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri?, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
+ method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken);
+ method public android.os.IBinder onBind(android.content.Intent?);
+ method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken, String, android.os.Bundle?);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
+ method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri);
+ method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken, android.os.Bundle?);
+ method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ method protected abstract boolean warmup(long);
+ field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final String CATEGORY_TRUSTED_WEB_ACTIVITY_IMMERSIVE_MODE = "androidx.browser.trusted.category.ImmersiveMode";
+ field public static final String CATEGORY_WEB_SHARE_TARGET_V2 = "androidx.browser.trusted.category.WebShareTargetV2";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+ field public static final String KEY_SUCCESS = "androidx.browser.customtabs.SUCCESS";
+ field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+ field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+ field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+ field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+ field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+ field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+ }
+
+ @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CustomTabsService.Relation {
+ }
+
+ @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CustomTabsService.Result {
+ }
+
+ public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+ ctor public CustomTabsServiceConnection();
+ method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, androidx.browser.customtabs.CustomTabsClient);
+ method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ }
+
+ public final class CustomTabsSession {
+ method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+ method public boolean mayLaunchUrl(android.net.Uri?, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
+ method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String, android.os.Bundle?);
+ method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
+ method public boolean requestPostMessageChannel(android.net.Uri);
+ method public boolean setActionButton(android.graphics.Bitmap, String);
+ method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+ method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+ method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ }
+
+ public class CustomTabsSessionToken {
+ method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+ method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+ method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+ method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+ }
+
+ public class PostMessageService extends android.app.Service {
+ ctor public PostMessageService();
+ method public android.os.IBinder onBind(android.content.Intent?);
+ }
+
+ public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+ ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken);
+ method public boolean bindSessionToPostMessageService(android.content.Context, String);
+ method public final boolean notifyMessageChannelReady(android.os.Bundle?);
+ method public void onPostMessageServiceConnected();
+ method public void onPostMessageServiceDisconnected();
+ method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ method public final void onServiceDisconnected(android.content.ComponentName);
+ method public final boolean postMessage(String, android.os.Bundle?);
+ method public void unbindFromContext(android.content.Context);
+ }
+
+ public class TrustedWebUtils {
+ method public static boolean areSplashScreensSupported(android.content.Context, String, String);
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+ field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+ }
+
+}
+
+package androidx.browser.trusted {
+
+ public final class ScreenOrientation {
+ field public static final int ANY = 5; // 0x5
+ field public static final int DEFAULT = 0; // 0x0
+ field public static final int LANDSCAPE = 6; // 0x6
+ field public static final int LANDSCAPE_PRIMARY = 3; // 0x3
+ field public static final int LANDSCAPE_SECONDARY = 4; // 0x4
+ field public static final int NATURAL = 8; // 0x8
+ field public static final int PORTRAIT = 7; // 0x7
+ field public static final int PORTRAIT_PRIMARY = 1; // 0x1
+ field public static final int PORTRAIT_SECONDARY = 2; // 0x2
+ }
+
+ public final class Token {
+ method public static androidx.browser.trusted.Token? create(String, android.content.pm.PackageManager);
+ method public static androidx.browser.trusted.Token deserialize(byte[]);
+ method public boolean matches(String, android.content.pm.PackageManager);
+ method public byte[] serialize();
+ }
+
+ public interface TokenStore {
+ method @BinderThread public androidx.browser.trusted.Token? load();
+ method @WorkerThread public void store(androidx.browser.trusted.Token?);
+ }
+
+ public abstract class TrustedWebActivityCallback {
+ ctor public TrustedWebActivityCallback();
+ method public abstract void onExtraCallback(String, android.os.Bundle?);
+ }
+
+ public class TrustedWebActivityCallbackRemote {
+ method public void runExtraCallback(String, android.os.Bundle) throws android.os.RemoteException;
+ }
+
+ public interface TrustedWebActivityDisplayMode {
+ method public static androidx.browser.trusted.TrustedWebActivityDisplayMode fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_ID = "androidx.browser.trusted.displaymode.KEY_ID";
+ }
+
+ public static class TrustedWebActivityDisplayMode.DefaultMode implements androidx.browser.trusted.TrustedWebActivityDisplayMode {
+ ctor public TrustedWebActivityDisplayMode.DefaultMode();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static class TrustedWebActivityDisplayMode.ImmersiveMode implements androidx.browser.trusted.TrustedWebActivityDisplayMode {
+ ctor public TrustedWebActivityDisplayMode.ImmersiveMode(boolean, int);
+ method public boolean isSticky();
+ method public int layoutInDisplayCutoutMode();
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_CUTOUT_MODE = "androidx.browser.trusted.displaymode.KEY_CUTOUT_MODE";
+ field public static final String KEY_STICKY = "androidx.browser.trusted.displaymode.KEY_STICKY";
+ }
+
+ public final class TrustedWebActivityIntent {
+ method public android.content.Intent getIntent();
+ method public void launchTrustedWebActivity(android.content.Context);
+ }
+
+ public class TrustedWebActivityIntentBuilder {
+ ctor public TrustedWebActivityIntentBuilder(android.net.Uri);
+ method public androidx.browser.trusted.TrustedWebActivityIntent build(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.customtabs.CustomTabsIntent buildCustomTabsIntent();
+ method public androidx.browser.trusted.TrustedWebActivityDisplayMode getDisplayMode();
+ method public android.net.Uri getUri();
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setColorScheme(int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDisplayMode(androidx.browser.trusted.TrustedWebActivityDisplayMode);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarColor(@ColorInt int);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarDividerColor(@ColorInt int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setScreenOrientation(int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setShareParams(androidx.browser.trusted.sharing.ShareTarget, androidx.browser.trusted.sharing.ShareData);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setSplashScreenParams(android.os.Bundle);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setToolbarColor(@ColorInt int);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_DISPLAY_MODE = "androidx.browser.trusted.extra.DISPLAY_MODE";
+ field public static final String EXTRA_SCREEN_ORIENTATION = "androidx.browser.trusted.extra.SCREEN_ORIENTATION";
+ field public static final String EXTRA_SHARE_DATA = "androidx.browser.trusted.extra.SHARE_DATA";
+ field public static final String EXTRA_SHARE_TARGET = "androidx.browser.trusted.extra.SHARE_TARGET";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
+
+ public abstract class TrustedWebActivityService extends android.app.Service {
+ ctor public TrustedWebActivityService();
+ method @BinderThread public abstract androidx.browser.trusted.TokenStore getTokenStore();
+ method @BinderThread public boolean onAreNotificationsEnabled(String);
+ method @MainThread public final android.os.IBinder? onBind(android.content.Intent?);
+ method @BinderThread public void onCancelNotification(String, int);
+ method @BinderThread public android.os.Bundle? onExtraCommand(String, android.os.Bundle, androidx.browser.trusted.TrustedWebActivityCallbackRemote?);
+ method @BinderThread public android.os.Bundle onGetSmallIconBitmap();
+ method @BinderThread public int onGetSmallIconId();
+ method @BinderThread public boolean onNotifyNotificationWithChannel(String, int, android.app.Notification, String);
+ method @MainThread public final boolean onUnbind(android.content.Intent?);
+ field public static final String ACTION_TRUSTED_WEB_ACTIVITY_SERVICE = "android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE";
+ field public static final String KEY_SMALL_ICON_BITMAP = "android.support.customtabs.trusted.SMALL_ICON_BITMAP";
+ field public static final String KEY_SUCCESS = "androidx.browser.trusted.SUCCESS";
+ field public static final String META_DATA_NAME_SMALL_ICON = "android.support.customtabs.trusted.SMALL_ICON";
+ field public static final int SMALL_ICON_NOT_SET = -1; // 0xffffffff
+ }
+
+ public final class TrustedWebActivityServiceConnection {
+ method public boolean areNotificationsEnabled(String) throws android.os.RemoteException;
+ method public void cancel(String, int) throws android.os.RemoteException;
+ method public android.content.ComponentName getComponentName();
+ method public android.graphics.Bitmap? getSmallIconBitmap() throws android.os.RemoteException;
+ method public int getSmallIconId() throws android.os.RemoteException;
+ method public boolean notify(String, int, android.app.Notification, String) throws android.os.RemoteException;
+ method public android.os.Bundle? sendExtraCommand(String, android.os.Bundle, androidx.browser.trusted.TrustedWebActivityCallback?) throws android.os.RemoteException;
+ }
+
+ public final class TrustedWebActivityServiceConnectionPool {
+ method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.browser.trusted.TrustedWebActivityServiceConnection!> connect(android.net.Uri, java.util.Set<androidx.browser.trusted.Token!>, java.util.concurrent.Executor);
+ method public static androidx.browser.trusted.TrustedWebActivityServiceConnectionPool create(android.content.Context);
+ method @MainThread public boolean serviceExistsForScope(android.net.Uri, java.util.Set<androidx.browser.trusted.Token!>);
+ }
+
+}
+
+package androidx.browser.trusted.sharing {
+
+ public final class ShareData {
+ ctor public ShareData(String?, String?, java.util.List<android.net.Uri!>?);
+ method public static androidx.browser.trusted.sharing.ShareData fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_TEXT = "androidx.browser.trusted.sharing.KEY_TEXT";
+ field public static final String KEY_TITLE = "androidx.browser.trusted.sharing.KEY_TITLE";
+ field public static final String KEY_URIS = "androidx.browser.trusted.sharing.KEY_URIS";
+ field public final String? text;
+ field public final String? title;
+ field public final java.util.List<android.net.Uri!>? uris;
+ }
+
+ public final class ShareTarget {
+ ctor public ShareTarget(String, String?, String?, androidx.browser.trusted.sharing.ShareTarget.Params);
+ method public static androidx.browser.trusted.sharing.ShareTarget? fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String ENCODING_TYPE_MULTIPART = "multipart/form-data";
+ field public static final String ENCODING_TYPE_URL_ENCODED = "application/x-www-form-urlencoded";
+ field public static final String KEY_ACTION = "androidx.browser.trusted.sharing.KEY_ACTION";
+ field public static final String KEY_ENCTYPE = "androidx.browser.trusted.sharing.KEY_ENCTYPE";
+ field public static final String KEY_METHOD = "androidx.browser.trusted.sharing.KEY_METHOD";
+ field public static final String KEY_PARAMS = "androidx.browser.trusted.sharing.KEY_PARAMS";
+ field public static final String METHOD_GET = "GET";
+ field public static final String METHOD_POST = "POST";
+ field public final String action;
+ field public final String? encodingType;
+ field public final String? method;
+ field public final androidx.browser.trusted.sharing.ShareTarget.Params params;
+ }
+
+ public static final class ShareTarget.FileFormField {
+ ctor public ShareTarget.FileFormField(String, java.util.List<java.lang.String!>);
+ field public static final String KEY_ACCEPTED_TYPES = "androidx.browser.trusted.sharing.KEY_ACCEPTED_TYPES";
+ field public static final String KEY_NAME = "androidx.browser.trusted.sharing.KEY_FILE_NAME";
+ field public final java.util.List<java.lang.String!> acceptedTypes;
+ field public final String name;
+ }
+
+ public static class ShareTarget.Params {
+ ctor public ShareTarget.Params(String?, String?, java.util.List<androidx.browser.trusted.sharing.ShareTarget.FileFormField!>?);
+ field public static final String KEY_FILES = "androidx.browser.trusted.sharing.KEY_FILES";
+ field public static final String KEY_TEXT = "androidx.browser.trusted.sharing.KEY_TEXT";
+ field public static final String KEY_TITLE = "androidx.browser.trusted.sharing.KEY_TITLE";
+ field public final java.util.List<androidx.browser.trusted.sharing.ShareTarget.FileFormField!>? files;
+ field public final String? text;
+ field public final String? title;
+ }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String KEY_BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String KEY_FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String KEY_IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String KEY_SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String KEY_VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/browser/browser/api/res-1.4.0-beta02.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to browser/browser/api/res-1.4.0-beta02.txt
diff --git a/browser/browser/api/restricted_1.4.0-beta02.txt b/browser/browser/api/restricted_1.4.0-beta02.txt
new file mode 100644
index 0000000..6f8400b
--- /dev/null
+++ b/browser/browser/api/restricted_1.4.0-beta02.txt
@@ -0,0 +1,461 @@
+// Signature format: 4.0
+package androidx.browser.browseractions {
+
+ @Deprecated public class BrowserActionItem {
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent, @DrawableRes int);
+ ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public BrowserActionItem(String, android.app.PendingIntent, android.net.Uri);
+ ctor @Deprecated public BrowserActionItem(String, android.app.PendingIntent);
+ method @Deprecated public android.app.PendingIntent getAction();
+ method @Deprecated public int getIconId();
+ method @Deprecated public String getTitle();
+ }
+
+ @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class BrowserActionsFallbackMenuView extends android.widget.LinearLayout {
+ ctor @Deprecated public BrowserActionsFallbackMenuView(android.content.Context, android.util.AttributeSet);
+ }
+
+ @Deprecated public class BrowserActionsIntent {
+ method @Deprecated public static String? getCreatorPackageName(android.content.Intent);
+ method @Deprecated public android.content.Intent getIntent();
+ method @Deprecated public static String? getUntrustedCreatorPackageName(android.content.Intent);
+ method @Deprecated public static void launchIntent(android.content.Context, android.content.Intent);
+ method @Deprecated public static void openBrowserAction(android.content.Context, android.net.Uri);
+ method @Deprecated public static void openBrowserAction(android.content.Context, android.net.Uri, int, java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>, android.app.PendingIntent);
+ method @Deprecated public static java.util.List<androidx.browser.browseractions.BrowserActionItem!> parseBrowserActionItems(java.util.ArrayList<android.os.Bundle!>);
+ field @Deprecated public static final String ACTION_BROWSER_ACTIONS_OPEN = "androidx.browser.browseractions.browser_action_open";
+ field @Deprecated public static final String EXTRA_APP_ID = "androidx.browser.browseractions.APP_ID";
+ field @Deprecated public static final String EXTRA_MENU_ITEMS = "androidx.browser.browseractions.extra.MENU_ITEMS";
+ field @Deprecated public static final String EXTRA_SELECTED_ACTION_PENDING_INTENT = "androidx.browser.browseractions.extra.SELECTED_ACTION_PENDING_INTENT";
+ field @Deprecated public static final String EXTRA_TYPE = "androidx.browser.browseractions.extra.TYPE";
+ field @Deprecated public static final int ITEM_COPY = 3; // 0x3
+ field @Deprecated public static final int ITEM_DOWNLOAD = 2; // 0x2
+ field @Deprecated public static final int ITEM_INVALID_ITEM = -1; // 0xffffffff
+ field @Deprecated public static final int ITEM_OPEN_IN_INCOGNITO = 1; // 0x1
+ field @Deprecated public static final int ITEM_OPEN_IN_NEW_TAB = 0; // 0x0
+ field @Deprecated public static final int ITEM_SHARE = 4; // 0x4
+ field @Deprecated public static final String KEY_ACTION = "androidx.browser.browseractions.ACTION";
+ field @Deprecated public static final String KEY_ICON_ID = "androidx.browser.browseractions.ICON_ID";
+ field @Deprecated public static final String KEY_TITLE = "androidx.browser.browseractions.TITLE";
+ field @Deprecated public static final int MAX_CUSTOM_ITEMS = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_AUDIO = 3; // 0x3
+ field @Deprecated public static final int URL_TYPE_FILE = 4; // 0x4
+ field @Deprecated public static final int URL_TYPE_IMAGE = 1; // 0x1
+ field @Deprecated public static final int URL_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int URL_TYPE_PLUGIN = 5; // 0x5
+ field @Deprecated public static final int URL_TYPE_VIDEO = 2; // 0x2
+ }
+
+ @Deprecated @IntDef({androidx.browser.browseractions.BrowserActionsIntent.ITEM_INVALID_ITEM, androidx.browser.browseractions.BrowserActionsIntent.ITEM_OPEN_IN_NEW_TAB, androidx.browser.browseractions.BrowserActionsIntent.ITEM_OPEN_IN_INCOGNITO, androidx.browser.browseractions.BrowserActionsIntent.ITEM_DOWNLOAD, androidx.browser.browseractions.BrowserActionsIntent.ITEM_COPY, androidx.browser.browseractions.BrowserActionsIntent.ITEM_SHARE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface BrowserActionsIntent.BrowserActionsItemId {
+ }
+
+ @Deprecated @IntDef({androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_NONE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_IMAGE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_VIDEO, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_AUDIO, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_FILE, androidx.browser.browseractions.BrowserActionsIntent.URL_TYPE_PLUGIN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface BrowserActionsIntent.BrowserActionsUrlType {
+ }
+
+ @Deprecated public static final class BrowserActionsIntent.Builder {
+ ctor @Deprecated public BrowserActionsIntent.Builder(android.content.Context, android.net.Uri);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent build();
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(java.util.ArrayList<androidx.browser.browseractions.BrowserActionItem!>);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setCustomItems(androidx.browser.browseractions.BrowserActionItem!...);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setOnItemSelectedAction(android.app.PendingIntent);
+ method @Deprecated public androidx.browser.browseractions.BrowserActionsIntent.Builder setUrlType(@androidx.browser.browseractions.BrowserActionsIntent.BrowserActionsUrlType int);
+ }
+
+}
+
+package androidx.browser.customtabs {
+
+ public final class CustomTabColorSchemeParams {
+ field @ColorInt public final Integer? navigationBarColor;
+ field @ColorInt public final Integer? navigationBarDividerColor;
+ field @ColorInt public final Integer? secondaryToolbarColor;
+ field @ColorInt public final Integer? toolbarColor;
+ }
+
+ public static final class CustomTabColorSchemeParams.Builder {
+ ctor public CustomTabColorSchemeParams.Builder();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams build();
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setNavigationBarDividerColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabColorSchemeParams.Builder setToolbarColor(@ColorInt int);
+ }
+
+ public class CustomTabsCallback {
+ ctor public CustomTabsCallback();
+ method public void extraCallback(String, android.os.Bundle?);
+ method public android.os.Bundle? extraCallbackWithResult(String, android.os.Bundle?);
+ method public void onMessageChannelReady(android.os.Bundle?);
+ method public void onNavigationEvent(int, android.os.Bundle?);
+ method public void onPostMessage(String, android.os.Bundle?);
+ method public void onRelationshipValidationResult(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, boolean, android.os.Bundle?);
+ field public static final int NAVIGATION_ABORTED = 4; // 0x4
+ field public static final int NAVIGATION_FAILED = 3; // 0x3
+ field public static final int NAVIGATION_FINISHED = 2; // 0x2
+ field public static final int NAVIGATION_STARTED = 1; // 0x1
+ field public static final int TAB_HIDDEN = 6; // 0x6
+ field public static final int TAB_SHOWN = 5; // 0x5
+ }
+
+ public class CustomTabsClient {
+ method public static boolean bindCustomTabsService(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean bindCustomTabsServicePreservePriority(android.content.Context, String?, androidx.browser.customtabs.CustomTabsServiceConnection);
+ method public static boolean connectAndInitialize(android.content.Context, String);
+ method public android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?);
+ method public static String? getPackageName(android.content.Context, java.util.List<java.lang.String!>?, boolean);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?);
+ method public androidx.browser.customtabs.CustomTabsSession? newSession(androidx.browser.customtabs.CustomTabsCallback?, int);
+ method public boolean warmup(long);
+ }
+
+ public final class CustomTabsIntent {
+ method public static androidx.browser.customtabs.CustomTabColorSchemeParams getColorSchemeParams(android.content.Intent, int);
+ method public static int getMaxToolbarItems();
+ method public void launchUrl(android.content.Context, android.net.Uri);
+ method public static android.content.Intent setAlwaysUseBrowserUI(android.content.Intent?);
+ method public static boolean shouldAlwaysUseBrowserUI(android.content.Intent);
+ field public static final int COLOR_SCHEME_DARK = 2; // 0x2
+ field public static final int COLOR_SCHEME_LIGHT = 1; // 0x1
+ field public static final int COLOR_SCHEME_SYSTEM = 0; // 0x0
+ field public static final String EXTRA_ACTION_BUTTON_BUNDLE = "android.support.customtabs.extra.ACTION_BUTTON_BUNDLE";
+ field public static final String EXTRA_CLOSE_BUTTON_ICON = "android.support.customtabs.extra.CLOSE_BUTTON_ICON";
+ field public static final String EXTRA_COLOR_SCHEME = "androidx.browser.customtabs.extra.COLOR_SCHEME";
+ field public static final String EXTRA_COLOR_SCHEME_PARAMS = "androidx.browser.customtabs.extra.COLOR_SCHEME_PARAMS";
+ field @Deprecated public static final String EXTRA_DEFAULT_SHARE_MENU_ITEM = "android.support.customtabs.extra.SHARE_MENU_ITEM";
+ field public static final String EXTRA_ENABLE_INSTANT_APPS = "android.support.customtabs.extra.EXTRA_ENABLE_INSTANT_APPS";
+ field public static final String EXTRA_ENABLE_URLBAR_HIDING = "android.support.customtabs.extra.ENABLE_URLBAR_HIDING";
+ field public static final String EXTRA_EXIT_ANIMATION_BUNDLE = "android.support.customtabs.extra.EXIT_ANIMATION_BUNDLE";
+ field public static final String EXTRA_MENU_ITEMS = "android.support.customtabs.extra.MENU_ITEMS";
+ field public static final String EXTRA_NAVIGATION_BAR_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_COLOR";
+ field public static final String EXTRA_NAVIGATION_BAR_DIVIDER_COLOR = "androidx.browser.customtabs.extra.NAVIGATION_BAR_DIVIDER_COLOR";
+ field public static final String EXTRA_REMOTEVIEWS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS";
+ field public static final String EXTRA_REMOTEVIEWS_CLICKED_ID = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_CLICKED_ID";
+ field public static final String EXTRA_REMOTEVIEWS_PENDINGINTENT = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_PENDINGINTENT";
+ field public static final String EXTRA_REMOTEVIEWS_VIEW_IDS = "android.support.customtabs.extra.EXTRA_REMOTEVIEWS_VIEW_IDS";
+ field public static final String EXTRA_SECONDARY_TOOLBAR_COLOR = "android.support.customtabs.extra.SECONDARY_TOOLBAR_COLOR";
+ field public static final String EXTRA_SESSION = "android.support.customtabs.extra.SESSION";
+ field public static final String EXTRA_SHARE_STATE = "androidx.browser.customtabs.extra.SHARE_STATE";
+ field public static final String EXTRA_TINT_ACTION_BUTTON = "android.support.customtabs.extra.TINT_ACTION_BUTTON";
+ field public static final String EXTRA_TITLE_VISIBILITY_STATE = "android.support.customtabs.extra.TITLE_VISIBILITY";
+ field public static final String EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR";
+ field public static final String EXTRA_TOOLBAR_ITEMS = "android.support.customtabs.extra.TOOLBAR_ITEMS";
+ field public static final String KEY_DESCRIPTION = "android.support.customtabs.customaction.DESCRIPTION";
+ field public static final String KEY_ICON = "android.support.customtabs.customaction.ICON";
+ field public static final String KEY_ID = "android.support.customtabs.customaction.ID";
+ field public static final String KEY_MENU_ITEM_TITLE = "android.support.customtabs.customaction.MENU_ITEM_TITLE";
+ field public static final String KEY_PENDING_INTENT = "android.support.customtabs.customaction.PENDING_INTENT";
+ field public static final int NO_TITLE = 0; // 0x0
+ field public static final int SHARE_STATE_DEFAULT = 0; // 0x0
+ field public static final int SHARE_STATE_OFF = 2; // 0x2
+ field public static final int SHARE_STATE_ON = 1; // 0x1
+ field public static final int SHOW_PAGE_TITLE = 1; // 0x1
+ field public static final int TOOLBAR_ACTION_BUTTON_ID = 0; // 0x0
+ field public final android.content.Intent intent;
+ field public final android.os.Bundle? startAnimationBundle;
+ }
+
+ public static final class CustomTabsIntent.Builder {
+ ctor public CustomTabsIntent.Builder();
+ ctor public CustomTabsIntent.Builder(androidx.browser.customtabs.CustomTabsSession?);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addDefaultShareMenuItem();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder addMenuItem(String, android.app.PendingIntent);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder addToolbarItem(int, android.graphics.Bitmap, String, android.app.PendingIntent) throws java.lang.IllegalStateException;
+ method public androidx.browser.customtabs.CustomTabsIntent build();
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder enableUrlBarHiding();
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent, boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setActionButton(android.graphics.Bitmap, String, android.app.PendingIntent);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setCloseButtonIcon(android.graphics.Bitmap);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorScheme(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setDefaultShareMenuItemEnabled(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setExitAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setInstantAppsEnabled(boolean);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarColor(@ColorInt int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setNavigationBarDividerColor(@ColorInt int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSecondaryToolbarViews(android.widget.RemoteViews, int[]?, android.app.PendingIntent?);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setSession(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShareState(int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setShowTitle(boolean);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setStartAnimations(android.content.Context, @AnimRes int, @AnimRes int);
+ method @Deprecated public androidx.browser.customtabs.CustomTabsIntent.Builder setToolbarColor(@ColorInt int);
+ method public androidx.browser.customtabs.CustomTabsIntent.Builder setUrlBarHidingEnabled(boolean);
+ }
+
+ public abstract class CustomTabsService extends android.app.Service {
+ ctor public CustomTabsService();
+ method protected boolean cleanUpSession(androidx.browser.customtabs.CustomTabsSessionToken);
+ method protected abstract android.os.Bundle? extraCommand(String, android.os.Bundle?);
+ method protected abstract boolean mayLaunchUrl(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri?, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
+ method protected abstract boolean newSession(androidx.browser.customtabs.CustomTabsSessionToken);
+ method public android.os.IBinder onBind(android.content.Intent?);
+ method @androidx.browser.customtabs.CustomTabsService.Result protected abstract int postMessage(androidx.browser.customtabs.CustomTabsSessionToken, String, android.os.Bundle?);
+ method protected abstract boolean receiveFile(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri, int, android.os.Bundle?);
+ method protected abstract boolean requestPostMessageChannel(androidx.browser.customtabs.CustomTabsSessionToken, android.net.Uri);
+ method protected abstract boolean updateVisuals(androidx.browser.customtabs.CustomTabsSessionToken, android.os.Bundle?);
+ method protected abstract boolean validateRelationship(androidx.browser.customtabs.CustomTabsSessionToken, @androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ method protected abstract boolean warmup(long);
+ field public static final String ACTION_CUSTOM_TABS_CONNECTION = "android.support.customtabs.action.CustomTabsService";
+ field public static final String CATEGORY_COLOR_SCHEME_CUSTOMIZATION = "androidx.browser.customtabs.category.ColorSchemeCustomization";
+ field public static final String CATEGORY_NAVBAR_COLOR_CUSTOMIZATION = "androidx.browser.customtabs.category.NavBarColorCustomization";
+ field public static final String CATEGORY_TRUSTED_WEB_ACTIVITY_IMMERSIVE_MODE = "androidx.browser.trusted.category.ImmersiveMode";
+ field public static final String CATEGORY_WEB_SHARE_TARGET_V2 = "androidx.browser.trusted.category.WebShareTargetV2";
+ field public static final int FILE_PURPOSE_TRUSTED_WEB_ACTIVITY_SPLASH_IMAGE = 1; // 0x1
+ field public static final String KEY_SUCCESS = "androidx.browser.customtabs.SUCCESS";
+ field public static final String KEY_URL = "android.support.customtabs.otherurls.URL";
+ field public static final int RELATION_HANDLE_ALL_URLS = 2; // 0x2
+ field public static final int RELATION_USE_AS_ORIGIN = 1; // 0x1
+ field public static final int RESULT_FAILURE_DISALLOWED = -1; // 0xffffffff
+ field public static final int RESULT_FAILURE_MESSAGING_ERROR = -3; // 0xfffffffd
+ field public static final int RESULT_FAILURE_REMOTE_ERROR = -2; // 0xfffffffe
+ field public static final int RESULT_SUCCESS = 0; // 0x0
+ field public static final String TRUSTED_WEB_ACTIVITY_CATEGORY = "androidx.browser.trusted.category.TrustedWebActivities";
+ }
+
+ @IntDef({androidx.browser.customtabs.CustomTabsService.RELATION_USE_AS_ORIGIN, androidx.browser.customtabs.CustomTabsService.RELATION_HANDLE_ALL_URLS}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CustomTabsService.Relation {
+ }
+
+ @IntDef({androidx.browser.customtabs.CustomTabsService.RESULT_SUCCESS, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_DISALLOWED, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_REMOTE_ERROR, androidx.browser.customtabs.CustomTabsService.RESULT_FAILURE_MESSAGING_ERROR}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface CustomTabsService.Result {
+ }
+
+ public abstract class CustomTabsServiceConnection implements android.content.ServiceConnection {
+ ctor public CustomTabsServiceConnection();
+ method public abstract void onCustomTabsServiceConnected(android.content.ComponentName, androidx.browser.customtabs.CustomTabsClient);
+ method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ }
+
+ public final class CustomTabsSession {
+ method @VisibleForTesting public static androidx.browser.customtabs.CustomTabsSession createMockSessionForTesting(android.content.ComponentName);
+ method public boolean mayLaunchUrl(android.net.Uri?, android.os.Bundle?, java.util.List<android.os.Bundle!>?);
+ method @androidx.browser.customtabs.CustomTabsService.Result public int postMessage(String, android.os.Bundle?);
+ method public boolean receiveFile(android.net.Uri, int, android.os.Bundle?);
+ method public boolean requestPostMessageChannel(android.net.Uri);
+ method public boolean setActionButton(android.graphics.Bitmap, String);
+ method public boolean setSecondaryToolbarViews(android.widget.RemoteViews?, int[]?, android.app.PendingIntent?);
+ method @Deprecated public boolean setToolbarItem(int, android.graphics.Bitmap, String);
+ method public boolean validateRelationship(@androidx.browser.customtabs.CustomTabsService.Relation int, android.net.Uri, android.os.Bundle?);
+ }
+
+ public class CustomTabsSessionToken {
+ method public static androidx.browser.customtabs.CustomTabsSessionToken createMockSessionTokenForTesting();
+ method public androidx.browser.customtabs.CustomTabsCallback? getCallback();
+ method public static androidx.browser.customtabs.CustomTabsSessionToken? getSessionTokenFromIntent(android.content.Intent);
+ method public boolean isAssociatedWith(androidx.browser.customtabs.CustomTabsSession);
+ }
+
+ public class PostMessageService extends android.app.Service {
+ ctor public PostMessageService();
+ method public android.os.IBinder onBind(android.content.Intent?);
+ }
+
+ public abstract class PostMessageServiceConnection implements android.content.ServiceConnection {
+ ctor public PostMessageServiceConnection(androidx.browser.customtabs.CustomTabsSessionToken);
+ method public boolean bindSessionToPostMessageService(android.content.Context, String);
+ method public final boolean notifyMessageChannelReady(android.os.Bundle?);
+ method public void onPostMessageServiceConnected();
+ method public void onPostMessageServiceDisconnected();
+ method public final void onServiceConnected(android.content.ComponentName, android.os.IBinder);
+ method public final void onServiceDisconnected(android.content.ComponentName);
+ method public final boolean postMessage(String, android.os.Bundle?);
+ method public void unbindFromContext(android.content.Context);
+ }
+
+ public class TrustedWebUtils {
+ method public static boolean areSplashScreensSupported(android.content.Context, String, String);
+ method @Deprecated public static void launchAsTrustedWebActivity(android.content.Context, androidx.browser.customtabs.CustomTabsIntent, android.net.Uri);
+ method @WorkerThread public static boolean transferSplashImage(android.content.Context, java.io.File, String, String, androidx.browser.customtabs.CustomTabsSession);
+ field public static final String EXTRA_LAUNCH_AS_TRUSTED_WEB_ACTIVITY = "android.support.customtabs.extra.LAUNCH_AS_TRUSTED_WEB_ACTIVITY";
+ }
+
+}
+
+package androidx.browser.trusted {
+
+ public final class ScreenOrientation {
+ field public static final int ANY = 5; // 0x5
+ field public static final int DEFAULT = 0; // 0x0
+ field public static final int LANDSCAPE = 6; // 0x6
+ field public static final int LANDSCAPE_PRIMARY = 3; // 0x3
+ field public static final int LANDSCAPE_SECONDARY = 4; // 0x4
+ field public static final int NATURAL = 8; // 0x8
+ field public static final int PORTRAIT = 7; // 0x7
+ field public static final int PORTRAIT_PRIMARY = 1; // 0x1
+ field public static final int PORTRAIT_SECONDARY = 2; // 0x2
+ }
+
+ public final class Token {
+ method public static androidx.browser.trusted.Token? create(String, android.content.pm.PackageManager);
+ method public static androidx.browser.trusted.Token deserialize(byte[]);
+ method public boolean matches(String, android.content.pm.PackageManager);
+ method public byte[] serialize();
+ }
+
+ public interface TokenStore {
+ method @BinderThread public androidx.browser.trusted.Token? load();
+ method @WorkerThread public void store(androidx.browser.trusted.Token?);
+ }
+
+ public abstract class TrustedWebActivityCallback {
+ ctor public TrustedWebActivityCallback();
+ method public abstract void onExtraCallback(String, android.os.Bundle?);
+ }
+
+ public class TrustedWebActivityCallbackRemote {
+ method public void runExtraCallback(String, android.os.Bundle) throws android.os.RemoteException;
+ }
+
+ public interface TrustedWebActivityDisplayMode {
+ method public static androidx.browser.trusted.TrustedWebActivityDisplayMode fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_ID = "androidx.browser.trusted.displaymode.KEY_ID";
+ }
+
+ public static class TrustedWebActivityDisplayMode.DefaultMode implements androidx.browser.trusted.TrustedWebActivityDisplayMode {
+ ctor public TrustedWebActivityDisplayMode.DefaultMode();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static class TrustedWebActivityDisplayMode.ImmersiveMode implements androidx.browser.trusted.TrustedWebActivityDisplayMode {
+ ctor public TrustedWebActivityDisplayMode.ImmersiveMode(boolean, int);
+ method public boolean isSticky();
+ method public int layoutInDisplayCutoutMode();
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_CUTOUT_MODE = "androidx.browser.trusted.displaymode.KEY_CUTOUT_MODE";
+ field public static final String KEY_STICKY = "androidx.browser.trusted.displaymode.KEY_STICKY";
+ }
+
+ public final class TrustedWebActivityIntent {
+ method public android.content.Intent getIntent();
+ method public void launchTrustedWebActivity(android.content.Context);
+ }
+
+ public class TrustedWebActivityIntentBuilder {
+ ctor public TrustedWebActivityIntentBuilder(android.net.Uri);
+ method public androidx.browser.trusted.TrustedWebActivityIntent build(androidx.browser.customtabs.CustomTabsSession);
+ method public androidx.browser.customtabs.CustomTabsIntent buildCustomTabsIntent();
+ method public androidx.browser.trusted.TrustedWebActivityDisplayMode getDisplayMode();
+ method public android.net.Uri getUri();
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setAdditionalTrustedOrigins(java.util.List<java.lang.String!>);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setColorScheme(int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setColorSchemeParams(int, androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDefaultColorSchemeParams(androidx.browser.customtabs.CustomTabColorSchemeParams);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setDisplayMode(androidx.browser.trusted.TrustedWebActivityDisplayMode);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarColor(@ColorInt int);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setNavigationBarDividerColor(@ColorInt int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setScreenOrientation(int);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setShareParams(androidx.browser.trusted.sharing.ShareTarget, androidx.browser.trusted.sharing.ShareData);
+ method public androidx.browser.trusted.TrustedWebActivityIntentBuilder setSplashScreenParams(android.os.Bundle);
+ method @Deprecated public androidx.browser.trusted.TrustedWebActivityIntentBuilder setToolbarColor(@ColorInt int);
+ field public static final String EXTRA_ADDITIONAL_TRUSTED_ORIGINS = "android.support.customtabs.extra.ADDITIONAL_TRUSTED_ORIGINS";
+ field public static final String EXTRA_DISPLAY_MODE = "androidx.browser.trusted.extra.DISPLAY_MODE";
+ field public static final String EXTRA_SCREEN_ORIENTATION = "androidx.browser.trusted.extra.SCREEN_ORIENTATION";
+ field public static final String EXTRA_SHARE_DATA = "androidx.browser.trusted.extra.SHARE_DATA";
+ field public static final String EXTRA_SHARE_TARGET = "androidx.browser.trusted.extra.SHARE_TARGET";
+ field public static final String EXTRA_SPLASH_SCREEN_PARAMS = "androidx.browser.trusted.EXTRA_SPLASH_SCREEN_PARAMS";
+ }
+
+ public abstract class TrustedWebActivityService extends android.app.Service {
+ ctor public TrustedWebActivityService();
+ method @BinderThread public abstract androidx.browser.trusted.TokenStore getTokenStore();
+ method @BinderThread public boolean onAreNotificationsEnabled(String);
+ method @MainThread public final android.os.IBinder? onBind(android.content.Intent?);
+ method @BinderThread public void onCancelNotification(String, int);
+ method @BinderThread public android.os.Bundle? onExtraCommand(String, android.os.Bundle, androidx.browser.trusted.TrustedWebActivityCallbackRemote?);
+ method @BinderThread public android.os.Bundle onGetSmallIconBitmap();
+ method @BinderThread public int onGetSmallIconId();
+ method @BinderThread public boolean onNotifyNotificationWithChannel(String, int, android.app.Notification, String);
+ method @MainThread public final boolean onUnbind(android.content.Intent?);
+ field public static final String ACTION_TRUSTED_WEB_ACTIVITY_SERVICE = "android.support.customtabs.trusted.TRUSTED_WEB_ACTIVITY_SERVICE";
+ field public static final String KEY_SMALL_ICON_BITMAP = "android.support.customtabs.trusted.SMALL_ICON_BITMAP";
+ field public static final String KEY_SUCCESS = "androidx.browser.trusted.SUCCESS";
+ field public static final String META_DATA_NAME_SMALL_ICON = "android.support.customtabs.trusted.SMALL_ICON";
+ field public static final int SMALL_ICON_NOT_SET = -1; // 0xffffffff
+ }
+
+ public final class TrustedWebActivityServiceConnection {
+ method public boolean areNotificationsEnabled(String) throws android.os.RemoteException;
+ method public void cancel(String, int) throws android.os.RemoteException;
+ method public android.content.ComponentName getComponentName();
+ method public android.graphics.Bitmap? getSmallIconBitmap() throws android.os.RemoteException;
+ method public int getSmallIconId() throws android.os.RemoteException;
+ method public boolean notify(String, int, android.app.Notification, String) throws android.os.RemoteException;
+ method public android.os.Bundle? sendExtraCommand(String, android.os.Bundle, androidx.browser.trusted.TrustedWebActivityCallback?) throws android.os.RemoteException;
+ }
+
+ public final class TrustedWebActivityServiceConnectionPool {
+ method @MainThread public com.google.common.util.concurrent.ListenableFuture<androidx.browser.trusted.TrustedWebActivityServiceConnection!> connect(android.net.Uri, java.util.Set<androidx.browser.trusted.Token!>, java.util.concurrent.Executor);
+ method public static androidx.browser.trusted.TrustedWebActivityServiceConnectionPool create(android.content.Context);
+ method @MainThread public boolean serviceExistsForScope(android.net.Uri, java.util.Set<androidx.browser.trusted.Token!>);
+ }
+
+}
+
+package androidx.browser.trusted.sharing {
+
+ public final class ShareData {
+ ctor public ShareData(String?, String?, java.util.List<android.net.Uri!>?);
+ method public static androidx.browser.trusted.sharing.ShareData fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String KEY_TEXT = "androidx.browser.trusted.sharing.KEY_TEXT";
+ field public static final String KEY_TITLE = "androidx.browser.trusted.sharing.KEY_TITLE";
+ field public static final String KEY_URIS = "androidx.browser.trusted.sharing.KEY_URIS";
+ field public final String? text;
+ field public final String? title;
+ field public final java.util.List<android.net.Uri!>? uris;
+ }
+
+ public final class ShareTarget {
+ ctor public ShareTarget(String, String?, String?, androidx.browser.trusted.sharing.ShareTarget.Params);
+ method public static androidx.browser.trusted.sharing.ShareTarget? fromBundle(android.os.Bundle);
+ method public android.os.Bundle toBundle();
+ field public static final String ENCODING_TYPE_MULTIPART = "multipart/form-data";
+ field public static final String ENCODING_TYPE_URL_ENCODED = "application/x-www-form-urlencoded";
+ field public static final String KEY_ACTION = "androidx.browser.trusted.sharing.KEY_ACTION";
+ field public static final String KEY_ENCTYPE = "androidx.browser.trusted.sharing.KEY_ENCTYPE";
+ field public static final String KEY_METHOD = "androidx.browser.trusted.sharing.KEY_METHOD";
+ field public static final String KEY_PARAMS = "androidx.browser.trusted.sharing.KEY_PARAMS";
+ field public static final String METHOD_GET = "GET";
+ field public static final String METHOD_POST = "POST";
+ field public final String action;
+ field public final String? encodingType;
+ field public final String? method;
+ field public final androidx.browser.trusted.sharing.ShareTarget.Params params;
+ }
+
+ public static final class ShareTarget.FileFormField {
+ ctor public ShareTarget.FileFormField(String, java.util.List<java.lang.String!>);
+ field public static final String KEY_ACCEPTED_TYPES = "androidx.browser.trusted.sharing.KEY_ACCEPTED_TYPES";
+ field public static final String KEY_NAME = "androidx.browser.trusted.sharing.KEY_FILE_NAME";
+ field public final java.util.List<java.lang.String!> acceptedTypes;
+ field public final String name;
+ }
+
+ public static class ShareTarget.Params {
+ ctor public ShareTarget.Params(String?, String?, java.util.List<androidx.browser.trusted.sharing.ShareTarget.FileFormField!>?);
+ field public static final String KEY_FILES = "androidx.browser.trusted.sharing.KEY_FILES";
+ field public static final String KEY_TEXT = "androidx.browser.trusted.sharing.KEY_TEXT";
+ field public static final String KEY_TITLE = "androidx.browser.trusted.sharing.KEY_TITLE";
+ field public final java.util.List<androidx.browser.trusted.sharing.ShareTarget.FileFormField!>? files;
+ field public final String? text;
+ field public final String? title;
+ }
+
+}
+
+package androidx.browser.trusted.splashscreens {
+
+ public final class SplashScreenParamKey {
+ field public static final String KEY_BACKGROUND_COLOR = "androidx.browser.trusted.trusted.KEY_SPLASH_SCREEN_BACKGROUND_COLOR";
+ field public static final String KEY_FADE_OUT_DURATION_MS = "androidx.browser.trusted.KEY_SPLASH_SCREEN_FADE_OUT_DURATION";
+ field public static final String KEY_IMAGE_TRANSFORMATION_MATRIX = "androidx.browser.trusted.KEY_SPLASH_SCREEN_TRANSFORMATION_MATRIX";
+ field public static final String KEY_SCALE_TYPE = "androidx.browser.trusted.KEY_SPLASH_SCREEN_SCALE_TYPE";
+ field public static final String KEY_VERSION = "androidx.browser.trusted.KEY_SPLASH_SCREEN_VERSION";
+ }
+
+ public final class SplashScreenVersion {
+ field public static final String V1 = "androidx.browser.trusted.category.TrustedWebActivitySplashScreensV1";
+ }
+
+}
+
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
index 996dbab..a50fb59 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXComposeImplPlugin.kt
@@ -49,7 +49,10 @@
"plugin:androidx.compose.compiler.plugins.kotlin:sourceInformation=true"
const val composeMetricsOption =
"plugin:androidx.compose.compiler.plugins.kotlin:metricsDestination"
+const val composeReportsOption =
+ "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination"
const val enableMetricsArg = "androidx.enableComposeCompilerMetrics"
+const val enableReportsArg = "androidx.enableComposeCompilerReports"
/**
* Plugin to apply common configuration for Compose projects.
@@ -312,38 +315,53 @@
val isTipOfTreeComposeCompilerProvider = project.provider({
(!conf.isEmpty) && (conf.dependencies.first() !is ExternalModuleDependency)
})
+ val enableMetricsProvider = project.providers.gradleProperty(enableMetricsArg)
+ val enableReportsProvider = project.providers.gradleProperty(enableReportsArg)
+ val libraryMetricsDirectory = project.rootProject.getLibraryMetricsDirectory()
+ val libraryReportsDirectory = project.rootProject.getLibraryReportsDirectory()
project.tasks.withType(KotlinCompile::class.java).configureEach { compile ->
// TODO(b/157230235): remove when this is enabled by default
compile.kotlinOptions.freeCompilerArgs += "-Xopt-in=kotlin.RequiresOptIn"
compile.inputs.files({ kotlinPlugin })
.withPropertyName("composeCompilerExtension")
.withNormalizer(ClasspathNormalizer::class.java)
- compile.doFirst {
+ compile.onlyIf {
if (!kotlinPlugin.isEmpty) {
compile.kotlinOptions.freeCompilerArgs +=
"-Xplugin=${kotlinPlugin.first()}"
- val enableMetrics = project
- .findProperty(enableMetricsArg) == "true"
+ val enableMetrics = (enableMetricsProvider.getOrNull() == "true")
+
+ val enableReports = (enableReportsProvider.getOrNull() == "true")
// since metrics reports in compose compiler are a new feature, we only want to
// pass in this parameter for modules that are using the tip of tree compose
// compiler, or else we will run into an exception since the parameter will not
// be recognized.
if (isTipOfTreeComposeCompilerProvider.get() && enableMetrics) {
- val libMetrics = project
- .rootProject
- .getLibraryMetricsDirectory()
- val metricsDest = File(libMetrics, "compose")
- .absolutePath
+ val metricsDest = File(libraryMetricsDirectory, "compose")
compile.kotlinOptions.freeCompilerArgs +=
listOf(
"-P",
- "$composeMetricsOption=$metricsDest"
+ "$composeMetricsOption=${metricsDest.absolutePath}"
+ )
+ }
+
+ // since metrics reports in compose compiler are a new feature, we only want to
+ // pass in this parameter for modules that are using the tip of tree compose
+ // compiler, or else we will run into an exception since the parameter will not
+ // be recognized.
+ if (isTipOfTreeComposeCompilerProvider.get() && enableReports) {
+ val reportsDest = File(libraryReportsDirectory, "compose")
+ compile.kotlinOptions.freeCompilerArgs +=
+ listOf(
+ "-P",
+ "$composeReportsOption=${reportsDest.absolutePath}"
)
}
}
+ true
}
}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
index 97bdbb9..5c5d00f 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXGradleProperties.kt
@@ -59,6 +59,11 @@
const val ENABLE_COMPOSE_COMPILER_METRICS = "androidx.enableComposeCompilerMetrics"
/**
+ * Setting this property enables multiplatform builds of Compose
+ */
+const val ENABLE_COMPOSE_COMPILER_REPORTS = "androidx.enableComposeCompilerReports"
+
+/**
* Returns whether the project should generate documentation.
*/
const val ENABLE_DOCUMENTATION = "androidx.enableDocumentation"
@@ -135,6 +140,7 @@
VALIDATE_PROJECT_STRUCTURE,
COMPOSE_MPP_ENABLED,
ENABLE_COMPOSE_COMPILER_METRICS,
+ ENABLE_COMPOSE_COMPILER_REPORTS,
DISPLAY_TEST_OUTPUT,
ENABLE_DOCUMENTATION,
PROJECT_SUBSET,
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
index 4e47d01..12d1092 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXImplPlugin.kt
@@ -115,6 +115,8 @@
project.configureExternalDependencyLicenseCheck()
project.configureProjectStructureValidation(extension)
project.configureProjectVersionValidation(extension)
+
+ project.configurations.create("samples")
}
/**
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
index 3c8cf70..b20eea1 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/AndroidXRootImplPlugin.kt
@@ -38,6 +38,7 @@
import org.gradle.api.tasks.bundling.ZipEntryCompression
import org.gradle.build.event.BuildEventsListenerRegistry
import org.gradle.kotlin.dsl.KotlinClosure1
+import org.gradle.kotlin.dsl.configure
import org.gradle.kotlin.dsl.extra
import java.io.File
import java.util.Locale
@@ -77,6 +78,11 @@
BUILD_ON_SERVER_TASK,
BuildOnServerTask::class.java
)
+ buildOnServerTask.distributionDirectory = getDistributionDirectory()
+ buildOnServerTask.repositoryDirectory = getRepositoryDirectory()
+ buildOnServerTask.buildId = getBuildId()
+ buildOnServerTask.jetifierProjectPresent =
+ project.findProject(":jetifier:jetifier-standalone") != null
buildOnServerTask.dependsOn(
tasks.register(
AndroidXImplPlugin.CREATE_AGGREGATE_BUILD_INFO_FILES_TASK,
@@ -137,8 +143,8 @@
if (!project.usingMaxDepVersions()) {
project.agpVariants.all { variant ->
// in AndroidX, release and debug variants are essentially the same,
- // so we don't run the lintDebug task on the build server
- if (!variant.name.lowercase(Locale.getDefault()).contains("debug")) {
+ // so we don't run the lintRelease task on the build server
+ if (!variant.name.lowercase(Locale.getDefault()).contains("release")) {
val taskName = "lint${variant.name.replaceFirstChar {
if (it.isLowerCase()) {
it.titlecase(Locale.getDefault())
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt
index 7cc30ae..91ee8fd 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/BuildOnServerTask.kt
@@ -17,7 +17,9 @@
package androidx.build
import org.gradle.api.DefaultTask
+import org.gradle.api.tasks.InputDirectory
import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskAction
import java.io.File
import java.io.FileInputStream
@@ -39,17 +41,26 @@
description = "Builds all of the Androidx libraries and documentation"
}
+ @Internal
+ lateinit var distributionDirectory: File
+
+ @Internal
+ lateinit var buildId: String
+
+ @Internal
+ var jetifierProjectPresent: Boolean = false
+
+ @InputDirectory
+ lateinit var repositoryDirectory: File
+
@InputFiles
fun getRequiredFiles(): List<File> {
- val distributionDirectory = project.getDistributionDirectory()
- val buildId = getBuildId()
-
val filesNames = mutableListOf(
"androidx_aggregate_build_info.txt",
"top-of-tree-m2repository-all-$buildId.zip"
)
- if (project.findProject(":jetifier:jetifier-standalone") != null) {
+ if (jetifierProjectPresent) {
filesNames.add("jetifier-standalone.zip")
filesNames.add("top-of-tree-m2repository-partially-dejetified-$buildId.zip")
}
@@ -59,7 +70,6 @@
@TaskAction
fun checkAllBuildOutputs() {
-
val missingFiles = mutableListOf<String>()
getRequiredFiles().forEach { file ->
if (!file.exists()) {
@@ -76,7 +86,7 @@
}
private fun verifyVersionFilesPresent() {
- project.getRepositoryDirectory().walk().forEach { file ->
+ repositoryDirectory.walk().forEach { file ->
if (file.extension == "aar") {
val inputStream = FileInputStream(file)
val aarFileInputStream = ZipInputStream(inputStream)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
index df46004..3e2afb7 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/CreateLibraryBuildInfoFileTask.kt
@@ -76,25 +76,10 @@
abstract val projectZipPath: Property<String>
/**
- * Returns the local project directory without the full framework/support root directory path
- * <p>
- * Note: `project.projectDir.toString().removePrefix(project.rootDir.toString())` does not work
- * because the project rootDir is not guaranteed to be a substring of the projectDir
+ * the local project directory without the full framework/support root directory path
*/
- private fun getProjectSpecificDirectory(): String {
- return project.projectDir.absolutePath.removePrefix(
- project.getSupportRootFolder().absolutePath
- )
- }
-
- /**
- * Returns whether or not the groupId of the project requires the same version for all
- * artifactIds.
- */
- private fun requiresSameVersion(): Boolean {
- val library = project.extensions.findByType(AndroidXExtension::class.java)
- return library?.mavenGroup?.requireSameVersion ?: false
- }
+ @get:Input
+ abstract val projectSpecificDirectory: Property<String>
private fun writeJsonToFile(info: LibraryBuildInfoFile) {
val resolvedOutputFile: File = outputFile.get()
@@ -103,7 +88,7 @@
if (!outputDir.mkdirs()) {
throw RuntimeException(
"Failed to create " +
- "output directory: ${project.getBuildInfoDirectory()}"
+ "output directory: $outputDir"
)
}
}
@@ -227,6 +212,16 @@
it.groupIdRequiresSameVersion.set(extension.mavenGroup?.requireSameVersion)
it.groupZipPath.set(project.getGroupZipPath())
it.projectZipPath.set(project.getProjectZipPath())
+
+ // Note:
+ // `project.projectDir.toString().removePrefix(project.rootDir.toString())`
+ // does not work because the project rootDir is not guaranteed to be a
+ // substring of the projectDir
+ it.projectSpecificDirectory.set(
+ project.projectDir.absolutePath.removePrefix(
+ project.getSupportRootFolder().absolutePath
+ )
+ )
}
}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/Ktlint.kt b/buildSrc/private/src/main/kotlin/androidx/build/Ktlint.kt
index f4b32f0..ce75a66 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/Ktlint.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/Ktlint.kt
@@ -18,6 +18,8 @@
import org.gradle.api.Project
import org.gradle.api.artifacts.Configuration
+import org.gradle.api.artifacts.VersionCatalogsExtension
+import org.gradle.api.attributes.Attribute
import org.gradle.api.file.FileTree
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.Input
@@ -30,10 +32,16 @@
import org.gradle.api.tasks.options.Option
import java.io.File
+val bundlingAttribute = Attribute.of("org.gradle.dependency.bundling", String::class.java)
+
private fun Project.getKtlintConfiguration(): Configuration {
return configurations.findByName("ktlint") ?: configurations.create("ktlint") {
- val dependency = dependencies.create("com.pinterest:ktlint:0.39.0")
+ val version = project.extensions.getByType(
+ VersionCatalogsExtension::class.java
+ ).find("libs").get().findVersion("ktlint").get().requiredVersion
+ val dependency = dependencies.create("com.pinterest:ktlint:$version")
it.dependencies.add(dependency)
+ it.attributes.attribute(bundlingAttribute, "external")
}
}
@@ -42,6 +50,8 @@
"import-ordering",
// not useful for our projects
"final-newline",
+ // TODO: reenable when https://github.com/pinterest/ktlint/issues/1221 is resolved
+ "indent",
).joinToString(",")
private const val excludeTestDataFiles = "**/test-data/**/*.kt"
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index bf2ea8b..92d339f 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -60,7 +60,7 @@
it.dependsOn(lintTask)
it.enabled = false
}
- tasks.register("lintAnalyzeRelease") {
+ tasks.register("lintAnalyzeDebug") {
it.dependsOn(lintTask)
it.enabled = false
}
@@ -76,16 +76,16 @@
fun Project.configureAndroidProjectForLint(lintOptions: LintOptions, extension: AndroidXExtension) {
project.afterEvaluate {
- // makes sure that the lintRelease task will exist, so we can find it by name
- setUpLintReleaseIfNeeded()
+ // makes sure that the lintDebug task will exist, so we can find it by name
+ setUpLintDebugIfNeeded()
}
tasks.register("lintAnalyze") {
- it.dependsOn("lintRelease")
+ it.dependsOn("lintDebug")
it.enabled = false
}
configureLint(lintOptions, extension)
tasks.named("lint").configure { task ->
- // We already run lintRelease, we don't need to run lint which lints the debug variant
+ // We already run lintDebug, we don't need to run lint which lints the release variant
task.enabled = false
}
afterEvaluate {
@@ -112,13 +112,13 @@
}
}
-private fun Project.setUpLintReleaseIfNeeded() {
+private fun Project.setUpLintDebugIfNeeded() {
val variants = project.agpVariants
val variantNames = variants.map { v -> v.name }
- if (!variantNames.contains("release")) {
- tasks.register("lintRelease") {
+ if (!variantNames.contains("debug")) {
+ tasks.register("lintDebug") {
for (variantName in variantNames) {
- if (variantName.lowercase(Locale.US).contains("release")) {
+ if (variantName.lowercase(Locale.US).contains("debug")) {
it.dependsOn(
tasks.named(
"lint${variantName.replaceFirstChar {
@@ -199,9 +199,6 @@
// Broken in 7.0.0-alpha15 due to b/180408990
disable("RestrictedApi")
- // Broken in 7.0.0-alpha15 due to b/187418637
- disable("EnforceSampledAnnotation")
-
// Broken in 7.0.0-alpha15 due to b/187508590
disable("InvalidPackage")
@@ -238,6 +235,20 @@
// Broken in 7.0.0-alpha15 due to b/187343720
disable("UnusedResources")
+ if (extension.type == LibraryType.SAMPLES) {
+ // TODO: b/190833328 remove if / when AGP will analyze dependencies by default
+ // This is needed because SampledAnnotationDetector uses partial analysis, and
+ // hence requires dependencies to be analyzed.
+ isCheckDependencies = true
+ // TODO: baselines from dependencies aren't used when we run lint with
+ // isCheckDependencies = true. NewApi was recently enabled for tests, and so
+ // there are a large amount of baselined issues that would be reported here
+ // again, and we don't want to add them to the baseline for the sample modules.
+ // Instead just temporarily disable this lint check until the underlying issues
+ // are fixed.
+ disable("NewApi")
+ }
+
// Only run certain checks where API tracking is important.
if (extension.type.checkApi is RunApiTasks.No) {
disable("IllegalExperimentalApiUsage")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
index 7c85f8c..a1aa1b0 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/MavenUploadHelper.kt
@@ -223,6 +223,7 @@
// https://android-review.googlesource.com/c/platform/frameworks/support/+/1144664/8/buildSrc/src/main/kotlin/androidx/build/MavenUploadHelper.kt#177
assignSingleVersionDependenciesInGroupForPom(xml, mavenGroup)
assignAarTypes(xml, androidLibrariesSetProvider)
+ ensureConsistentJvmSuffix(xml)
}
}
@@ -318,6 +319,35 @@
}
}
+/**
+ * Ensures that artifactIds are consistent when using configuration caching.
+ * A workaround for https://github.com/gradle/gradle/issues/18369
+ */
+private fun ensureConsistentJvmSuffix(
+ xml: XmlProvider
+) {
+ val dependencies = xml.asNode().children().find {
+ it is Node && it.name().toString().endsWith("dependencies")
+ } as Node?
+ dependencies?.children()?.forEach { dep ->
+ if (dep !is Node) {
+ return@forEach
+ }
+ val artifactIdNode = dep.children().first {
+ it is Node && it.name().toString().endsWith("artifactId")
+ } as Node
+ val artifactId = artifactIdNode.children()[0].toString()
+ // kotlinx-coroutines-core is only a .pom and only depends on kotlinx-coroutines-core-jvm,
+ // so the two artifacts should be approximately equivalent. However,
+ // when loading from configuration cache, Gradle often returns a different resolution.
+ // We replace it here to ensure consistency and predictability, and
+ // to avoid having to rerun any zip tasks that include it
+ if (artifactId == "kotlinx-coroutines-core-jvm") {
+ artifactIdNode.setValue("kotlinx-coroutines-core")
+ }
+ }
+}
+
private fun Project.appliesJavaGradlePluginPlugin() = pluginManager.hasPlugin("java-gradle-plugin")
private const val ANDROID_GIT_URL =
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/Release.kt b/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
index 3c1ed22..b460b41 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/Release.kt
@@ -18,14 +18,14 @@
import com.android.build.gradle.LibraryExtension
import org.gradle.api.Action
import org.gradle.api.Project
+import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.tasks.Input
-import org.gradle.api.tasks.Nested
+import org.gradle.api.tasks.Internal
import org.gradle.api.tasks.TaskProvider
import org.gradle.api.tasks.bundling.Zip
import org.gradle.plugin.devel.GradlePluginDevelopmentExtension
import java.io.File
import java.util.Locale
-import java.util.TreeSet
/**
* Simple description for an artifact that is released from this project.
@@ -42,27 +42,53 @@
}
/**
- * Zip task that zips all artifacts from given [candidates].
+ * Zip task that zips all artifacts from given candidates.
*/
open class GMavenZipTask : Zip() {
+
+ init {
+ // multiple artifacts in the same group might have the same maven-metadata.xml
+ duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+ }
+
/**
* Set to true to include maven-metadata.xml
*/
@get:Input
var includeMetadata: Boolean = false
- /**
- * List of artifacts that might be included in the generated zip.
- */
- @get:Nested
- val candidates = TreeSet<Artifact>(compareBy { it.toString() })
/**
+ * Repository containing artifacts to include
+ */
+ @get:Internal
+ lateinit var androidxRepoOut: File
+
+ fun addCandidate(artifact: Artifact) {
+ val groupSubdir = artifact.mavenGroup.replace('.', '/')
+ val projectSubdir = File("$groupSubdir/${artifact.projectName}")
+ val includes = listOfNotNull(
+ "${artifact.version}/**",
+ if (includeMetadata)
+ "maven-metadata.*"
+ else
+ null
+ )
+ // We specifically pass the subdirectory into 'from' so that changes in other artifacts
+ // won't cause this task to become out of date
+ from("$androidxRepoOut/$projectSubdir") { spec ->
+ spec.into("m2repository/$projectSubdir")
+ for (inclusion in includes) {
+ include(inclusion)
+ }
+ }
+ }
+ /**
* Config action that configures the task when necessary.
*/
class ConfigAction(private val params: Params) : Action<GMavenZipTask> {
data class Params(
/**
- * Maven group for the task. "" if for all projects
+ * Maven group for the task. "" if multiple groups or only one project
*/
val mavenGroup: String,
/**
@@ -70,9 +96,9 @@
*/
var includeMetadata: Boolean,
/**
- * The out folder for publishing libraries.
+ * The root of the repository where built libraries can be found
*/
- val supportRepoOut: File,
+ val androidxRepoOut: File,
/**
* The out folder where the zip will be created
*/
@@ -95,40 +121,13 @@
this project.
Group: ${if (mavenGroup != "") mavenGroup else "All"}
""".trimIndent()
- task.from(supportRepoOut)
+ task.androidxRepoOut = androidxRepoOut
task.destinationDirectory.set(distDir)
task.includeMetadata = params.includeMetadata
- task.into("m2repository")
task.archiveBaseName.set(getZipName(fileNamePrefix, mavenGroup))
- task.onlyIf {
- // always run top diff zip as it is required by build on server task
- task.setupIncludes()
- }
}
}
}
-
- /**
- * Decides which files should be included in the zip. Should be invoked right before task
- * runs as an `onlyIf` block. Returns `false` if there is nothing to zip.
- */
- private fun setupIncludes(): Boolean {
- // have 1 default include so that by default, nothing is included
- val includes = candidates.flatMap {
- val mavenGroupPath = it.mavenGroup.replace('.', '/')
- listOfNotNull(
- "$mavenGroupPath/${it.projectName}/${it.version}" + "/**",
- if (includeMetadata)
- "$mavenGroupPath/${it.projectName}" + "/maven-metadata.*"
- else
- null
- )
- }
- includes.forEach {
- include(it)
- }
- return includes.isNotEmpty()
- }
}
/**
@@ -197,14 +196,14 @@
val publishTask = project.tasks.named("publish")
zipTasks.forEach {
it.configure { zipTask ->
- zipTask.candidates.add(artifact)
+ zipTask.addCandidate(artifact)
// Add additional artifacts needed for Gradle Plugins
if (extension.type == LibraryType.GRADLE_PLUGIN) {
project.extensions.getByType(
GradlePluginDevelopmentExtension::class.java
).plugins.forEach { plugin ->
- zipTask.candidates.add(
+ zipTask.addCandidate(
Artifact(
mavenGroup = plugin.id,
projectName = "${plugin.id}.gradle.plugin",
@@ -229,10 +228,11 @@
fileNamePrefix: String = "",
group: String? = null
): GMavenZipTask.ConfigAction.Params {
+ // Make base params or reuse if already created
val params = configActionParams ?: GMavenZipTask.ConfigAction.Params(
mavenGroup = "",
includeMetadata = false,
- supportRepoOut = project.getRepositoryDirectory(),
+ androidxRepoOut = project.getRepositoryDirectory(),
distDir = distDir,
fileNamePrefix = fileNamePrefix,
buildNumber = getBuildId()
@@ -241,6 +241,7 @@
}
distDir.mkdirs()
+ // Copy base params and apply any specific differences
return params.copy(
mavenGroup = group ?: "",
distDir = distDir,
@@ -259,7 +260,7 @@
getParams(
project,
project.getDistributionDirectory(),
- Release.GLOBAL_ZIP_PREFIX
+ fileNamePrefix = Release.GLOBAL_ZIP_PREFIX
).copy(
includeMetadata = true
)
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
index 535ee88..84d5e4cc 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/dackka/DackkaTask.kt
@@ -184,6 +184,7 @@
) : WorkAction<DackkaParams> {
override fun execute() {
execOperations.javaexec {
+ it.mainClass.set("org.jetbrains.dokka.MainKt")
it.args = parameters.args.get()
it.classpath(parameters.classpath.get())
// b/183989795 tracks moving these away from an environment variables
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
index 03131fa..a63eac1 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/docs/AndroidXDocsImplPlugin.kt
@@ -43,6 +43,7 @@
import org.gradle.api.attributes.Category
import org.gradle.api.attributes.DocsType
import org.gradle.api.attributes.Usage
+import org.gradle.api.file.ArchiveOperations
import org.gradle.api.file.DuplicatesStrategy
import org.gradle.api.file.FileCollection
import org.gradle.api.model.ObjectFactory
@@ -67,15 +68,16 @@
/**
* Plugin that allows to build documentation for a given set of prebuilt and tip of tree projects.
*/
-class AndroidXDocsImplPlugin : Plugin<Project> {
- lateinit var project: Project
+abstract class AndroidXDocsImplPlugin : Plugin<Project> {
lateinit var docsType: String
lateinit var docsSourcesConfiguration: Configuration
lateinit var samplesSourcesConfiguration: Configuration
lateinit var dependencyClasspath: FileCollection
+ @get:javax.inject.Inject
+ abstract val archiveOperations: ArchiveOperations
+
override fun apply(project: Project) {
- this.project = project
docsType = project.name.removePrefix("docs-")
project.plugins.all { plugin ->
when (plugin) {
@@ -94,8 +96,8 @@
}
}
}
- disableUnneededTasks()
- createConfigurations()
+ disableUnneededTasks(project)
+ createConfigurations(project)
val buildOnServer = project.tasks.register<DocsBuildOnServer>("buildOnServer") {
buildId = getBuildId()
docsType = this@AndroidXDocsImplPlugin.docsType
@@ -104,12 +106,14 @@
val unzippedSamplesSources = File(project.buildDir, "unzippedSampleSources")
val unzipSamplesTask = configureUnzipTask(
+ project,
"unzipSampleSources",
unzippedSamplesSources,
samplesSourcesConfiguration
)
val unzippedDocsSources = File(project.buildDir, "unzippedDocsSources")
val unzipDocsTask = configureUnzipTask(
+ project,
"unzipDocsSources",
unzippedDocsSources,
docsSourcesConfiguration
@@ -117,11 +121,13 @@
val unzippedSourcesForDackka = File(project.buildDir, "unzippedSourcesForDackka")
val unzipSourcesForDackkaTask = configureDackkaUnzipTask(
+ project,
unzippedSourcesForDackka,
docsSourcesConfiguration
)
configureDackka(
+ project,
unzippedSourcesForDackka,
unzipSourcesForDackkaTask,
unzippedSamplesSources,
@@ -130,6 +136,7 @@
buildOnServer
)
configureDokka(
+ project,
unzippedDocsSources,
unzipDocsTask,
unzippedSamplesSources,
@@ -138,6 +145,7 @@
buildOnServer
)
configureDoclava(
+ project,
unzippedDocsSources,
unzipDocsTask,
dependencyClasspath,
@@ -150,6 +158,7 @@
* [docsConfiguration] configuration, resolve them and put them to [destinationDirectory].
*/
private fun configureUnzipTask(
+ project: Project,
taskName: String,
destinationDirectory: File,
docsConfiguration: Configuration
@@ -163,7 +172,7 @@
task.from(
sources.elements.map { jars ->
jars.map {
- project.zipTree(it).matching {
+ archiveOperations.zipTree(it).matching {
// Filter out files that documentation tools cannot process.
it.exclude("**/*.MF")
it.exclude("**/*.aidl")
@@ -192,6 +201,7 @@
* This is a modified version of [configureUnzipTask], customized for Dackka usage.
*/
private fun configureDackkaUnzipTask(
+ project: Project,
destinationDirectory: File,
docsConfiguration: Configuration
): TaskProvider<Sync> {
@@ -202,7 +212,7 @@
task.from(
sources.elements.map { jars ->
jars.map {
- project.zipTree(it)
+ archiveOperations.zipTree(it)
}
}
)
@@ -219,7 +229,7 @@
* samples sources
* - stubs(project(":foo:foo-stubs")) - stubs needed for a documented library
*/
- private fun createConfigurations() {
+ private fun createConfigurations(project: Project) {
project.dependencies.components.all<SourcesVariantRule>()
val docsConfiguration = project.configurations.create("docs") {
it.isCanBeResolved = false
@@ -297,6 +307,7 @@
}
private fun configureDackka(
+ project: Project,
unzippedDocsSources: File,
unzipDocsTask: TaskProvider<Sync>,
unzippedSamplesSources: File,
@@ -356,6 +367,7 @@
}
private fun configureDokka(
+ project: Project,
unzippedDocsSources: File,
unzipDocsTask: TaskProvider<Sync>,
unzippedSamplesSources: File,
@@ -377,6 +389,9 @@
task.dependsOn(unzipSamplesTask)
val androidJar = androidJarFile(project)
+ val dokkaClasspath = project.provider({
+ project.files(androidJar).plus(dependencyClasspath)
+ })
// DokkaTask tries to resolve DokkaTask#classpath right away for jars that might not
// be there yet. Delay the setting of this property to before we run the task.
task.inputs.files(androidJar, dependencyClasspath)
@@ -396,10 +411,7 @@
opts.suppress = true
dokkaTask.perPackageOptions.add(opts)
}
-
- dokkaTask.classpath = project.files(dokkaTask.classpath)
- .plus(project.files(androidJar))
- .plus(dependencyClasspath)
+ dokkaTask.classpath = dokkaClasspath.get()
}
}
val zipTask = project.tasks.register("zipDokkaDocs", Zip::class.java) {
@@ -425,6 +437,7 @@
}
private fun configureDoclava(
+ project: Project,
unzippedDocsSources: File,
unzipDocsTask: TaskProvider<Sync>,
dependencyClasspath: FileCollection,
@@ -531,7 +544,7 @@
* Replace all tests etc with empty task, so we don't run anything
* it is more effective then task.enabled = false, because we avoid executing deps as well
*/
- private fun disableUnneededTasks() {
+ private fun disableUnneededTasks(project: Project) {
var reentrance = false
project.tasks.whenTaskAdded { task ->
if (task is Test || task.name.startsWith("assemble") ||
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/license/CheckExternalDependencyLicensesTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/license/CheckExternalDependencyLicensesTask.kt
index a46c84f..18f4470 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/license/CheckExternalDependencyLicensesTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/license/CheckExternalDependencyLicensesTask.kt
@@ -24,6 +24,11 @@
import org.gradle.api.artifacts.repositories.MavenArtifactRepository
import org.gradle.api.artifacts.result.ResolvedArtifactResult
import org.gradle.api.attributes.Usage
+import org.gradle.api.file.ConfigurableFileCollection
+import org.gradle.api.file.FileCollection
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.Input
+import org.gradle.api.tasks.InputFiles
import org.gradle.api.tasks.TaskAction
import org.gradle.kotlin.dsl.named
import java.io.File
@@ -34,37 +39,20 @@
* a) come from prebuilts
* b) has a license file.
*/
-open class CheckExternalDependencyLicensesTask : DefaultTask() {
+abstract class CheckExternalDependencyLicensesTask : DefaultTask() {
+ @get:Input
+ abstract val prebuiltsRoot: Property<String>
+
+ @get:InputFiles
+ abstract val filesToCheck: ConfigurableFileCollection
+
@TaskAction
fun checkDependencies() {
- val prebuiltsRoot = File(project.getCheckoutRoot(), "prebuilts")
- val checkerConfig = project.configurations.getByName(CONFIGURATION_NAME)
-
- project
- .configurations
- .flatMap {
- it.allDependencies
- .filterIsInstance(ExternalDependency::class.java)
- .filterNot {
- it.group?.startsWith("com.android") == true
- }
- .filterNot {
- it.group?.startsWith("android.arch") == true
- }
- .filterNot {
- it.group?.startsWith("androidx") == true
- }
- }
- .forEach {
- checkerConfig.dependencies.add(it)
- }
- val localArtifactRepositories = findLocalMavenRepositories()
- val dependencyArtifacts = checkerConfig.incoming.artifacts.artifacts.mapNotNull {
- validateAndGetArtifactInPrebuilts(it, localArtifactRepositories)
- }
+ val prebuiltsRoot = File(prebuiltsRoot.get())
+ val dependencyArtifacts = filesToCheck
val missingLicenses = dependencyArtifacts.filter {
findLicenseFile(it.canonicalFile, prebuiltsRoot) == null
- }
+ }.files
if (missingLicenses.isNotEmpty()) {
val suggestions = missingLicenses.joinToString("\n") {
"$it does not have a license file. It should probably live in " +
@@ -81,75 +69,6 @@
}
}
- /**
- * Returns the list of local maven repository File paths declared in this project.
- */
- private fun findLocalMavenRepositories(): List<File> {
- return project.repositories.mapNotNull {
- if (it is MavenArtifactRepository && it.url.scheme == "file") {
- it.url
- } else {
- null
- }
- }.map { File(it) }
- }
-
- /**
- * Checks if the given [ResolvedArtifactResult] resolves to an artifact in prebuilts and if
- * so, returns that File.
- *
- * Note that, when artifacts are published with gradle metadata, the actual resolved file may
- * not reside in prebuilts directory. For those cases, this code re-resolves the artifact
- * from the [repoPaths] and returns the file in prebuilts instead.
- *
- * Returns null if the file does not exist in prebuilts. When it is an error (files outside
- * prebuitls filder is allowed for IDE plugins), throws a [GradleException].
- *
- * @param resolvedArtifact Resolved artifact from the configuration
- * @param repoPaths List of local maven repositories that can be used to resolve the artifact.
- *
- * @return The artifact in prebuilts or null if it does not exist.
- */
- private fun validateAndGetArtifactInPrebuilts(
- resolvedArtifact: ResolvedArtifactResult,
- repoPaths: List<File>
- ): File? {
- val fileInPrebuilts = repoPaths.any { repoPath ->
- resolvedArtifact.file.absolutePath.startsWith(repoPath.absolutePath)
- }
- if (fileInPrebuilts) {
- return resolvedArtifact.file
- }
- // from the artifact coordinates, try to find the actual file in prebuilts.
- // for gradle metadata publishing, resolved file might be moved into .gradle caches
- val id = resolvedArtifact.id.componentIdentifier
- if (id is ModuleComponentIdentifier) {
- // Construct the local folder structure for the artifact to find it in local
- // repositories. If it exists, we'll return that folder instead of the final resolved
- // artifact.
- // For a module: com.google:artifact:1.2.3; the path would be
- // <repo-root>/com/google/artifact/1.2.3
- val subFolder = (id.group.split('.') + id.module + id.version)
- .joinToString(File.separator)
- // if it exists in one of the local repositories, return it.
- repoPaths.forEach {
- val artifactFolder = it.resolve(subFolder)
- if (artifactFolder.exists()) {
- return artifactFolder
- }
- }
- }
- // IDE plugins use dependencies bundled with the IDE itself, so we can ignore this
- // warning for such projects
- if (!project.plugins.hasPlugin("org.jetbrains.intellij")) {
- throw GradleException(
- "prebuilts should come from prebuilts folder. $resolvedArtifact " +
- "(${resolvedArtifact.file} is not there"
- )
- }
- return null
- }
-
private fun findLicenseFile(dependency: File, prebuiltsRoot: File): File? {
check(dependency.absolutePath.startsWith(prebuiltsRoot.absolutePath)) {
"Prebuilt file is not part of the prebuilts folder. ${dependency.absoluteFile}"
@@ -181,11 +100,113 @@
tasks.register(
CheckExternalDependencyLicensesTask.TASK_NAME,
CheckExternalDependencyLicensesTask::class.java
- )
- configurations.create(CheckExternalDependencyLicensesTask.CONFIGURATION_NAME) {
- it.isCanBeConsumed = false
- it.attributes {
- it.attribute(Usage.USAGE_ATTRIBUTE, objects.named(Usage.JAVA_RUNTIME))
+ ) { task ->
+ task.prebuiltsRoot.set(File(project.getCheckoutRoot(), "prebuilts").absolutePath)
+
+ task.filesToCheck.from(
+ project.provider({
+ val checkerConfig = project.configurations.detachedConfiguration()
+ checkerConfig.isCanBeConsumed = false
+ checkerConfig.attributes {
+ it.attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage.JAVA_RUNTIME))
+ }
+
+ project
+ .configurations
+ .flatMap {
+ it.allDependencies
+ .filterIsInstance(ExternalDependency::class.java)
+ .filterNot {
+ it.group?.startsWith("com.android") == true
+ }
+ .filterNot {
+ it.group?.startsWith("android.arch") == true
+ }
+ .filterNot {
+ it.group?.startsWith("androidx") == true
+ }
+ }
+ .forEach {
+ checkerConfig.dependencies.add(it)
+ }
+
+ val localArtifactRepositories = project.findLocalMavenRepositories()
+ val dependencyArtifacts = checkerConfig.incoming.artifacts.artifacts.mapNotNull {
+ project.validateAndGetArtifactInPrebuilts(it, localArtifactRepositories)
+ }
+
+ dependencyArtifacts
+ })
+ )
+ }
+}
+
+/**
+ * Checks if the given [ResolvedArtifactResult] resolves to an artifact in prebuilts and if
+ * so, returns that File.
+ *
+ * Note that, when artifacts are published with gradle metadata, the actual resolved file may
+ * not reside in prebuilts directory. For those cases, this code re-resolves the artifact
+ * from the [repoPaths] and returns the file in prebuilts instead.
+ *
+ * Returns null if the file does not exist in prebuilts. When it is an error (files outside
+ * prebuitls filder is allowed for IDE plugins), throws a [GradleException].
+ *
+ * @param resolvedArtifact Resolved artifact from the configuration
+ * @param repoPaths List of local maven repositories that can be used to resolve the artifact.
+ *
+ * @return The artifact in prebuilts or null if it does not exist.
+ */
+private fun Project.validateAndGetArtifactInPrebuilts(
+ resolvedArtifact: ResolvedArtifactResult,
+ repoPaths: FileCollection
+): File? {
+ val fileInPrebuilts = repoPaths.any { repoPath ->
+ resolvedArtifact.file.absolutePath.startsWith(repoPath.absolutePath)
+ }
+ if (fileInPrebuilts) {
+ return resolvedArtifact.file
+ }
+ // from the artifact coordinates, try to find the actual file in prebuilts.
+ // for gradle metadata publishing, resolved file might be moved into .gradle caches
+ val id = resolvedArtifact.id.componentIdentifier
+ if (id is ModuleComponentIdentifier) {
+ // Construct the local folder structure for the artifact to find it in local
+ // repositories. If it exists, we'll return that folder instead of the final resolved
+ // artifact.
+ // For a module: com.google:artifact:1.2.3; the path would be
+ // <repo-root>/com/google/artifact/1.2.3
+ val subFolder = (id.group.split('.') + id.module + id.version)
+ .joinToString(File.separator)
+ // if it exists in one of the local repositories, return it.
+ repoPaths.forEach {
+ val artifactFolder = it.resolve(subFolder)
+ if (artifactFolder.exists()) {
+ return artifactFolder
+ }
}
}
+ // IDE plugins use dependencies bundled with the IDE itself, so we can ignore this
+ // warning for such projects
+ if (!project.plugins.hasPlugin("org.jetbrains.intellij")) {
+ throw GradleException(
+ "prebuilts should come from prebuilts folder. $resolvedArtifact " +
+ "(${resolvedArtifact.file} is not there"
+ )
+ }
+ return null
+}
+
+/**
+ * Returns the list of local maven repository File paths declared in this project.
+ */
+private fun Project.findLocalMavenRepositories(): FileCollection {
+ val fileList = project.repositories.mapNotNull {
+ if (it is MavenArtifactRepository && it.url.scheme == "file") {
+ it.url
+ } else {
+ null
+ }
+ }.map { File(it) }
+ return project.files(fileList)
}
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt b/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
index 446af79..b04ea44 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/uptodatedness/TaskUpToDateValidator.kt
@@ -141,7 +141,7 @@
":external:libyuv:buildCMakeRelWithDebInfo[yuv]",
":hilt:hilt-navigation-compose:kaptGenerateStubsDebugKotlin",
":hilt:hilt-navigation-compose:kaptGenerateStubsReleaseKotlin",
- ":lint-checks:integration-tests:copyReleaseAndroidLintReports",
+ ":lint-checks:integration-tests:copyDebugAndroidLintReports",
// https://github.com/gradle/gradle/issues/17262
":doclava:compileJava",
@@ -180,13 +180,19 @@
// We should be able to remove these entries when b/160392650 is fixed
"lint",
- "lintAnalyzeRelease",
- "lintRelease",
- "lintVitalRelease",
- "lintWithExpandProjectionRelease",
- "lintWithoutExpandProjectionRelease",
- "lintWithKaptRelease",
- "lintWithKspRelease",
+ "lintAnalyzeDebug",
+ "lintDebug",
+ "lintVitalDebug",
+ "lintWithExpandProjectionDebug",
+ "lintWithoutExpandProjectionDebug",
+ "lintWithKaptDebug",
+ "lintWithKspDebug",
+
+ // https://github.com/johnrengelman/shadow/issues/707
+ "embeddedPlugin",
+ "repackageBundledJars",
+ "repackageCompiler",
+ "shadowJar"
)
abstract class TaskUpToDateValidator :
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt b/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
index de34c58..46ecf9c 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/BuildServerConfiguration.kt
@@ -53,11 +53,11 @@
* the contents of DIST_DIR to somewhere and make it available.
*/
fun Project.getDistributionDirectory(): File {
- return if (System.getenv("DIST_DIR") != null) {
- File(System.getenv("DIST_DIR"))
+ val envVar = project.providers.environmentVariable("DIST_DIR").forUseAtConfigurationTime().getOrElse("")
+ return if (envVar != "") {
+ File(envVar)
} else {
- val subdir = System.getenv("DIST_SUBDIR") ?: ""
- File(getRootOutDirectory(), "dist$subdir")
+ File(getRootOutDirectory(), "dist")
}.also { distDir ->
distDir.mkdirs()
}
@@ -109,6 +109,12 @@
File(getDistributionDirectory(), "librarymetrics")
/**
+ * Directory to put json metrics so they can be consumed by the metrics dashboards.
+ */
+fun Project.getLibraryReportsDirectory(): File =
+ File(getDistributionDirectory(), "libraryreports")
+
+/**
* Whether the build should force all versions to be snapshots.
*/
fun isSnapshotBuild() = System.getenv("SNAPSHOT") != null
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt b/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt
index 3d5f224..f272680 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/LibraryGroups.kt
@@ -71,6 +71,7 @@
val MEDIA = LibraryGroup("androidx.media", null)
val MEDIA2 = LibraryGroup("androidx.media2", LibraryVersions.MEDIA2)
val MEDIAROUTER = LibraryGroup("androidx.mediarouter", LibraryVersions.MEDIAROUTER)
+ val METRICS = LibraryGroup("androidx.metrics", LibraryVersions.METRICS)
val NAVIGATION = LibraryGroup("androidx.navigation", LibraryVersions.NAVIGATION)
val PAGING = LibraryGroup("androidx.paging", LibraryVersions.PAGING)
val PALETTE = LibraryGroup("androidx.palette", LibraryVersions.PALETTE)
diff --git a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
index af9eaf0..3c92e54 100644
--- a/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
+++ b/buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt
@@ -20,40 +20,39 @@
* The list of versions codes of all the libraries in this project.
*/
object LibraryVersions {
- val ACTIVITY = Version("1.4.0-beta01")
+ val ACTIVITY = Version("1.4.0-beta02")
val ADS_IDENTIFIER = Version("1.0.0-alpha05")
- val ANNOTATION = Version("1.3.0-beta01")
+ val ANNOTATION = Version("1.3.0-beta02")
val ANNOTATION_EXPERIMENTAL = Version("1.2.0-alpha01")
- val APPCOMPAT = Version("1.4.0-alpha04")
+ val APPCOMPAT = Version("1.4.0-beta02")
val APPSEARCH = Version("1.0.0-alpha03")
val ARCH_CORE = Version("2.2.0-alpha01")
val ASYNCLAYOUTINFLATER = Version("1.1.0-alpha01")
val AUTOFILL = Version("1.2.0-beta02")
- val BENCHMARK = Version("1.1.0-alpha08")
+ val BENCHMARK = Version("1.1.0-alpha09")
val BIOMETRIC = Version("1.2.0-alpha03")
- val BROWSER = Version("1.4.0-beta01")
+ val BROWSER = Version("1.4.0-rc01")
val BUILDSRC_TESTS = Version("1.0.0-alpha01")
- val CAMERA = Version("1.1.0-alpha09")
- val CAMERA_EXTENSIONS = Version("1.0.0-alpha29")
+ val CAMERA = Version("1.1.0-alpha10")
+ val CAMERA_EXTENSIONS = Version("1.0.0-alpha30")
val CAMERA_PIPE = Version("1.0.0-alpha01")
- val CAMERA_VIDEO = Version("1.0.0-alpha01")
- val CAMERA_VIEW = Version("1.0.0-alpha29")
+ val CAMERA_VIEW = Version("1.0.0-alpha30")
val CARDVIEW = Version("1.1.0-alpha01")
val CAR_APP = Version("1.1.0-beta02")
- val COLLECTION = Version("1.2.0-alpha02")
- val COLLECTION2 = Version("1.2.0-alpha02")
+ val COLLECTION = Version("1.2.0-beta01")
+ val COLLECTION2 = Version("1.2.0-beta01")
val CONTENTPAGER = Version("1.1.0-alpha01")
- val COMPOSE_MATERIAL3 = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha01")
- val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha05")
+ val COMPOSE_MATERIAL3 = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.0.0-alpha01")
+ val COMPOSE = Version(System.getenv("COMPOSE_CUSTOM_VERSION") ?: "1.1.0-alpha06")
val COORDINATORLAYOUT = Version("1.2.0-alpha01")
- val CORE = Version("1.7.0-beta02")
+ val CORE = Version("1.7.0-rc01")
val CORE_ANIMATION = Version("1.0.0-alpha03")
val CORE_ANIMATION_TESTING = Version("1.0.0-alpha03")
val CORE_APPDIGEST = Version("1.0.0-alpha01")
val CORE_GOOGLE_SHORTCUTS = Version("1.1.0-alpha02")
val CORE_REMOTEVIEWS = Version("1.0.0-alpha01")
val CORE_ROLE = Version("1.1.0-alpha02")
- val CORE_SPLASHSCREEN = Version("1.0.0-alpha02")
+ val CORE_SPLASHSCREEN = Version("1.0.0-alpha03")
val CURSORADAPTER = Version("1.1.0-alpha01")
val CUSTOMVIEW = Version("1.2.0-alpha01")
val DATASTORE = Version("1.1.0-alpha01")
@@ -66,11 +65,11 @@
val EMOJI2 = Version("1.0.0-beta02")
val ENTERPRISE = Version("1.1.0-rc01")
val EXIFINTERFACE = Version("1.4.0-alpha01")
- val FRAGMENT = Version("1.4.0-alpha10")
+ val FRAGMENT = Version("1.4.0-alpha11")
val FUTURES = Version("1.2.0-alpha01")
val GLANCE = Version("1.0.0-alpha01")
val GRIDLAYOUT = Version("1.1.0-alpha01")
- val HEALTH_SERVICES_CLIENT = Version("1.0.0-alpha02")
+ val HEALTH_SERVICES_CLIENT = Version("1.0.0-alpha03")
val HEIFWRITER = Version("1.1.0-alpha02")
val HILT = Version("1.1.0-alpha01")
val HILT_NAVIGATION_COMPOSE = Version("1.0.0-alpha04")
@@ -84,26 +83,27 @@
val LEGACY = Version("1.1.0-alpha01")
val LOCALBROADCASTMANAGER = Version("1.1.0-alpha02")
val LIFECYCLE = Version("2.5.0-alpha01")
- val LIFECYCLE_VIEWMODEL_COMPOSE = Version("1.0.0-alpha08")
+ val LIFECYCLE_VIEWMODEL_COMPOSE = Version("2.5.0-alpha01")
val LIFECYCLE_EXTENSIONS = Version("2.2.0")
val LOADER = Version("1.2.0-alpha01")
val MEDIA = Version("1.5.0-alpha01")
val MEDIA2 = Version("1.3.0-alpha01")
val MEDIAROUTER = Version("1.3.0-alpha01")
- val NAVIGATION = Version("2.4.0-alpha10")
- val PAGING = Version("3.1.0-alpha04")
- val PAGING_COMPOSE = Version("1.0.0-alpha13")
+ val METRICS = Version("1.0.0-alpha01")
+ val NAVIGATION = Version("2.4.0-alpha11")
+ val PAGING = Version("3.1.0-beta01")
+ val PAGING_COMPOSE = Version("1.0.0-alpha14")
val PALETTE = Version("1.1.0-alpha01")
val PRINT = Version("1.1.0-beta01")
val PERCENTLAYOUT = Version("1.1.0-alpha01")
val PREFERENCE = Version("1.2.0-alpha01")
- val PROFILEINSTALLER = Version("1.1.0-alpha06")
+ val PROFILEINSTALLER = Version("1.1.0-alpha07")
val RECOMMENDATION = Version("1.1.0-alpha01")
val RECYCLERVIEW = Version("1.3.0-alpha02")
val RECYCLERVIEW_SELECTION = Version("1.2.0-alpha02")
val REMOTECALLBACK = Version("1.0.0-alpha02")
val RESOURCEINSPECTION = Version("1.0.0-beta02")
- val ROOM = Version("2.4.0-alpha05")
+ val ROOM = Version("2.4.0-alpha06")
val SAVEDSTATE = Version("1.2.0-alpha01")
val SECURITY = Version("1.1.0-alpha04")
val SECURITY_APP_AUTHENTICATOR = Version("1.0.0-alpha03")
@@ -132,18 +132,18 @@
val VERSIONED_PARCELABLE = Version("1.2.0-alpha01")
val VIEWPAGER = Version("1.1.0-alpha02")
val VIEWPAGER2 = Version("1.1.0-beta02")
- val WEAR = Version("1.3.0-alpha01")
- val WEAR_COMPOSE = Version("1.0.0-alpha07")
- val WEAR_INPUT = Version("1.2.0-alpha02")
+ val WEAR = Version("1.3.0-alpha02")
+ val WEAR_COMPOSE = Version("1.0.0-alpha08")
+ val WEAR_INPUT = Version("1.2.0-alpha03")
val WEAR_INPUT_TESTING = WEAR_INPUT
val WEAR_ONGOING = Version("1.1.0-alpha01")
val WEAR_PHONE_INTERACTIONS = Version("1.1.0-alpha02")
val WEAR_REMOTE_INTERACTIONS = Version("1.1.0-alpha01")
- val WEAR_TILES = Version("1.0.0-alpha12")
- val WEAR_WATCHFACE = Version("1.0.0-alpha23")
+ val WEAR_TILES = Version("1.0.0-alpha13")
+ val WEAR_WATCHFACE = Version("1.0.0-alpha24")
val WEBKIT = Version("1.5.0-alpha01")
val WINDOW = Version("1.0.0-beta03")
val WINDOW_EXTENSIONS = Version("1.0.0-alpha01")
val WINDOW_SIDECAR = Version("1.0.0-beta01")
- val WORK = Version("2.7.0-beta01")
+ val WORK = Version("2.8.0-alpha01")
}
diff --git a/buildSrc/shared.gradle b/buildSrc/shared.gradle
index a82ce62..5b2e9ed 100644
--- a/buildSrc/shared.gradle
+++ b/buildSrc/shared.gradle
@@ -67,6 +67,9 @@
main.java.srcDirs += "${supportRootFolder}/compose/material/material/icons/generator/src/main" +
"/kotlin"
+
+ main.java.srcDirs += "${supportRootFolder}/glance/glance-appwidget/glance-layout-generator/" +
+ "src/main/kotlin"
}
gradlePlugin {
diff --git a/busytown/androidx-native-mac.sh b/busytown/androidx-native-mac.sh
new file mode 100755
index 0000000..d019fa0
--- /dev/null
+++ b/busytown/androidx-native-mac.sh
@@ -0,0 +1,5 @@
+echo "This is a test of building on a mac"
+echo "The next lines should match"
+echo
+echo "expect: OS = Darwin"
+echo "actual: OS = $(uname)"
diff --git a/busytown/androidx-studio-integration-vitals.sh b/busytown/androidx-studio-integration-vitals.sh
index ac25e04..3aff369 100755
--- a/busytown/androidx-studio-integration-vitals.sh
+++ b/busytown/androidx-studio-integration-vitals.sh
@@ -1,4 +1,4 @@
set -e
SCRIPT_PATH="$(cd $(dirname $0) && pwd)"
-$SCRIPT_PATH/impl/build-studio-and-androidx.sh -Pandroidx.summarizeStderr --no-daemon -Pandroidx.allWarningsAsErrors tasks --stacktrace
+$SCRIPT_PATH/impl/build-studio-and-androidx.sh -Pandroidx.allWarningsAsErrors tasks --stacktrace
diff --git a/busytown/androidx-studio-integration.sh b/busytown/androidx-studio-integration.sh
index 5ba70ad..3633139 100755
--- a/busytown/androidx-studio-integration.sh
+++ b/busytown/androidx-studio-integration.sh
@@ -1,4 +1,4 @@
set -e
SCRIPT_PATH="$(cd $(dirname $0) && pwd)"
-$SCRIPT_PATH/impl/build-studio-and-androidx.sh -Pandroidx.summarizeStderr --no-daemon -Pandroidx.allWarningsAsErrors listTaskOutputs bOS -Pandroidx.verifyUpToDate -x verifyDependencyVersions --stacktrace
+$SCRIPT_PATH/impl/build-studio-and-androidx.sh -Pandroidx.allWarningsAsErrors listTaskOutputs bOS -Pandroidx.verifyUpToDate -x verifyDependencyVersions --stacktrace
diff --git a/busytown/androidx.sh b/busytown/androidx.sh
index 8b295a8..dcdefc3 100755
--- a/busytown/androidx.sh
+++ b/busytown/androidx.sh
@@ -9,6 +9,7 @@
EXIT_VALUE=0
if impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
-Pandroidx.enableComposeCompilerMetrics=true \
+ -Pandroidx.enableComposeCompilerReports=true \
--profile "$@"; then
EXIT_VALUE=0
else
diff --git a/busytown/androidx_incremental.sh b/busytown/androidx_incremental.sh
index d11eb1e..9c29a31 100755
--- a/busytown/androidx_incremental.sh
+++ b/busytown/androidx_incremental.sh
@@ -16,6 +16,12 @@
export DIST_DIR="$DIST_DIR/incremental"
mkdir -p "$DIST_DIR"
+if echo "$BUILD_NUMBER" | grep "P" >/dev/null; then
+ PRESUBMIT=true
+else
+ PRESUBMIT=false
+fi
+
function hashOutDir() {
hashFile=out.hashes
echo "hashing out dir and saving into $DIST_DIR/$hashFile"
@@ -38,16 +44,23 @@
echo done zipping kotlin metadata
}
+# If we encounter a failure in postsubmit, we try a few things to determine if the failure is
+# reproducible
+DIAGNOSE_ARG=""
+if [ "$PRESUBMIT" == "false" ]; then
+ DIAGNOSE_ARG="--diagnose"
+fi
+
# Run Gradle
EXIT_VALUE=0
-if impl/build.sh buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
+if impl/build.sh $DIAGNOSE_ARG buildOnServer checkExternalLicenses listTaskOutputs validateAllProperties \
--profile "$@"; then
echo build succeeded
EXIT_VALUE=0
else
zipKotlinMetadata
echo build failed
- if echo "$BUILD_NUMBER" | grep "P"; then
+ if [ "$PRESUBMIT" == "true" ]; then
echo androidx_incremental ignoring presubmit failure
else
EXIT_VALUE=1
diff --git a/busytown/androidx_snapshot.sh b/busytown/androidx_snapshot.sh
index afad9a8..f31a420 100755
--- a/busytown/androidx_snapshot.sh
+++ b/busytown/androidx_snapshot.sh
@@ -9,6 +9,7 @@
createArchive \
-Pandroidx.enableAffectedModuleDetection=false \
-Pandroidx.enableComposeCompilerMetrics=true \
+ -Pandroidx.enableComposeCompilerReports=true \
"$@"
echo "Completing $0 at $(date)"
diff --git a/busytown/impl/build-studio-and-androidx.sh b/busytown/impl/build-studio-and-androidx.sh
index 4743b9b..ac8afc7 100755
--- a/busytown/impl/build-studio-and-androidx.sh
+++ b/busytown/impl/build-studio-and-androidx.sh
@@ -66,6 +66,7 @@
function buildAndroidx() {
LOG_PROCESSOR="$SCRIPTS_DIR/../development/build_log_processor.sh"
+ properties="-Pandroidx.summarizeStderr --no-daemon"
"$LOG_PROCESSOR" $gw $properties -p frameworks/support $androidxArguments --profile
$SCRIPTS_DIR/impl/parse_profile_htmls.sh
}
diff --git a/busytown/impl/build.sh b/busytown/impl/build.sh
index e7056bf..2efd41f 100755
--- a/busytown/impl/build.sh
+++ b/busytown/impl/build.sh
@@ -67,8 +67,11 @@
if [ "$DIAGNOSE" == "true" ]; then
# see if diagnose-build-failure.sh can identify the root cauase
echo "running diagnose-build-failure.sh, see build.log" >&2
- # specify a timeout in case we're running on a remote server, so we don't take too long
- ./development/diagnose-build-failure/diagnose-build-failure.sh --timeout 14400 "--ci saveSystemStats $*"
+ # Specify a short timeout in case we're running on a remote server, so we don't take too long.
+ # We probably won't have enough time to fully diagnose the problem given this timeout, but
+ # we might be able to determine whether this problem is reproducible enough for a developer to
+ # more easily investigate further
+ ./development/diagnose-build-failure/diagnose-build-failure.sh --timeout 600 "--ci saveSystemStats $*"
fi
exit 1
fi
diff --git a/busytown/impl/parse_profile_htmls.sh b/busytown/impl/parse_profile_htmls.sh
index bf33244..0307557 100755
--- a/busytown/impl/parse_profile_htmls.sh
+++ b/busytown/impl/parse_profile_htmls.sh
@@ -6,14 +6,17 @@
cd "$(dirname $0)"
+if [ "$OUT_DIR" == "" ]; then
+ OUT_DIR=../../../../out
+fi
if [ "$DIST_DIR" == "" ]; then
- DIST_DIR=../../../../out/dist
+ DIST_DIR="$OUT_DIR/dist"
fi
METRICS_DIR="$DIST_DIR/librarymetrics/build"
# If a profile file exists, parse it. If not, do nothing
-PROFILE_FILES="../../../../out/androidx/build/reports/profile/*.html"
+PROFILE_FILES="$OUT_DIR/androidx/build/reports/profile/*.html"
if ls $PROFILE_FILES >/dev/null 2>&1 ; then
- ./parse_profile_html.py --input-profile "$(ls $PROFILE_FILES | sort | tail -n 2 | head -n 1)" --output-summary $METRICS_DIR/build_androidx.json
+ ./parse_profile_html.py --input-profile "$(ls $PROFILE_FILES | sort | tail -n 1)" --output-summary $METRICS_DIR/build_androidx.json
fi
diff --git a/busytown/impl/verify_no_caches_in_source_repo.sh b/busytown/impl/verify_no_caches_in_source_repo.sh
index 79c8757..f95465a 100755
--- a/busytown/impl/verify_no_caches_in_source_repo.sh
+++ b/busytown/impl/verify_no_caches_in_source_repo.sh
@@ -26,7 +26,7 @@
# Paths that are still expected to be generated and that we have to allow
# If you need add or remove an exemption here, update cleanBuild.sh too
- EXEMPT_PATHS=".gradle buildSrc/.gradle local.properties"
+ EXEMPT_PATHS=".gradle buildSrc/.gradle local.properties reports build"
# put "./" in front of each path to match the output from 'find'
EXEMPT_PATHS="$(echo " $EXEMPT_PATHS" | sed 's| | ./|g')"
# build a `find` argument for skipping descending into the exempt paths
diff --git a/camera/camera-camera2-pipe-integration/build.gradle b/camera/camera-camera2-pipe-integration/build.gradle
index e3ecb5c..f1d7e7c 100644
--- a/camera/camera-camera2-pipe-integration/build.gradle
+++ b/camera/camera-camera2-pipe-integration/build.gradle
@@ -68,6 +68,7 @@
testImplementation(project(":internal-testutils-ktx"))
testImplementation(project(":internal-testutils-truth"))
+ androidTestImplementation(libs.multidex)
androidTestImplementation(libs.testExtJunit)
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.kotlinCoroutinesAndroid)
@@ -82,7 +83,7 @@
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
}
}
diff --git a/camera/camera-camera2-pipe-integration/lint.xml b/camera/camera-camera2-pipe-integration/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
index c6d153f..953720a 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/Camera2CameraControlDeviceTest.kt
@@ -43,6 +43,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth
import com.google.common.util.concurrent.ListenableFuture
@@ -64,6 +65,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
@OptIn(ExperimentalCamera2Interop::class)
+@SdkSuppress(minSdkVersion = 21)
class Camera2CameraControlDeviceTest {
private lateinit var cameraSelector: CameraSelector
private lateinit var context: Context
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
index de9a03a..463118c 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CameraControlAdapterDeviceTest.kt
@@ -36,6 +36,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.asExecutor
@@ -56,6 +57,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
@OptIn(ExperimentalCamera2Interop::class)
+@SdkSuppress(minSdkVersion = 21)
class CameraControlAdapterDeviceTest {
private lateinit var cameraSelector: CameraSelector
private lateinit var context: Context
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt
index d96f1c2..47f1b6f 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/CaptureConfigAdapterDeviceTest.kt
@@ -20,6 +20,7 @@
import android.graphics.SurfaceTexture
import android.hardware.camera2.CameraDevice
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.integration.adapter.CameraControlAdapter
import androidx.camera.core.CameraSelector
import androidx.camera.core.CameraX
@@ -37,6 +38,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth
import com.google.common.util.concurrent.ListenableFuture
import kotlinx.coroutines.CompletableDeferred
@@ -54,10 +56,12 @@
import org.junit.runner.RunWith
import java.util.concurrent.TimeUnit
+@RequiresApi(21)
private const val DEFAULT_LENS_FACING_SELECTOR = CameraSelector.LENS_FACING_BACK
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class CaptureConfigAdapterDeviceTest {
@get:Rule
@@ -142,6 +146,7 @@
}
}
+@RequiresApi(21)
private class FakeTestUseCase(
config: FakeUseCaseConfig,
) : FakeUseCase(config) {
@@ -152,6 +157,7 @@
}
}
+@RequiresApi(21)
private class TestDeferrableSurface : DeferrableSurface() {
init {
terminationFuture.addListener(
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
index f36ecd1..a0f2387 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/EvCompDeviceTest.kt
@@ -36,6 +36,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.testutils.assertThrows
import com.google.common.truth.Truth
import kotlinx.coroutines.Dispatchers
@@ -52,6 +53,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class EvCompDeviceTest {
private lateinit var cameraSelector: CameraSelector
private lateinit var context: Context
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/InitializationTest.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/InitializationTest.kt
index e854032..d093292 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/InitializationTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/integration/InitializationTest.kt
@@ -22,6 +22,7 @@
import androidx.concurrent.futures.await
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.runBlocking
@@ -30,6 +31,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class InitializationTest {
@OptIn(ExperimentalCameraProviderConfiguration::class)
diff --git a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/VerifyResultListener.kt b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/VerifyResultListener.kt
index f0a28c9..4043bb4 100644
--- a/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/VerifyResultListener.kt
+++ b/camera/camera-camera2-pipe-integration/src/androidTest/java/androidx/camera/camera2/pipe/testing/VerifyResultListener.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.testing
import android.hardware.camera2.CaptureFailure
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameNumber
import androidx.camera.camera2.pipe.Request
@@ -25,6 +26,7 @@
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class VerifyResultListener(capturesCount: Int) : Request.Listener {
private val captureRequests = mutableListOf<RequestMetadata>()
private val captureResults = mutableListOf<FrameInfo>()
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt
index bb925bd..d6e3c92 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt
@@ -15,14 +15,16 @@
*/
package androidx.camera.camera2.pipe.integration
-import androidx.camera.core.CameraXConfig
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.integration.adapter.CameraFactoryAdapter
import androidx.camera.camera2.pipe.integration.adapter.CameraSurfaceAdapter
import androidx.camera.camera2.pipe.integration.adapter.CameraUseCaseAdapter
+import androidx.camera.core.CameraXConfig
/**
* Convenience class for generating a pre-populated CameraPipe based [CameraXConfig].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
object CameraPipeConfig {
/**
* Creates a [CameraXConfig] containing a default CameraPipe implementation for CameraX.
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
index b3b2720..532cdb2 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraControlAdapter.kt
@@ -20,6 +20,7 @@
import android.graphics.Rect
import android.hardware.camera2.CameraCharacteristics
import android.util.Rational
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.core.Log.warn
import androidx.camera.camera2.pipe.integration.config.CameraScope
@@ -57,6 +58,7 @@
* forward these interactions to the currently configured [UseCaseCamera].
*/
@SuppressLint("UnsafeOptInUsageError")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
@OptIn(ExperimentalCoroutinesApi::class, ExperimentalCamera2Interop::class)
class CameraControlAdapter @Inject constructor(
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraFactoryAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraFactoryAdapter.kt
index 65f755f..c876214 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraFactoryAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraFactoryAdapter.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.integration.adapter
import android.content.Context
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.core.Debug
import androidx.camera.camera2.pipe.core.Log.debug
@@ -35,6 +36,7 @@
* The [CameraFactoryAdapter] is responsible for creating the root dagger component that is used
* to share resources across Camera instances.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraFactoryAdapter(
context: Context,
threadConfig: CameraThreadConfig,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
index b665065..2fd1e33 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInfoAdapter.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.adapter
import android.annotation.SuppressLint
import android.hardware.camera2.CameraCharacteristics
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.core.Log
import androidx.camera.camera2.pipe.integration.config.CameraConfig
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt
index d5242c4..d4685e5 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraInternalAdapter.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.adapter
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.core.Log.debug
import androidx.camera.camera2.pipe.core.Log.warn
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraStateAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraStateAdapter.kt
index 68c9d44..65c813c 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraStateAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraStateAdapter.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.integration.adapter
import android.annotation.SuppressLint
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.integration.config.CameraScope
import androidx.camera.camera2.pipe.integration.impl.EvCompControl
import androidx.camera.camera2.pipe.integration.impl.ZoomControl
@@ -32,6 +33,7 @@
* [CameraStateAdapter] caches and updates based on callbacks from the active CameraGraph.
*/
@SuppressLint("UnsafeOptInUsageError")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class CameraStateAdapter @Inject constructor(
private val zoomControl: ZoomControl,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt
index 4b9e616..e63492e 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraSurfaceAdapter.kt
@@ -13,11 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.adapter
import android.content.Context
import android.graphics.ImageFormat
import android.util.Size
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.core.Log.debug
import androidx.camera.camera2.pipe.integration.config.CameraAppComponent
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt
index bf418b7..d2969e4 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CameraUseCaseAdapter.kt
@@ -23,6 +23,7 @@
import android.util.Size
import android.view.Display
import android.view.WindowManager
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.core.Log.debug
import androidx.camera.camera2.pipe.core.Log.info
import androidx.camera.camera2.pipe.integration.impl.Camera2ImplConfig
@@ -47,6 +48,7 @@
* and aspect ratios for the display.
*/
@Suppress("DEPRECATION")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraUseCaseAdapter(context: Context) : UseCaseConfigFactory {
private val display: Display by lazy {
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.kt
index bc91e43..4321fec 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureConfigAdapter.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.integration.adapter
import android.hardware.camera2.CaptureRequest
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.Request
import androidx.camera.camera2.pipe.RequestTemplate
import androidx.camera.camera2.pipe.StreamId
@@ -33,6 +34,7 @@
* Maps a [CaptureConfig] issued by CameraX (e.g. by the image capture use case) to a [Request]
* that CameraPipe can submit to the camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CaptureConfigAdapter(
private val surfaceToStreamMap: Map<DeferrableSurface, StreamId>,
private val callbackExecutor: Executor,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureResultAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureResultAdapter.kt
index ba3e9cb..81b6bc3 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureResultAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CaptureResultAdapter.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.integration.adapter
import android.hardware.camera2.CaptureResult
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameNumber
@@ -34,6 +35,7 @@
/**
* Adapts the [CameraCaptureResult] interface to [CameraPipe].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CaptureResultAdapter(
private val requestMetadata: RequestMetadata,
private val frameNumber: FrameNumber,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt
index 289eb87..1e31588 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/CoroutineAdapters.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.adapter
+import androidx.annotation.RequiresApi
import androidx.concurrent.futures.CallbackToFutureAdapter
import com.google.common.util.concurrent.ListenableFuture
import kotlinx.coroutines.Deferred
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EvCompValue.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EvCompValue.kt
index f8eb767..ef218f0 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EvCompValue.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/EvCompValue.kt
@@ -19,12 +19,14 @@
import android.annotation.SuppressLint
import android.util.Range
import android.util.Rational
+import androidx.annotation.RequiresApi
import androidx.camera.core.ExposureState
/**
* Immutable adaptor to the ExposureState interface.
*/
@SuppressLint("UnsafeOptInUsageError")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
data class EvCompValue(
private val supported: Boolean,
private val index: Int,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ExposureStateAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ExposureStateAdapter.kt
index 487b34b..f3f6540 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ExposureStateAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ExposureStateAdapter.kt
@@ -14,12 +14,15 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.adapter
import android.annotation.SuppressLint
import android.hardware.camera2.CameraCharacteristics
import android.util.Range
import android.util.Rational
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.integration.impl.CameraProperties
import androidx.camera.core.ExposureState
@@ -28,6 +31,7 @@
/** Adapt [ExposureState] to a [CameraMetadata] instance. */
@SuppressLint("UnsafeOptInUsageError")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ExposureStateAdapter(
private val cameraProperties: CameraProperties,
private val exposureCompensation: Int
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt
index edde092..5f9cc21 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/SessionConfigAdapter.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.adapter
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.StreamId
import androidx.camera.camera2.pipe.core.Log.debug
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt
index d5b98df..5cc5969 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/adapter/ZoomValue.kt
@@ -16,11 +16,13 @@
package androidx.camera.camera2.pipe.integration.adapter
+import androidx.annotation.RequiresApi
import androidx.camera.core.ZoomState
/**
* Immutable adaptor to the ZoomState interface.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
data class ZoomValue(
private val zoomRatio: Float,
private val minZoomRatio: Float,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt
index 1dc95c2..fe723ce 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/Camera2CameraControlCompat.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.compat
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameNumber
import androidx.camera.camera2.pipe.Request
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt
index 806eadd..452bc8e 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/EvCompCompat.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.compat
import android.hardware.camera2.CameraCharacteristics.CONTROL_AE_COMPENSATION_RANGE
@@ -22,6 +24,7 @@
import android.hardware.camera2.CaptureResult
import android.util.Range
import android.util.Rational
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameNumber
import androidx.camera.camera2.pipe.Request
@@ -65,6 +68,7 @@
* to the camera, and wait for the exposure value of the camera reach to the new target.
* It receives the [FrameInfo] via the [ComboRequestListener] to monitor the capture result.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class EvCompImpl @Inject constructor(
private val cameraProperties: CameraProperties,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt
index f3bbd81..38d92ef 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/compat/ZoomCompat.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.compat
import android.graphics.Rect
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt
index 7e74713..9f47f49 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraAppConfig.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.config
import android.content.Context
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.core.impl.CameraThreadConfig
import androidx.camera.core.impl.CameraFactory
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt
index 8ea050a..409202f 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.config
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.CameraPipe
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/UseCaseCameraConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/UseCaseCameraConfig.kt
index c3e4917..88e488d 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/UseCaseCameraConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/UseCaseCameraConfig.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.config
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.integration.impl.UseCaseCamera
import androidx.camera.camera2.pipe.integration.impl.UseCaseCameraImpl
import androidx.camera.core.UseCase
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Camera2ImplConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Camera2ImplConfig.kt
index 4a54a38..1c091d8 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Camera2ImplConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Camera2ImplConfig.kt
@@ -13,12 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraCaptureSession.CaptureCallback
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CaptureRequest
+import androidx.annotation.RequiresApi
import androidx.annotation.RestrictTo
import androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions
import androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions.Builder.Companion.from
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt
index 1619e7f..af35e8f 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraCallbackMap.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.integration.impl
import android.hardware.camera2.CaptureFailure
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameNumber
import androidx.camera.camera2.pipe.Request
@@ -31,6 +32,7 @@
/**
* A map of [CameraCaptureCallback] that are invoked on each [Request].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class CameraCallbackMap @Inject constructor() : Request.Listener {
private val callbackMap = mutableMapOf<CameraCaptureCallback, Executor>()
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraProperties.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraProperties.kt
index 4e0a8d0..72d8538 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraProperties.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/CameraProperties.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.CameraPipe
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ComboRequestListener.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ComboRequestListener.kt
index cc0eeae..73ad4aa 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ComboRequestListener.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ComboRequestListener.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.integration.impl
import android.hardware.camera2.CaptureFailure
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraTimestamp
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameMetadata
@@ -33,6 +34,7 @@
* The primary purpose of this class is to receive the capture result from the currently
* configured [UseCaseCamera] and propagate to the registered [Request.Listener]s.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class ComboRequestListener @Inject constructor() : Request.Listener {
private val requestListeners = mutableMapOf<Request.Listener, Executor>()
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt
index 7d4e9d2..2515500c 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/EvCompControl.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.integration.adapter.EvCompValue
import androidx.camera.camera2.pipe.integration.compat.EvCompCompat
import androidx.camera.camera2.pipe.integration.config.CameraScope
@@ -38,6 +41,7 @@
* The task will fail with [CameraControl.OperationCanceledException] if the camera is
* closed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class EvCompControl @Inject constructor(
private val compat: EvCompCompat,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
index 235c103..df4ec26 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/FocusMeteringControl.kt
@@ -22,6 +22,7 @@
import android.hardware.camera2.CaptureResult
import android.hardware.camera2.params.MeteringRectangle
import android.util.Rational
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.Result3A
import androidx.camera.core.FocusMeteringAction
import androidx.camera.core.FocusMeteringResult
@@ -36,6 +37,7 @@
/**
* Implementation of focus and metering controls exposed by [CameraControlInternal].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class FocusMeteringControl(
val cameraProperties: CameraProperties,
val useCaseManager: UseCaseManager,
@@ -87,6 +89,7 @@
return FocusMeteringResult.create(isFocusSuccessful)
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
companion object {
const val METERING_WEIGHT_DEFAULT = MeteringRectangle.METERING_WEIGHT_MAX
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt
index a8c5afe..1c09b6f 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/MeteringRepeating.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
import android.graphics.ImageFormat
@@ -23,6 +25,7 @@
import android.os.Build
import android.util.Size
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.core.Log.error
import androidx.camera.camera2.pipe.integration.adapter.CameraUseCaseAdapter
import androidx.camera.core.CameraSelector
@@ -39,7 +42,6 @@
import androidx.camera.core.impl.UseCaseConfig.OPTION_SESSION_CONFIG_UNPACKER
import androidx.camera.core.impl.UseCaseConfigFactory
import androidx.camera.core.impl.utils.executor.CameraXExecutors
-import androidx.core.util.Consumer
private val DEFAULT_PREVIEW_SIZE = Size(0, 0)
@@ -48,6 +50,7 @@
* enabled, since taking a picture may require a repeating surface to perform pre-capture checks,
* mainly around 3A.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class MeteringRepeating(
private val cameraProperties: CameraProperties,
config: MeteringRepeatingConfig,
@@ -170,10 +173,6 @@
override fun setCameraSelector(cameraSelector: CameraSelector) = this
- override fun setAttachedUseCasesUpdateListener(
- attachedUseCasesUpdateListener: Consumer<MutableCollection<UseCase>>
- ): Builder = this
-
override fun build(): MeteringRepeating {
return MeteringRepeating(cameraProperties, useCaseConfig)
}
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Sizes.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Sizes.kt
index aecf6ab..929c199 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Sizes.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Sizes.kt
@@ -14,10 +14,13 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
import android.graphics.Point
import android.util.Size
+import androidx.annotation.RequiresApi
fun Size.area(): Int = this.width * this.height
fun Size.asLandscape(): Size =
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Tags.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Tags.kt
index 75a1976..3fc3457 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Tags.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/Tags.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.Metadata
import androidx.camera.core.impl.TagBundle
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
index 71ef757..d71787b 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCamera.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CaptureRequest
import android.hardware.camera2.params.MeteringRectangle
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.CameraStream
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraControl.kt
index 7d1419d..260b7d7 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraControl.kt
@@ -16,6 +16,9 @@
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
+
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface UseCaseCameraControl {
var useCaseCamera: UseCaseCamera?
fun reset()
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraRequestControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraRequestControl.kt
index b894b00..2def3c5 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraRequestControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraRequestControl.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.integration.impl
import android.hardware.camera2.CaptureRequest
import android.hardware.camera2.params.MeteringRectangle
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.Lock3ABehavior
import androidx.camera.camera2.pipe.Request
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt
index 3defc30..b33309b 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseCameraState.kt
@@ -20,6 +20,7 @@
import android.hardware.camera2.CaptureRequest
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.Metadata
import androidx.camera.camera2.pipe.Request
@@ -42,6 +43,7 @@
* of primitive rate limiting that ensures that updates arriving too quickly are only sent to the
* underlying camera graph as fast as the camera is capable of consuming them.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@UseCaseCameraScope
class UseCaseCameraState @Inject constructor(
private val cameraGraph: CameraGraph,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
index 41a0cd4..9f30436 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseManager.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.core.Log
import androidx.camera.camera2.pipe.integration.config.CameraConfig
import androidx.camera.camera2.pipe.integration.config.CameraScope
@@ -28,6 +29,7 @@
/**
* This class keeps track of the currently attached and active [UseCase]'s for a specific camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class UseCaseManager @Inject constructor(
private val cameraConfig: CameraConfig,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseThreads.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseThreads.kt
index 47c5bd2..3233279 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseThreads.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/UseCaseThreads.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
import androidx.camera.core.impl.utils.executor.CameraXExecutors
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
@@ -26,6 +27,7 @@
/**
* Collection of threads and scope(s) that have been configured and tuned.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class UseCaseThreads(
val scope: CoroutineScope,
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt
index 523bb61..7a9a5be 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/impl/ZoomControl.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.integration.impl
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.integration.compat.ZoomCompat
import androidx.camera.camera2.pipe.integration.config.CameraScope
import dagger.Binds
@@ -23,6 +24,7 @@
import dagger.multibindings.IntoSet
import javax.inject.Inject
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
class ZoomControl @Inject constructor(private val zoomCompat: ZoomCompat) : UseCaseCameraControl {
private var _zoomRatio = 1.0f
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
index f4d05a4..af52eda 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.integration.interop
+import androidx.annotation.RequiresApi
import androidx.annotation.RestrictTo
import androidx.annotation.VisibleForTesting
import androidx.camera.camera2.pipe.integration.adapter.CameraControlAdapter
@@ -46,6 +47,7 @@
* CameraX internally. The options from Camera2CameraControl will override, which may result in
* unexpected behavior depends on the options being applied.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraScope
@ExperimentalCamera2Interop
class Camera2CameraControl @Inject constructor(
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt
index f610738..7bdcd1d 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt
@@ -20,6 +20,7 @@
import android.hardware.camera2.CameraCaptureSession.CaptureCallback
import android.hardware.camera2.CameraDevice
import android.hardware.camera2.CaptureRequest
+import androidx.annotation.RequiresApi
import androidx.annotation.RestrictTo
import androidx.camera.camera2.pipe.integration.impl.DEVICE_STATE_CALLBACK_OPTION
import androidx.camera.camera2.pipe.integration.impl.SESSION_CAPTURE_CALLBACK_OPTION
@@ -34,6 +35,7 @@
*
* @constructor Private constructor to ensure this class isn't instantiated.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@ExperimentalCamera2Interop
class Camera2Interop private constructor() {
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt
index 3ab2235..071ba05 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.integration.interop
import android.hardware.camera2.CaptureRequest
+import androidx.annotation.RequiresApi
import androidx.annotation.RestrictTo
import androidx.camera.camera2.pipe.integration.impl.CAPTURE_REQUEST_ID_STEM
import androidx.camera.camera2.pipe.integration.impl.createCaptureRequestOption
@@ -33,6 +34,7 @@
* @constructor Creates a CaptureRequestOptions for reading Camera2 capture request options from the
* given config.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@ExperimentalCamera2Interop
open class CaptureRequestOptions(private val config: Config) : ReadableConfig {
diff --git a/camera/camera-camera2-pipe-testing/build.gradle b/camera/camera-camera2-pipe-testing/build.gradle
index 189f0a1..14e0bff 100644
--- a/camera/camera-camera2-pipe-testing/build.gradle
+++ b/camera/camera-camera2-pipe-testing/build.gradle
@@ -45,10 +45,6 @@
}
android {
- defaultConfig {
- minSdkVersion 21
- }
-
// Use Robolectric 4.+
testOptions.unitTests.includeAndroidResources = true
}
diff --git a/camera/camera-camera2-pipe-testing/lint.xml b/camera/camera-camera2-pipe-testing/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-camera2-pipe-testing/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt
index c520358..a6b2a04 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/CameraGraphSimulator.kt
@@ -18,6 +18,7 @@
import android.hardware.camera2.CaptureFailure
import android.hardware.camera2.CaptureResult
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
@@ -32,6 +33,7 @@
import kotlinx.coroutines.withTimeout
/** Simulator for observing and responding to interactions with the a [CameraGraph]. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraGraphSimulator(
private val config: CameraGraph.Config,
cameraMetadata: CameraMetadata
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraDevices.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraDevices.kt
index 2359af4..6304170 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraDevices.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeCameraDevices.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.testing
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraDevices
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
@@ -24,6 +25,7 @@
/**
* This provides a fake implementation of [CameraDevices] for tests with a fixed list of Cameras.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class FakeCameraDevices(
private val cameras: List<CameraMetadata>
) : CameraDevices {
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt
index bbcb196..acd475c7 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeMetadata.kt
@@ -15,6 +15,7 @@
*/
@file:Suppress("UNCHECKED_CAST")
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.camera2.pipe.testing
@@ -23,6 +24,7 @@
import android.hardware.camera2.CaptureResult
import android.hardware.camera2.TotalCaptureResult
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.FrameInfo
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestListener.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestListener.kt
index ea1e43b..a3ca0db 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestListener.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestListener.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.testing
import android.hardware.camera2.CaptureFailure
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraTimestamp
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameMetadata
diff --git a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestProcessor.kt b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestProcessor.kt
index e7d0ec0..190d8c0 100644
--- a/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestProcessor.kt
+++ b/camera/camera-camera2-pipe-testing/src/main/java/androidx/camera/camera2/pipe/testing/FakeRequestProcessor.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.testing
import android.hardware.camera2.CaptureRequest
import android.view.Surface
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameNumber
import androidx.camera.camera2.pipe.Metadata
import androidx.camera.camera2.pipe.Request
diff --git a/camera/camera-camera2-pipe/build.gradle b/camera/camera-camera2-pipe/build.gradle
index 1c78717..af4e291 100644
--- a/camera/camera-camera2-pipe/build.gradle
+++ b/camera/camera-camera2-pipe/build.gradle
@@ -56,10 +56,6 @@
}
android {
- defaultConfig {
- minSdkVersion 21
- }
-
// Use Robolectric 4.+
testOptions.unitTests.includeAndroidResources = true
}
diff --git a/camera/camera-camera2-pipe/lint.xml b/camera/camera-camera2-pipe/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-camera2-pipe/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt b/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt
index d94a766..0dd3433 100644
--- a/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt
+++ b/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/CameraPipeInstrumentationTest.kt
@@ -18,11 +18,13 @@
import androidx.test.filters.SmallTest
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import org.junit.Test
import org.junit.runner.RunWith
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class CameraPipeInstrumentationTest {
@Test fun test() {}
}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/impl/TokenLockInstrumentationTest.kt b/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/impl/TokenLockInstrumentationTest.kt
index dd045e9..54157cf 100644
--- a/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/impl/TokenLockInstrumentationTest.kt
+++ b/camera/camera-camera2-pipe/src/androidTest/java/androidx/camera/camera2/pipe/impl/TokenLockInstrumentationTest.kt
@@ -21,6 +21,7 @@
import androidx.camera.camera2.pipe.core.acquireOrNull
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
@@ -31,6 +32,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class TokenLockInstrumentationTest {
@Test
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt
index 168ca3146..bc8e182 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraControls.kt
@@ -14,11 +14,15 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe
import android.hardware.camera2.CameraMetadata
import android.hardware.camera2.CaptureResult
import android.hardware.camera2.TotalCaptureResult
+import androidx.annotation.RequiresApi
+import androidx.camera.camera2.pipe.Result3A.Status
// Public controls and enums used to interact with a CameraGraph.
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt
index 3bb50f9..c45f0d4 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraDevices.kt
@@ -15,9 +15,11 @@
*/
@file:Suppress("NOTHING_TO_INLINE")
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.camera2.pipe
+import androidx.annotation.RequiresApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt
index 25ce46b..aefa1c2c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraGraph.kt
@@ -23,6 +23,7 @@
import android.hardware.camera2.params.SessionConfiguration
import android.hardware.camera2.params.MeteringRectangle
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph.Constants3A.DEFAULT_FRAME_LIMIT
import androidx.camera.camera2.pipe.CameraGraph.Constants3A.DEFAULT_TIME_LIMIT_NS
import kotlinx.coroutines.Deferred
@@ -31,6 +32,7 @@
/**
* A [CameraGraph] represents the combined configuration and state of a camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraGraph : Closeable {
public val streams: StreamGraph
@@ -122,6 +124,7 @@
HIGH_SPEED,
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public object Constants3A {
// Constants related to controlling the time or frame budget a 3A operation should get.
public const val DEFAULT_FRAME_LIMIT: Int = 60
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt
index 0e808b35..90d1e10e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraMetadata.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe
import android.hardware.camera2.CameraCharacteristics
import android.hardware.camera2.CaptureRequest
import android.hardware.camera2.CaptureResult
+import androidx.annotation.RequiresApi
/**
* [CameraMetadata] is a compatibility wrapper around [CameraCharacteristics].
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
index fc80a80..94e522c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/CameraPipe.kt
@@ -14,10 +14,13 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe
import android.content.Context
import android.os.HandlerThread
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.config.CameraGraphConfigModule
import androidx.camera.camera2.pipe.config.CameraPipeComponent
import androidx.camera.camera2.pipe.config.CameraPipeConfigModule
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt
index 71132fe..7099325 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Metadata.kt
@@ -14,12 +14,15 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe
import android.hardware.camera2.CaptureRequest
import android.hardware.camera2.CaptureResult
import android.hardware.camera2.TotalCaptureResult
import android.view.Surface
+import androidx.annotation.RequiresApi
/**
* A map-like interface used to describe or interact with metadata from CameraPipe and Camera2.
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt
index 5a2c84b..901f005 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Request.kt
@@ -14,12 +14,15 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe
import android.hardware.camera2.CaptureFailure
import android.hardware.camera2.CaptureRequest
import android.hardware.camera2.CameraCaptureSession
import android.hardware.camera2.CameraDevice
+import androidx.annotation.RequiresApi
/**
* A [Request] is an immutable package of outputs and parameters needed to issue a [CaptureRequest]
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/RequestProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/RequestProcessor.kt
index fb4328f..d0b3373 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/RequestProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/RequestProcessor.kt
@@ -16,6 +16,8 @@
package androidx.camera.camera2.pipe
+import androidx.annotation.RequiresApi
+
/**
* An instance of a [RequestProcessor] exists for the duration of a CameraCaptureSession and must be
* created for each new CameraCaptureSession. It is responsible for low level interactions with the
@@ -32,6 +34,7 @@
* - Callbacks are expected to be invoked at *very* high frequency.
* - One RequestProcessor instance per CameraCaptureSession
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface RequestProcessor {
/**
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt
index 367593c..9d8ae50 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamFormat.kt
@@ -16,6 +16,8 @@
package androidx.camera.camera2.pipe
+import androidx.annotation.RequiresApi
+
/**
* Platform-independent Android ImageFormats and their associated values.
*
@@ -24,6 +26,7 @@
* // TODO: Consider adding data-space as a separate property, or finding a way to work it in.
*/
@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public inline class StreamFormat(public val value: Int) {
public companion object {
public val UNKNOWN: StreamFormat = StreamFormat(0)
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt
index a161543..ba5c707 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/StreamGraph.kt
@@ -16,11 +16,14 @@
package androidx.camera.camera2.pipe
+import androidx.annotation.RequiresApi
+
/**
* This defines a fixed set of inputs and outputs for a single [CameraGraph] instance.
*
* [CameraStream]s can be used to build [Request]s that are sent to a [CameraGraph].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface StreamGraph {
public val streams: List<CameraStream>
public val input: InputStream?
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt
index c55acf7..19ef4a3 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/Streams.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe
import android.hardware.camera2.params.OutputConfiguration
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt
index 1c2f566..4218951 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/UnsafeWrapper.kt
@@ -16,12 +16,15 @@
package androidx.camera.camera2.pipe
+import androidx.annotation.RequiresApi
+
/**
* This interface indicates that an object or interface wraps a specific Android object or type and
* provides a way to retrieve the underlying object directly. Accessing the underlying objects can
* be useful for compatibility and testing, but it is extremely risky if the lifetime of the object
* is managed by Camera Pipe and the wrapped object is closed, released, or altered.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface UnsafeWrapper<T> {
public fun unwrap(): T?
}
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
index 6549897..dd945db 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.compat
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.config.CameraGraphScope
import androidx.camera.camera2.pipe.config.ForCameraGraph
@@ -34,6 +35,7 @@
*
* TODO: Reorganize these constructor parameters.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraGraphScope
internal class Camera2CameraController @Inject constructor(
@ForCameraGraph private val scope: CoroutineScope,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraDevices.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraDevices.kt
index ccc2000..20104e7 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraDevices.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraDevices.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.compat
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraDevices
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
@@ -26,6 +27,7 @@
/**
* Provides utilities for querying cameras and accessing metadata about those cameras.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Singleton
internal class Camera2CameraDevices @Inject constructor(
private val deviceCache: Camera2DeviceCache,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
index 65c994d..a8514f3 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraMetadata.kt
@@ -22,6 +22,7 @@
import android.os.Build
import android.util.ArrayMap
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.Metadata
@@ -32,6 +33,7 @@
* that are either expensive to create and access, or that only exist on newer versions of the
* OS. This allows all fields to be accessed and return reasonable values on all OS versions.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class Camera2CameraMetadata constructor(
override val camera: CameraId,
override val isRedacted: Boolean,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
index 3a29034..b2e4c52 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CaptureSequence.kt
@@ -22,6 +22,7 @@
import android.hardware.camera2.CaptureResult
import android.hardware.camera2.TotalCaptureResult
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraTimestamp
import androidx.camera.camera2.pipe.FrameNumber
@@ -35,6 +36,7 @@
* a [CaptureRequest] object to lookup and invoke per-request listeners so that a listener can be
* defined on a specific request within a burst.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class Camera2CaptureSequence(
private val internalListeners: List<Request.Listener>,
private val requests: Map<RequestNumber, RequestInfo>,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt
index e805aba..7c024ca 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2DeviceCache.kt
@@ -19,6 +19,7 @@
import android.hardware.camera2.CameraAccessException
import android.hardware.camera2.CameraManager
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.core.Debug
import androidx.camera.camera2.pipe.core.Log
@@ -28,6 +29,7 @@
import javax.inject.Provider
import javax.inject.Singleton
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Singleton
internal class Camera2DeviceCache @Inject constructor(
private val cameraManager: Provider<CameraManager>,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
index 97e475e..0b9efe9 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2MetadataCache.kt
@@ -20,6 +20,7 @@
import android.hardware.camera2.CameraManager
import android.util.ArrayMap
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.core.Debug
@@ -39,6 +40,7 @@
* This class is designed to be thread safe and provides suspend functions for querying and
* accessing CameraMetadata.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Singleton
internal class Camera2MetadataCache @Inject constructor(
private val context: Context,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2RequestProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2RequestProcessor.kt
index 1874d54..8906736 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2RequestProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2RequestProcessor.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CameraAccessException
@@ -21,6 +23,7 @@
import android.util.ArrayMap
import android.view.Surface
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.Metadata
import androidx.camera.camera2.pipe.Request
@@ -71,6 +74,7 @@
/**
* This class is designed to synchronously handle interactions with a [CameraCaptureSessionWrapper].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class Camera2RequestProcessor(
private val session: CameraCaptureSessionWrapper,
private val threads: Threads,
@@ -363,6 +367,7 @@
/**
* This class packages together information about a request that was submitted to the camera.
*/
+@RequiresApi(21)
@Suppress("SyntheticAccessor") // Using an inline class generates a synthetic constructor
internal class RequestInfo(
private val captureRequest: CaptureRequest,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2StreamGraph.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2StreamGraph.kt
index 5e4dc4a..98ccd0c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2StreamGraph.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2StreamGraph.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL
@@ -24,6 +26,7 @@
import android.os.Build
import android.util.Size
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraController.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraController.kt
index 0bf3a66..ac448851 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraController.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraController.kt
@@ -16,8 +16,10 @@
package androidx.camera.camera2.pipe.compat
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.RequestProcessor
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal interface CameraController {
/**
* Tell the graph to start and initialize a [RequestProcessor] instances.
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
index 0eed94e..9d39f9a 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraDeviceWrapper.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CameraDevice
@@ -120,6 +122,7 @@
}
}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class AndroidCameraDevice(
private val cameraMetadata: CameraMetadata,
private val cameraDevice: CameraDevice,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraMetadataProvider.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraMetadataProvider.kt
index d5f84a0..99ab1f45 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraMetadataProvider.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CameraMetadataProvider.kt
@@ -16,12 +16,14 @@
package androidx.camera.camera2.pipe.compat
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
/**
* Interface that can be used to query for [CameraMetadata] using an existing [CameraId].
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface CameraMetadataProvider {
/**
* Attempt to retrieve [CameraMetadata], suspending the caller if it is not yet available.
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
index b5def51..9c0a430 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.annotation.SuppressLint
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
index cab2111..5fe234f 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionWrapper.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CameraCaptureSession
@@ -173,6 +175,7 @@
fun createHighSpeedRequestList(request: CaptureRequest): List<CaptureRequest>
}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class AndroidCaptureSessionStateCallback(
private val device: CameraDeviceWrapper,
private val stateCallback: CameraCaptureSessionWrapper.StateCallback
@@ -231,6 +234,7 @@
}
}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal open class AndroidCameraCaptureSession(
override val device: CameraDeviceWrapper,
private val cameraCaptureSession: CameraCaptureSession
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt
index 2b533ea..82b5424 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Configuration.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.graphics.SurfaceTexture
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt
index bb8a2fb2..df8cf94 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Exceptions.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CameraAccessException
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.core.Log
import kotlin.jvm.Throws
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/FrameMetadata.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/FrameMetadata.kt
index 0de6fce..0a13bd1 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/FrameMetadata.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/FrameMetadata.kt
@@ -14,12 +14,15 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CaptureResult
import android.hardware.camera2.TotalCaptureResult
import android.os.Build
import android.util.ArrayMap
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameMetadata
@@ -31,6 +34,7 @@
* An implementation of [FrameMetadata] that retrieves values from a [CaptureResult] object
*/
@Suppress("SyntheticAccessor") // Using an inline class generates a synthetic constructor
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class AndroidFrameMetadata constructor(
private val captureResult: CaptureResult,
override val camera: CameraId
@@ -86,6 +90,7 @@
* An implementation of [FrameInfo] that retrieves values from a [TotalCaptureResult] object.
*/
@Suppress("SyntheticAccessor") // Using an inline class generates a synthetic constructor
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class AndroidFrameInfo(
private val totalCaptureResult: TotalCaptureResult,
override val camera: CameraId,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt
index 34b529a..5d5a0c0 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCamera.kt
@@ -15,11 +15,13 @@
*/
@file:Suppress("EXPERIMENTAL_API_USAGE")
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.camera2.pipe.compat
import android.hardware.camera2.CameraDevice
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.core.Debug
@@ -162,6 +164,7 @@
internal val androidCameraDebugIds = atomic(0)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class AndroidCameraState(
val cameraId: CameraId,
val metadata: CameraMetadata,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
index 206a86d..b4ce24e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualCameraManager.kt
@@ -14,11 +14,14 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.annotation.SuppressLint
import android.hardware.camera2.CameraManager
import android.os.Build
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraId
import androidx.camera.camera2.pipe.core.Debug
import androidx.camera.camera2.pipe.core.Log
@@ -57,6 +60,7 @@
private const val requestQueueDepth = 8
@Suppress("EXPERIMENTAL_API_USAGE")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Singleton
internal class VirtualCameraManager @Inject constructor(
private val cameraManager: Provider<CameraManager>,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt
index 2caa929..fa32010 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt
@@ -14,10 +14,13 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.compat
import android.view.Surface
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.RequestProcessor
import androidx.camera.camera2.pipe.StreamId
import androidx.camera.camera2.pipe.core.Debug
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt
index 4b88ba2..a7b0d75 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraGraphComponent.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.config
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.Request
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
index afcd5fa..6ad0f30 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/CameraPipeComponent.kt
@@ -14,10 +14,13 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.config
import android.content.Context
import android.hardware.camera2.CameraManager
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraDevices
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.compat.Camera2CameraDevices
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt
index 3a5dd6b..daec60e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraGraphComponent.kt
@@ -14,8 +14,11 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.config
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.RequestProcessor
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt
index e10ae41..57417e3 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ExternalCameraPipeComponent.kt
@@ -16,9 +16,11 @@
package androidx.camera.camera2.pipe.config
+import androidx.annotation.RequiresApi
import dagger.Component
import javax.inject.Singleton
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Singleton
@Component(
modules = [
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt
index 63774152..989ad8b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/config/ThreadConfigModule.kt
@@ -19,6 +19,7 @@
import android.os.Handler
import android.os.HandlerThread
import android.os.Process
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraPipe
import androidx.camera.camera2.pipe.core.Threads
import dagger.Module
@@ -33,6 +34,7 @@
/**
* Configure and provide a single [Threads] object to other parts of the library.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Module
internal class ThreadConfigModule(private val threadConfig: CameraPipe.ThreadConfig) {
@Singleton
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt
index 6852aa6..497a70e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Debug.kt
@@ -15,6 +15,7 @@
*/
@file:Suppress("NOTHING_TO_INLINE")
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.camera2.pipe.core
@@ -25,12 +26,14 @@
import android.hardware.camera2.CaptureRequest
import android.os.Build
import android.os.Trace
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraMetadata
/**
* Internal debug utilities, constants, and checks.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public object Debug {
public const val ENABLE_LOGGING: Boolean = true
public const val ENABLE_TRACING: Boolean = true
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt
index a024de2..09d3ad1 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Log.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.core
import android.util.Log
+import androidx.annotation.RequiresApi
/**
* This object provides a set of common log functions that are optimized for CameraPipe with
@@ -27,6 +28,7 @@
*
* Log.debug { "This is a log message with a $value" }
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public object Log {
public const val TAG: String = "CXCP"
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
index ad4162c..81d1205 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Permissions.kt
@@ -31,6 +31,7 @@
* This class assumes that permissions are one way - They can be granted, but not un-granted
* without restarting the application process.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Singleton
internal class Permissions @Inject constructor(private val context: Context) {
@Volatile
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Threads.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Threads.kt
index fe2b848..30f5247 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Threads.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Threads.kt
@@ -17,10 +17,12 @@
package androidx.camera.camera2.pipe.core
import android.os.Handler
+import androidx.annotation.RequiresApi
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import java.util.concurrent.Executor
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class Threads(
val globalScope: CoroutineScope,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt
index 5b06ccc..916c74d 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Timestamps.kt
@@ -15,10 +15,12 @@
*/
@file:Suppress("NOTHING_TO_INLINE")
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.camera2.pipe.core
import android.os.SystemClock
+import androidx.annotation.RequiresApi
/**
* A nanosecond timestamp
@@ -44,6 +46,7 @@
TimestampNs(value + other.value)
}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public object Timestamps {
public inline fun now(): TimestampNs = TimestampNs(SystemClock.elapsedRealtimeNanos())
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Token.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Token.kt
index ccfaf92..aad27df 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Token.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/Token.kt
@@ -16,9 +16,12 @@
package androidx.camera.camera2.pipe.core
+import androidx.annotation.RequiresApi
+
/**
* A token is used to track access to underlying resources. Implementations must be thread-safe.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal interface Token {
/**
* Release this token instance. Return true if this is the first time release has been called
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt
index 4fffeca..bda8e32 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/TokenLock.kt
@@ -15,10 +15,12 @@
*/
@file:Suppress("NOTHING_TO_INLINE")
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.camera2.pipe.core
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import kotlinx.coroutines.CancellableContinuation
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.suspendCancellableCoroutine
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt
index a4f9afb..b6e08bf 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/core/WakeLock.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.pipe.core
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import kotlinx.atomicfu.atomic
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
@@ -33,6 +34,7 @@
* OR acquire will return a token and the close method will not execute until after the token is
* released.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class WakeLock(
private val scope: CoroutineScope,
private val timeout: Long = 0,
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt
index 63a2315..7b289fd 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphImpl.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.graph
import android.view.Surface
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.CameraMetadata
import androidx.camera.camera2.pipe.StreamGraph
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt
index 8930a13..7af7a85 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/CameraGraphSessionImpl.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.graph
import android.hardware.camera2.params.MeteringRectangle
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.AeMode
import androidx.camera.camera2.pipe.AfMode
import androidx.camera.camera2.pipe.AwbMode
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt
index 47a94c0..9e44ba4 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Controller3A.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.graph
import android.hardware.camera2.CameraMetadata.CONTROL_AE_PRECAPTURE_TRIGGER_START
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphListener.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphListener.kt
index 9f3c425..c9fc66b 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphListener.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphListener.kt
@@ -16,8 +16,10 @@
package androidx.camera.camera2.pipe.graph
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.RequestProcessor
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface GraphListener {
/**
* Used to indicate that the graph has been initialized and is ready to actively process
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt
index 556eec8..5f01044 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphProcessor.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.graph
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.CameraGraph
import androidx.camera.camera2.pipe.Request
import androidx.camera.camera2.pipe.RequestProcessor
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphState3A.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphState3A.kt
index c32abf6..101070e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphState3A.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/GraphState3A.kt
@@ -18,6 +18,7 @@
import android.hardware.camera2.CaptureRequest
import android.hardware.camera2.params.MeteringRectangle
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.AeMode
import androidx.camera.camera2.pipe.AfMode
import androidx.camera.camera2.pipe.AwbMode
@@ -37,6 +38,7 @@
* the af state. However for ae and awb, the lock type is boolean and should be explicitly set to
* 'true' in the subsequent requests once we have locked ae/awb and want them to stay locked.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraGraphScope
internal class GraphState3A @Inject constructor() {
var aeMode: AeMode? = null
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Listener3A.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Listener3A.kt
index bc83033..988be7e 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Listener3A.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Listener3A.kt
@@ -16,6 +16,7 @@
package androidx.camera.camera2.pipe.graph
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameInfo
import androidx.camera.camera2.pipe.FrameMetadata
import androidx.camera.camera2.pipe.FrameNumber
@@ -32,6 +33,7 @@
* removes them as they are completed. This listener is useful for implementing 3A methods to
* look for desired 3A state changes.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@CameraGraphScope
internal class Listener3A @Inject constructor() : Request.Listener {
private val listeners: CopyOnWriteArrayList<Result3AStateListener> = CopyOnWriteArrayList()
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt
index 9641f64..2c8dd83 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/graph/Result3AStateListener.kt
@@ -14,10 +14,13 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.camera2.pipe.graph
import android.hardware.camera2.CaptureResult
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.camera2.pipe.FrameMetadata
import androidx.camera.camera2.pipe.FrameNumber
import androidx.camera.camera2.pipe.RequestNumber
diff --git a/camera/camera-camera2/api/current.txt b/camera/camera-camera2/api/current.txt
index 61b08cc..1459b2c 100644
--- a/camera/camera-camera2/api/current.txt
+++ b/camera/camera-camera2/api/current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.camera2 {
- public final class Camera2Config {
+ @RequiresApi(21) public final class Camera2Config {
method public static androidx.camera.core.CameraXConfig defaultConfig();
}
diff --git a/camera/camera-camera2/api/public_plus_experimental_current.txt b/camera/camera-camera2/api/public_plus_experimental_current.txt
index e66fe9e..290eb9c 100644
--- a/camera/camera-camera2/api/public_plus_experimental_current.txt
+++ b/camera/camera-camera2/api/public_plus_experimental_current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.camera2 {
- public final class Camera2Config {
+ @RequiresApi(21) public final class Camera2Config {
method public static androidx.camera.core.CameraXConfig defaultConfig();
}
@@ -9,23 +9,23 @@
package androidx.camera.camera2.interop {
- @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraControl {
+ @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraControl {
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> addCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
method public static androidx.camera.camera2.interop.Camera2CameraControl from(androidx.camera.core.CameraControl);
method public androidx.camera.camera2.interop.CaptureRequestOptions getCaptureRequestOptions();
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setCaptureRequestOptions(androidx.camera.camera2.interop.CaptureRequestOptions);
}
- @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+ @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
method public static androidx.camera.camera2.interop.Camera2CameraInfo from(androidx.camera.core.CameraInfo);
method public <T> T? getCameraCharacteristic(android.hardware.camera2.CameraCharacteristics.Key<T!>);
method public String getCameraId();
}
- @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+ @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public final class Camera2Interop {
}
- public static final class Camera2Interop.Extender<T> {
+ @RequiresApi(21) public static final class Camera2Interop.Extender<T> {
ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T!>);
method public <ValueT> androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>, ValueT);
method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback);
@@ -33,12 +33,12 @@
method public androidx.camera.camera2.interop.Camera2Interop.Extender<T!> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback);
}
- @androidx.camera.camera2.interop.ExperimentalCamera2Interop public class CaptureRequestOptions {
+ @RequiresApi(21) @androidx.camera.camera2.interop.ExperimentalCamera2Interop public class CaptureRequestOptions {
ctor public CaptureRequestOptions(androidx.camera.core.impl.Config);
method public <ValueT> ValueT? getCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>);
}
- public static final class CaptureRequestOptions.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.interop.CaptureRequestOptions> {
+ @RequiresApi(21) public static final class CaptureRequestOptions.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.interop.CaptureRequestOptions> {
ctor public CaptureRequestOptions.Builder();
method public androidx.camera.camera2.interop.CaptureRequestOptions build();
method public <ValueT> androidx.camera.camera2.interop.CaptureRequestOptions.Builder clearCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT!>);
diff --git a/camera/camera-camera2/api/restricted_current.txt b/camera/camera-camera2/api/restricted_current.txt
index 61b08cc..1459b2c 100644
--- a/camera/camera-camera2/api/restricted_current.txt
+++ b/camera/camera-camera2/api/restricted_current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.camera2 {
- public final class Camera2Config {
+ @RequiresApi(21) public final class Camera2Config {
method public static androidx.camera.core.CameraXConfig defaultConfig();
}
diff --git a/camera/camera-camera2/build.gradle b/camera/camera-camera2/build.gradle
index 5397f03..11c1c32 100644
--- a/camera/camera-camera2/build.gradle
+++ b/camera/camera-camera2/build.gradle
@@ -47,6 +47,7 @@
testImplementation("androidx.arch.core:core-testing:2.1.0")
testImplementation("org.apache.maven:maven-ant-tasks:2.1.3")
+ androidTestImplementation(libs.multidex)
androidTestImplementation(libs.testExtJunit)
androidTestImplementation(libs.testCore)
androidTestImplementation(libs.testRunner)
@@ -68,7 +69,7 @@
}
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
}
buildTypes.all {
diff --git a/camera/camera-camera2/lint.xml b/camera/camera-camera2/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-camera2/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-camera2/src/androidTest/AndroidManifest.xml b/camera/camera-camera2/src/androidTest/AndroidManifest.xml
index 4a5d228..103df6d 100644
--- a/camera/camera-camera2/src/androidTest/AndroidManifest.xml
+++ b/camera/camera-camera2/src/androidTest/AndroidManifest.xml
@@ -15,7 +15,9 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
package="androidx.camera.camera2.test">
+ <uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
index 87cc6f5..7e5e579 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/CameraControlDeviceTest.java
@@ -39,6 +39,7 @@
import androidx.camera.testing.CameraUtil;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import com.google.common.util.concurrent.ListenableFuture;
@@ -66,6 +67,7 @@
*/
@LargeTest
@RunWith(Parameterized.class)
+@SdkSuppress(minSdkVersion = 21)
public class CameraControlDeviceTest {
@Parameterized.Parameter(0)
public CameraSelector mCameraSelector;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
index 7ce5e54..22d7540 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/PreviewTest.java
@@ -59,6 +59,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
@@ -80,6 +81,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class PreviewTest {
@Rule
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
index d7a27a3..03d3ca3 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/SurfaceOrientedMeteringPointFactoryTest.java
@@ -34,6 +34,7 @@
import androidx.camera.core.internal.CameraUseCaseAdapter;
import androidx.camera.testing.CameraUtil;
import androidx.test.core.app.ApplicationProvider;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
@@ -44,6 +45,7 @@
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
+@SdkSuppress(minSdkVersion = 21)
public final class SurfaceOrientedMeteringPointFactoryTest {
private static final float WIDTH = 480;
private static final float HEIGHT = 640;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt
index 2238c85..d57509d 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTest.kt
@@ -67,6 +67,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class VideoCaptureTest {
public companion object {
@ClassRule
@@ -131,7 +132,7 @@
}
@Test
- @SdkSuppress(maxSdkVersion = 25)
+ @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 25)
public fun buildFileOutputOptionsWithFileDescriptor_throwExceptionWhenAPILevelSmallerThan26() {
val file = File.createTempFile("CameraX", ".tmp").apply {
deleteOnExit()
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt
index 67bd8b4..d606f2f 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/VideoCaptureTestWithoutAudioPermissionTest.kt
@@ -40,6 +40,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import androidx.test.rule.GrantPermissionRule
import com.google.common.truth.Truth.assertThat
@@ -58,6 +59,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class VideoCaptureTestWithoutAudioPermissionTest {
public companion object {
public const val TAG: String = "VideoCaptureTestWithoutAudioPermission"
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt
index 89eee13..b6949e6 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProviderTest.kt
@@ -25,6 +25,7 @@
import androidx.camera.core.CameraSelector
import androidx.camera.core.impl.ImageFormatConstants
import androidx.camera.testing.CameraUtil
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Assume.assumeTrue
@@ -36,6 +37,7 @@
@RunWith(Parameterized::class)
@SmallTest
@Suppress("DEPRECATION")
+@SdkSuppress(minSdkVersion = 21)
public class Camera2CamcorderProfileProviderTest(private val quality: Int) {
public companion object {
@JvmStatic
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraCaptureResultTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraCaptureResultTest.java
index cec3918..ac4dee9 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraCaptureResultTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraCaptureResultTest.java
@@ -36,6 +36,7 @@
import androidx.camera.core.impl.utils.ExifData;
import androidx.exifinterface.media.ExifInterface;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -47,6 +48,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2CameraCaptureResultTest {
private CaptureResult mCaptureResult;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
index f8d1a30..5c132c0 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraControlImplDeviceTest.java
@@ -103,6 +103,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2CameraControlImplDeviceTest {
@Rule
public TestRule mUseCamera = CameraUtil.grantCameraPermissionAndPreTest();
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.java
index fdfd9dc..ed5d6dd 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplCameraReopenTest.java
@@ -48,6 +48,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.After;
import org.junit.AfterClass;
@@ -67,6 +68,7 @@
/** Contains {@link Camera2CameraImpl} tests for reopening the camera with failures. */
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2CameraImplCameraReopenTest {
private static final int WAIT_FOR_CAMERA_OPEN_TIMEOUT_MS = 2_000;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplForceOpenCameraTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplForceOpenCameraTest.kt
index debe2f1..3c3cdf1 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplForceOpenCameraTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplForceOpenCameraTest.kt
@@ -62,6 +62,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class Camera2CameraImplForceOpenCameraTest {
@get:Rule
@@ -100,7 +101,7 @@
cameraXCameraOpen.await()
}
- @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.LOLLIPOP_MR1)
+ @SdkSuppress(minSdkVersion = 21, maxSdkVersion = Build.VERSION_CODES.LOLLIPOP_MR1)
@Test
public fun openCameraWhenAvailable_ifCameraCannotBeStolen() {
// Open the camera with Camera2
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt
index edf597d..d119e32 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplStateTest.kt
@@ -40,6 +40,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
@@ -60,6 +61,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
internal class Camera2CameraImplStateTest {
@get:Rule
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
index 192e5be..e57c7a6 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CameraImplTest.java
@@ -71,6 +71,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import com.google.common.util.concurrent.ListenableFuture;
@@ -104,6 +105,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2CameraImplTest {
@CameraSelector.LensFacing
private static final int DEFAULT_LENS_FACING = CameraSelector.LENS_FACING_BACK;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CaptureCallbacksTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CaptureCallbacksTest.java
index ad516cf..56be740 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CaptureCallbacksTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2CaptureCallbacksTest.java
@@ -29,6 +29,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -36,6 +37,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2CaptureCallbacksTest {
@Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
index 30a066d..f8f88e6 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2ImplCameraXTest.java
@@ -56,6 +56,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
@@ -82,6 +83,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
@OptIn(markerClass = ExperimentalCamera2Interop.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2ImplCameraXTest {
@CameraSelector.LensFacing
private static final int DEFAULT_LENS_FACING = CameraSelector.LENS_FACING_BACK;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2RequestProcessorTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2RequestProcessorTest.kt
index 589d223..df769ea 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2RequestProcessorTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/Camera2RequestProcessorTest.kt
@@ -42,6 +42,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CompletableDeferred
import kotlinx.coroutines.delay
@@ -65,6 +66,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class Camera2RequestProcessorTest {
@get:Rule
val cameraRule = CameraUtil.grantCameraPermissionAndPreTest()
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacksTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacksTest.java
index fdc6028..c684394 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacksTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacksTest.java
@@ -29,12 +29,14 @@
import androidx.camera.camera2.internal.CameraCaptureSessionStateCallbacks.NoOpSessionStateCallback;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CameraCaptureSessionStateCallbacksTest {
@Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacksTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacksTest.java
index 3663810..21d56e7 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacksTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacksTest.java
@@ -26,6 +26,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,6 +34,7 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CameraDeviceStateCallbacksTest {
@Test
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureCallbackContainerTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureCallbackContainerTest.java
index 897a52f..926c171 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureCallbackContainerTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureCallbackContainerTest.java
@@ -22,6 +22,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -29,6 +30,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CaptureCallbackContainerTest {
@Test(expected = NullPointerException.class)
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
index 8996aa1..1ba8b54 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/CaptureSessionTest.java
@@ -109,6 +109,7 @@
@SuppressWarnings("unchecked")
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CaptureSessionTest {
/** Thread for all asynchronous calls. */
private static HandlerThread sHandlerThread;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ExposureDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ExposureDeviceTest.java
index 9b2c906..d4caf95 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ExposureDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ExposureDeviceTest.java
@@ -65,6 +65,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.After;
import org.junit.AfterClass;
@@ -92,6 +93,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class ExposureDeviceTest {
@CameraSelector.LensFacing
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ProcessingCaptureSessionTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ProcessingCaptureSessionTest.kt
index 7a572be..c9b039c 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ProcessingCaptureSessionTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ProcessingCaptureSessionTest.kt
@@ -32,7 +32,6 @@
import android.os.SystemClock
import android.util.Size
import android.view.Surface
-import androidx.annotation.RequiresApi
import androidx.camera.camera2.internal.compat.CameraManagerCompat
import androidx.camera.camera2.internal.util.RequestProcessorRequest
import androidx.camera.camera2.interop.CaptureRequestOptions
@@ -59,6 +58,7 @@
import androidx.concurrent.futures.await
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.testutils.assertThrows
import com.google.common.truth.Truth.assertThat
import com.google.common.util.concurrent.ListenableFuture
@@ -96,7 +96,7 @@
*/
@LargeTest
@RunWith(Parameterized::class)
-@RequiresApi(23)
+@SdkSuppress(minSdkVersion = 23)
class ProcessingCaptureSessionTest(
private var lensFacing: Int,
// The pair specifies (Origin image format to Transformed format), SessionProcessor will
@@ -177,8 +177,13 @@
@After
fun tearDown() {
- CameraUtil.releaseCameraDevice(cameraDeviceHolder)
- sessionConfigParameters.tearDown()
+ if (::cameraDeviceHolder.isInitialized) {
+ CameraUtil.releaseCameraDevice(cameraDeviceHolder)
+ }
+
+ if (::sessionConfigParameters.isInitialized) {
+ sessionConfigParameters.tearDown()
+ }
}
private fun createProcessingCaptureSession(): ProcessingCaptureSession {
@@ -295,6 +300,9 @@
captureSessionOpenerBuilder.build()
).awaitWithTimeout(3000)
+ captureSession.sessionConfig =
+ sessionConfigParameters.getActiveSessionConfigForRepeating()
+
// Act
captureSession.issueCaptureRequests(
listOf(sessionConfigParameters.getStillCaptureCaptureConfig())
@@ -369,6 +377,8 @@
// Arrange
val cameraDevice = cameraDeviceHolder.get()!!
val captureSession = createProcessingCaptureSession()
+ captureSession.sessionConfig =
+ sessionConfigParameters.getActiveSessionConfigForRepeating()
// Act
captureSession.issueCaptureRequests(
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java
index eeac253..4bc572f 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/TorchControlDeviceTest.java
@@ -32,6 +32,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import com.google.common.util.concurrent.ListenableFuture;
@@ -49,6 +50,7 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class TorchControlDeviceTest {
@CameraSelector.LensFacing
private static final int LENS_FACING = CameraSelector.LENS_FACING_BACK;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
index 38a0e57..f077ce4 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/ZoomControlDeviceTest.java
@@ -56,6 +56,7 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import com.google.common.util.concurrent.ListenableFuture;
@@ -75,6 +76,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class ZoomControlDeviceTest {
private static final int TOLERANCE = 5;
private ZoomControl mZoomControl;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatDeviceTest.java
index 4bdb7d5..ea00cf9 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatDeviceTest.java
@@ -42,6 +42,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.After;
import org.junit.Assume;
@@ -63,6 +64,7 @@
*/
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CameraDeviceCompatDeviceTest {
private final Semaphore mOpenCloseSemaphore = new Semaphore(0);
@@ -154,7 +156,7 @@
@Test
@SuppressWarnings("deprecation") /* AsyncTask */
- public void canConfigureCaptureSession() throws CameraAccessException {
+ public void canConfigureCaptureSession() throws CameraAccessExceptionCompat {
OutputConfigurationCompat outputConfig = new OutputConfigurationCompat(mSurface);
CameraCaptureSession.StateCallback stateCallback =
@@ -169,7 +171,7 @@
mCompatHandler);
try {
deviceCompat.createCaptureSession(sessionConfig);
- } catch (CameraAccessException e) {
+ } catch (CameraAccessExceptionCompat e) {
// If the camera has been disconnected during the test (likely due to another process
// stealing the camera), then we will skip the test.
Assume.assumeTrue("Camera disconnected during test.",
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatDeviceTest.java
index bb107c7..329b798 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatDeviceTest.java
@@ -22,6 +22,7 @@
import android.view.Surface;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -36,6 +37,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class OutputConfigurationCompatDeviceTest {
private static final int DEFAULT_WIDTH = 1024;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt
index 29a2661..aa668d8 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainerDeviceTest.kt
@@ -46,6 +46,7 @@
import androidx.camera.testing.SurfaceTextureProvider
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
@@ -67,6 +68,7 @@
@LargeTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
class ExtraSupportedSurfaceCombinationsContainerDeviceTest(val cameraId: String) {
@get:Rule
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/RequestProcessorRequest.kt b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/RequestProcessorRequest.kt
index 752f40b..c6534fa 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/RequestProcessorRequest.kt
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/RequestProcessorRequest.kt
@@ -17,6 +17,7 @@
package androidx.camera.camera2.internal.util
import android.hardware.camera2.CameraDevice
+import androidx.annotation.RequiresApi
import androidx.camera.core.impl.Config
import androidx.camera.core.impl.OptionsBundle
import androidx.camera.core.impl.RequestProcessor
@@ -24,6 +25,7 @@
/**
* An implementation / builder for RequestProcessor.Request
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
internal class RequestProcessorRequest(
private val targetOutputConfigIds: List<Int>,
private val parameters: Config,
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/SemaphoreReleasingCamera2Callbacks.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/SemaphoreReleasingCamera2Callbacks.java
index 25858cf..478a005 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/SemaphoreReleasingCamera2Callbacks.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/internal/util/SemaphoreReleasingCamera2Callbacks.java
@@ -24,6 +24,7 @@
import android.hardware.camera2.TotalCaptureResult;
import android.view.Surface;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -35,6 +36,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY)
public final class SemaphoreReleasingCamera2Callbacks {
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java
index dd9ced0..c0714c8 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2CameraControlDeviceTest.java
@@ -49,6 +49,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import com.google.common.util.concurrent.ListenableFuture;
@@ -69,6 +70,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
@OptIn(markerClass = ExperimentalCamera2Interop.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2CameraControlDeviceTest {
private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
private CameraSelector mCameraSelector;
diff --git a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java
index 38c3594..923196d 100644
--- a/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java
+++ b/camera/camera-camera2/src/androidTest/java/androidx/camera/camera2/interop/Camera2InteropDeviceTest.java
@@ -47,6 +47,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
@@ -66,6 +67,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
@OptIn(markerClass = ExperimentalCamera2Interop.class)
+@SdkSuppress(minSdkVersion = 21)
public final class Camera2InteropDeviceTest {
private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
private CameraSelector mCameraSelector;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java
index 0df28bd..c3b5fef 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/Camera2Config.java
@@ -17,6 +17,7 @@
package androidx.camera.camera2;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.camera2.internal.Camera2CameraFactory;
import androidx.camera.camera2.internal.Camera2DeviceSurfaceManager;
@@ -31,6 +32,7 @@
/**
* Convenience class for generating a pre-populated Camera2 {@link CameraXConfig}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2Config {
private Camera2Config() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java
index d2684cb..7f884d0 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2CameraCaptureResultConverter.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.Camera2CameraCaptureFailure;
import androidx.camera.camera2.internal.Camera2CameraCaptureResult;
import androidx.camera.core.impl.CameraCaptureFailure;
@@ -28,6 +29,7 @@
/**
* An utility class to convert {@link CameraCaptureResult} to camera2 {@link CaptureResult}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CameraCaptureResultConverter {
/**
* Converts {@link CameraCaptureResult} to camera2 {@link CaptureResult}.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java
index dbe9b8e..2ada8a3 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/Camera2ImplConfig.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.camera2.interop.CaptureRequestOptions;
@@ -37,6 +38,7 @@
* Internal shared implementation details for camera 2 interop.
*/
@OptIn(markerClass = ExperimentalCamera2Interop.class)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2ImplConfig extends CaptureRequestOptions {
/** @hide */
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java
index 0ca0a09..f0269a3b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/impl/CameraEventCallback.java
@@ -19,11 +19,13 @@
import android.hardware.camera2.CameraCaptureSession;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CaptureConfig;
/**
* A callback object for tracking the camera capture session event and get request data.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class CameraEventCallback {
/**
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 7138786..d792ec7 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
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.impl.MultiValueSet;
@@ -28,6 +29,7 @@
/**
* Different implementations of {@link CameraEventCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraEventCallbacks extends MultiValueSet<CameraEventCallback> {
public CameraEventCallbacks(@NonNull CameraEventCallback... callbacks) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CamcorderProfileHelper.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CamcorderProfileHelper.java
index b17fe16..1e69d0b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CamcorderProfileHelper.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CamcorderProfileHelper.java
@@ -18,9 +18,12 @@
import android.media.CamcorderProfile;
+import androidx.annotation.RequiresApi;
+
/**
* This is helper class to use {@link android.media.CamcorderProfile} that may be mocked.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface CamcorderProfileHelper {
/** Returns true if the camcorder profile exists for the given camera and quality. */
boolean hasProfile(int cameraId, int quality);
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java
index f88e1dc..4ad7dd3 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CamcorderProfileProvider.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.camera2.internal.compat.quirk.CamcorderProfileResolutionQuirk;
import androidx.camera.camera2.internal.compat.quirk.CameraQuirks;
@@ -29,6 +30,7 @@
import androidx.camera.core.impl.CamcorderProfileProxy;
/** An implementation that provides the {@link CamcorderProfileProxy}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Camera2CamcorderProfileProvider implements CamcorderProfileProvider {
private static final String TAG = "Camera2CamcorderProfileProvider";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureFailure.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureFailure.java
index 224d558c..d98e7b5 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureFailure.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureFailure.java
@@ -19,9 +19,11 @@
import android.hardware.camera2.CaptureFailure;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureFailure;
/** The camera2 implementation for the capture failure */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CameraCaptureFailure extends CameraCaptureFailure {
private final CaptureFailure mCaptureFailure;
public Camera2CameraCaptureFailure(@NonNull Reason reason,
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureResult.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureResult.java
index f9e4b0d..010e901 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureResult.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraCaptureResult.java
@@ -22,6 +22,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.CameraCaptureMetaData.AeState;
import androidx.camera.core.impl.CameraCaptureMetaData.AfMode;
@@ -33,6 +34,7 @@
import androidx.camera.core.impl.utils.ExifData;
/** The camera2 implementation for the capture result of a single image capture. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Camera2CameraCaptureResult implements CameraCaptureResult {
private static final String TAG = "C2CameraCaptureResult";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java
index e1aaf38..a2259b6 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraControlImpl.java
@@ -35,6 +35,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
@@ -107,6 +108,7 @@
* </ul>
*/
@OptIn(markerClass = ExperimentalCamera2Interop.class)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Camera2CameraControlImpl implements CameraControlInternal {
private static final String TAG = "Camera2CameraControlImp";
private static final int DEFAULT_TEMPLATE = CameraDevice.TEMPLATE_PREVIEW;
@@ -943,6 +945,7 @@
* A set of {@link CameraCaptureCallback}s which is capable of adding/removing callbacks
* dynamically.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
static final class CameraCaptureCallbackSet extends CameraCaptureCallback {
Set<CameraCaptureCallback> mCallbacks = new HashSet<>();
Map<CameraCaptureCallback, Executor> mCallbackExecutors = new ArrayMap<>();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
index 51454e5..7d2ac60 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraFactory.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat;
import androidx.camera.camera2.internal.compat.CameraManagerCompat;
import androidx.camera.core.CameraSelector;
@@ -39,6 +40,7 @@
/**
* The factory class that creates {@link Camera2CameraImpl} instances.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CameraFactory implements CameraFactory {
private static final int DEFAULT_ALLOWED_CONCURRENT_OPEN_CAMERAS = 1;
private final CameraThreadConfig mThreadConfig;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
index 53653db..82758a7 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraImpl.java
@@ -33,8 +33,10 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
+import androidx.camera.camera2.internal.compat.ApiCompat;
import androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.camera2.internal.compat.CameraManagerCompat;
@@ -98,6 +100,7 @@
* <p>Capture requests will be issued only for use cases which are in both the attached and active
* state.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class Camera2CameraImpl implements CameraInternal {
private static final String TAG = "Camera2CameraImpl";
private static final int ERROR_NONE = 0;
@@ -518,6 +521,7 @@
// Add a callback to clear the future and notify if the camera and all capture sessions
// are released
+
Futures.addCallback(releaseFuture, new FutureCallback<Void>() {
@ExecutedBy("mExecutor")
@Override
@@ -533,7 +537,7 @@
case CLOSING:
case RELEASING:
if (isSessionCloseComplete() && mCameraDevice != null) {
- mCameraDevice.close();
+ ApiCompat.Api21Impl.close(mCameraDevice);
mCameraDevice = null;
}
break;
@@ -1463,6 +1467,7 @@
abstract Size getSurfaceResolution();
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class StateCallback extends CameraDevice.StateCallback {
// Delay long enough to guarantee the app could have been backgrounded.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java
index 178f4ee..0a71db4 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CameraInfoImpl.java
@@ -25,6 +25,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.camera2.internal.compat.CameraManagerCompat;
@@ -68,6 +69,7 @@
* to the {@link Camera2CameraControlImpl}.
*/
@OptIn(markerClass = ExperimentalCamera2Interop.class)
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CameraInfoImpl implements CameraInfoInternal {
private static final String TAG = "Camera2CameraInfo";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureCallbacks.java
index 81635bd..3dcdf35 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureCallbacks.java
@@ -35,6 +35,7 @@
/**
* Different implementations of {@link CameraCaptureSession.CaptureCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CaptureCallbacks {
private Camera2CaptureCallbacks() {
}
@@ -104,6 +105,7 @@
}
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
private static final class ComboSessionCaptureCallback
extends CameraCaptureSession.CaptureCallback {
private final List<CameraCaptureSession.CaptureCallback> mCallbacks = new ArrayList<>();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureOptionUnpacker.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureOptionUnpacker.java
index e1e385a..20159a5 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureOptionUnpacker.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureOptionUnpacker.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
import androidx.camera.core.impl.CaptureConfig;
@@ -29,6 +30,7 @@
* A {@link CaptureConfig.OptionUnpacker} implementation for unpacking Camera2 options into
* {@link CaptureConfig.Builder}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class Camera2CaptureOptionUnpacker implements CaptureConfig.OptionUnpacker {
static final Camera2CaptureOptionUnpacker INSTANCE = new Camera2CaptureOptionUnpacker();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureRequestBuilder.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureRequestBuilder.java
index 59f815e..70e4cf9 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureRequestBuilder.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2CaptureRequestBuilder.java
@@ -24,6 +24,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.interop.CaptureRequestOptions;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
import androidx.camera.core.Logger;
@@ -38,6 +39,7 @@
/**
* This class is used to build a camera2 {@link CaptureRequest} from a {@link CaptureConfig}
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class Camera2CaptureRequestBuilder {
private Camera2CaptureRequestBuilder() {
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManager.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManager.java
index 7f3dd92f..405073f 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManager.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2DeviceSurfaceManager.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.camera2.internal.compat.CameraManagerCompat;
@@ -47,6 +48,7 @@
* devices. This structure is used to store the guaranteed supported stream capabilities related
* info.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2DeviceSurfaceManager implements CameraDeviceSurfaceManager {
private static final String TAG = "Camera2DeviceSurfaceManager";
private final Map<String, SupportedSurfaceCombination> mCameraSupportedSurfaceCombinationMap =
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2RequestProcessor.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2RequestProcessor.java
index a09bc80..fc1dd9c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2RequestProcessor.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2RequestProcessor.java
@@ -25,6 +25,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.CameraCaptureFailure;
import androidx.camera.core.impl.CaptureConfig;
@@ -56,6 +57,7 @@
* <p>This class is thread-safe. It is safe to invoke methods of {@link Camera2RequestProcessor}
* from any threads.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Camera2RequestProcessor implements RequestProcessor {
private static final String TAG = "Camera2RequestProcessor";
private final CaptureSession mCaptureSession;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2SessionOptionUnpacker.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2SessionOptionUnpacker.java
index 3132339..d76e14db 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2SessionOptionUnpacker.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2SessionOptionUnpacker.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.impl.CameraEventCallbacks;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
@@ -31,6 +32,7 @@
* A {@link SessionConfig.OptionUnpacker} implementation for unpacking Camera2 options into a
* {@link SessionConfig.Builder}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class Camera2SessionOptionUnpacker implements SessionConfig.OptionUnpacker {
static final Camera2SessionOptionUnpacker INSTANCE = new Camera2SessionOptionUnpacker();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2UseCaseConfigFactory.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2UseCaseConfigFactory.java
index 4dfb9b3..3ea7ebc 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2UseCaseConfigFactory.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/Camera2UseCaseConfigFactory.java
@@ -24,12 +24,11 @@
import static androidx.camera.core.impl.UseCaseConfig.OPTION_SESSION_CONFIG_UNPACKER;
import android.content.Context;
-import android.graphics.Point;
import android.hardware.camera2.CameraDevice;
-import android.util.Size;
-import android.view.WindowManager;
+import android.hardware.display.DisplayManager;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.workaround.PreviewPixelHDRnet;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.impl.Config;
@@ -42,12 +41,12 @@
* Implementation of UseCaseConfigFactory to provide the default camera2 configurations for use
* cases.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2UseCaseConfigFactory implements UseCaseConfigFactory {
- private static final Size MAX_PREVIEW_SIZE = new Size(1920, 1080);
- final WindowManager mWindowManager;
+ final DisplayManager mDisplayManager;
public Camera2UseCaseConfigFactory(@NonNull Context context) {
- mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
+ mDisplayManager = DisplayUtil.getDisplayManager(context);
}
/**
@@ -56,7 +55,6 @@
*/
@NonNull
@Override
- @SuppressWarnings("deprecation") /* getDefaultDisplay */
public Config getConfig(@NonNull CaptureType captureType) {
final MutableOptionsBundle mutableConfig = MutableOptionsBundle.create();
@@ -105,32 +103,13 @@
: Camera2CaptureOptionUnpacker.INSTANCE);
if (captureType == CaptureType.PREVIEW) {
- mutableConfig.insertOption(OPTION_MAX_RESOLUTION, getPreviewSize());
+ mutableConfig.insertOption(OPTION_MAX_RESOLUTION,
+ SupportedSurfaceCombination.getPreviewSize(mDisplayManager));
}
- int targetRotation = mWindowManager.getDefaultDisplay().getRotation();
+ int targetRotation = DisplayUtil.getMaxSizeDisplay(mDisplayManager).getRotation();
mutableConfig.insertOption(OPTION_TARGET_ROTATION, targetRotation);
return OptionsBundle.from(mutableConfig);
}
-
- /**
- * Returns the device's screen resolution, or 1080p, whichever is smaller.
- */
- @SuppressWarnings("deprecation") /* getDefaultDisplay */
- private Size getPreviewSize() {
- Point displaySize = new Point();
- mWindowManager.getDefaultDisplay().getRealSize(displaySize);
-
- Size displayViewSize;
- if (displaySize.x > displaySize.y) {
- displayViewSize = new Size(displaySize.x, displaySize.y);
- } else {
- displayViewSize = new Size(displaySize.y, displaySize.x);
- }
-
- return displayViewSize.getWidth() * displayViewSize.getHeight()
- > MAX_PREVIEW_SIZE.getWidth() * MAX_PREVIEW_SIZE.getHeight() ? MAX_PREVIEW_SIZE
- : displayViewSize;
- }
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraBurstCaptureCallback.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraBurstCaptureCallback.java
index 5eff852..d29b60c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraBurstCaptureCallback.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraBurstCaptureCallback.java
@@ -40,6 +40,7 @@
* <p>Note this class is not thread-safe and its methods should only be invoked from the single
* thread.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraBurstCaptureCallback extends CameraCaptureSession.CaptureCallback {
final Map<CaptureRequest, List<CameraCaptureSession.CaptureCallback>> mCallbackMap;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacks.java
index b1f5c99..40c2a9a 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraCaptureSessionStateCallbacks.java
@@ -31,6 +31,7 @@
/**
* Different implementations of {@link CameraCaptureSession.StateCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraCaptureSessionStateCallbacks {
private CameraCaptureSessionStateCallbacks() {
}
@@ -97,6 +98,7 @@
}
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
static final class ComboSessionStateCallback
extends CameraCaptureSession.StateCallback {
private final List<CameraCaptureSession.StateCallback> mCallbacks = new ArrayList<>();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceId.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceId.java
index 4a5b643..d66b42e 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceId.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceId.java
@@ -17,12 +17,14 @@
package androidx.camera.camera2.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
/**
* Camera device id that is composed by Brand, Device, Model and CameraId.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
abstract class CameraDeviceId {
CameraDeviceId() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacks.java
index 066e5a3..ee57c19 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraDeviceStateCallbacks.java
@@ -19,6 +19,7 @@
import android.hardware.camera2.CameraDevice;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.Arrays;
@@ -27,6 +28,7 @@
/**
* Different implementations of {@link CameraDevice.StateCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraDeviceStateCallbacks {
private CameraDeviceStateCallbacks() {
}
@@ -80,6 +82,7 @@
}
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
private static final class ComboDeviceStateCallback extends CameraDevice.StateCallback {
private final List<CameraDevice.StateCallback> mCallbacks = new ArrayList<>();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java
index c402e97..24a3be3 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraSelectionOptimizer.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat;
import androidx.camera.camera2.internal.compat.CameraManagerCompat;
import androidx.camera.core.CameraInfo;
@@ -33,6 +34,7 @@
import java.util.Arrays;
import java.util.List;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraSelectionOptimizer {
private CameraSelectionOptimizer() {
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraStateMachine.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraStateMachine.java
index fa303a5..3684bb5 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraStateMachine.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraStateMachine.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraState;
import androidx.camera.core.CameraState.StateError;
import androidx.camera.core.Logger;
@@ -29,6 +30,7 @@
import java.util.Objects;
/** State machine that computes the camera's public state from its internal state. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraStateMachine {
private static final String TAG = "CameraStateMachine";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraUnavailableExceptionHelper.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraUnavailableExceptionHelper.java
index 0515f8f..a0e20b0 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraUnavailableExceptionHelper.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CameraUnavailableExceptionHelper.java
@@ -17,12 +17,14 @@
package androidx.camera.camera2.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat;
import androidx.camera.core.CameraUnavailableException;
/**
* Helper class to create a {@link CameraUnavailableException}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraUnavailableExceptionHelper {
private CameraUnavailableExceptionHelper() {}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackAdapter.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackAdapter.java
index 5639402..93ba0c62 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackAdapter.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackAdapter.java
@@ -22,6 +22,7 @@
import android.hardware.camera2.TotalCaptureResult;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureCallback;
import androidx.camera.core.impl.CameraCaptureFailure;
import androidx.camera.core.impl.TagBundle;
@@ -31,6 +32,7 @@
* An adapter that passes {@link CameraCaptureSession.CaptureCallback} to {@link
* CameraCaptureCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CaptureCallbackAdapter extends CameraCaptureSession.CaptureCallback {
private final CameraCaptureCallback mCameraCaptureCallback;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackContainer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackContainer.java
index 7947121..a4e2fe5 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackContainer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackContainer.java
@@ -19,12 +19,14 @@
import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureCallback;
/**
* A {@link CameraCaptureCallback} which contains an {@link CaptureCallback} and doesn't handle the
* callback.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CaptureCallbackContainer extends CameraCaptureCallback {
private final CaptureCallback mCaptureCallback;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackConverter.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackConverter.java
index ea7af79..86e0f56 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackConverter.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureCallbackConverter.java
@@ -18,6 +18,7 @@
import android.hardware.camera2.CameraCaptureSession.CaptureCallback;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureCallback;
import androidx.camera.core.impl.CameraCaptureCallbacks.ComboCameraCaptureCallback;
@@ -25,6 +26,7 @@
import java.util.List;
/** An utility class to convert {@link CameraCaptureCallback} to camera2 {@link CaptureCallback}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CaptureCallbackConverter {
private CaptureCallbackConverter() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
index e8c607d..c0860c6 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSession.java
@@ -28,6 +28,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.impl.CameraEventCallbacks;
import androidx.camera.camera2.internal.compat.params.OutputConfigurationCompat;
@@ -60,11 +61,10 @@
import java.util.concurrent.CancellationException;
/**
- *
* A basic implementation of {@link CaptureSessionInterface} for capturing images from the camera
* which is tied to a specific {@link CameraDevice}.
- *
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CaptureSession implements CaptureSessionInterface {
private static final String TAG = "CaptureSession";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionInterface.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionInterface.java
index 40213b4..73fbb81 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionInterface.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionInterface.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.impl.SessionConfig;
@@ -37,6 +38,7 @@
* #close()} been called then it is permanently closed so a new session has to be created for
* capturing images.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface CaptureSessionInterface {
/**
* Opens the capture session.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java
index d012fbc..31712f3d 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CaptureSessionRepository.java
@@ -21,6 +21,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
import java.util.ArrayList;
@@ -35,6 +36,7 @@
* <p> The repository also help to close the created SynchronizedCaptureSession when the camera is
* disconnected.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CaptureSessionRepository {
/** Executor for all the callbacks from the {@link CameraCaptureSession}. */
@NonNull
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CropRegionZoomImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CropRegionZoomImpl.java
index 4b1e801..4ec3c82 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CropRegionZoomImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/CropRegionZoomImpl.java
@@ -22,12 +22,14 @@
import android.hardware.camera2.TotalCaptureResult;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.CameraControl;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.core.util.Preconditions;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CropRegionZoomImpl implements ZoomControl.ZoomImpl {
public static final float MIN_DIGITAL_ZOOM = 1.0f;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/DisplayUtil.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/DisplayUtil.java
new file mode 100644
index 0000000..11f7b14
--- /dev/null
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/DisplayUtil.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.camera2.internal;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.hardware.display.DisplayManager;
+import android.view.Display;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+/**
+ * Utility class for {@link Display} related information.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public final class DisplayUtil {
+ /**
+ * Retrieves the display which has the max size among all displays.
+ */
+ @SuppressWarnings("deprecation") /* getRealSize */
+ @NonNull
+ public static Display getMaxSizeDisplay(@NonNull DisplayManager displayManager) {
+ Display maxDisplay = null;
+ int maxDisplaySize = -1;
+
+ for (Display display : displayManager.getDisplays()) {
+ Point displaySize = new Point();
+ display.getRealSize(displaySize);
+ if (displaySize.x * displaySize.y > maxDisplaySize) {
+ maxDisplaySize = displaySize.x * displaySize.y;
+ maxDisplay = display;
+ }
+ }
+
+ if (maxDisplay == null) {
+ throw new IllegalArgumentException("No display can be found from the input display "
+ + "manager!");
+ }
+
+ return maxDisplay;
+ }
+
+ /**
+ * Retrieves the {@link DisplayManager} instance.
+ */
+ @NonNull
+ public static DisplayManager getDisplayManager(@NonNull Context context) {
+ return (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
+ }
+
+ private DisplayUtil() {}
+}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureControl.java
index bf9b6e9..dcc344d 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureControl.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
@@ -52,6 +53,7 @@
* The task will fails with {@link CameraControl.OperationCanceledException} if the camera is
* closed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExposureControl {
private static final int DEFAULT_EXPOSURE_COMPENSATION = 0;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureStateImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureStateImpl.java
index fb4a514..9b17eae 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureStateImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ExposureStateImpl.java
@@ -22,12 +22,14 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.ExposureState;
/**
* An implementation of {@link ExposureState} where the values can be set.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ExposureStateImpl implements ExposureState {
private final Object mLock = new Object();
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java
index 7690879..062a10e1 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/FocusMeteringControl.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
@@ -73,6 +74,7 @@
* {@link FocusMeteringControl#addFocusMeteringOptions} to construct the 3A regions and append
* them to all repeating requests and single requests.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class FocusMeteringControl {
private static final String TAG = "FocusMeteringControl";
private final Camera2CameraControlImpl mCameraControl;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ImageCaptureOptionUnpacker.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ImageCaptureOptionUnpacker.java
index 7eed2cd..71bd591 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ImageCaptureOptionUnpacker.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ImageCaptureOptionUnpacker.java
@@ -17,6 +17,7 @@
package androidx.camera.camera2.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.compat.workaround.ImageCapturePixelHDRPlus;
import androidx.camera.core.impl.CaptureConfig;
@@ -27,6 +28,7 @@
* A {@link Camera2CaptureOptionUnpacker} extender for unpacking ImageCapture options into
* {@link CaptureConfig.Builder}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageCaptureOptionUnpacker extends Camera2CaptureOptionUnpacker {
static final ImageCaptureOptionUnpacker INSTANCE = new ImageCaptureOptionUnpacker(
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/MeteringRepeatingSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/MeteringRepeatingSession.java
index fd5cc5e..07a3cd7 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/MeteringRepeatingSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/MeteringRepeatingSession.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.Logger;
import androidx.camera.core.UseCase;
@@ -51,6 +52,7 @@
* wait for 3A converged.
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class MeteringRepeatingSession {
private static final String TAG = "MeteringRepeating";
private DeferrableSurface mDeferrableSurface;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ProcessingCaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ProcessingCaptureSession.java
index 49eb481..2d40296 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ProcessingCaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ProcessingCaptureSession.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.interop.CaptureRequestOptions;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
@@ -78,6 +79,7 @@
* </pre>
* <p>This class is not thread-safe. All methods must be executed sequentially.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@OptIn(markerClass = ExperimentalCamera2Interop.class)
final class ProcessingCaptureSession implements CaptureSessionInterface {
private static final String TAG = "ProcessingCaptureSession";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
index 7eba690..0a7bb5c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SupportedSurfaceCombination.java
@@ -22,6 +22,7 @@
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.params.StreamConfigurationMap;
+import android.hardware.display.DisplayManager;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
@@ -29,10 +30,10 @@
import android.util.Rational;
import android.util.Size;
import android.view.Surface;
-import android.view.WindowManager;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.camera2.internal.compat.CameraAccessExceptionCompat;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
@@ -71,6 +72,7 @@
* devices. This structure is used to store a list of surface combinations that are guaranteed to
* support for this camera device.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SupportedSurfaceCombination {
private static final String TAG = "SupportedSurfaceCombination";
private static final Size MAX_PREVIEW_SIZE = new Size(1920, 1080);
@@ -105,8 +107,6 @@
throws CameraUnavailableException {
mCameraId = Preconditions.checkNotNull(cameraId);
mCamcorderProfileHelper = Preconditions.checkNotNull(camcorderProfileHelper);
- WindowManager windowManager =
- (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
mExcludedSupportedSizesContainer = new ExcludedSupportedSizesContainer(cameraId);
mExtraSupportedSurfaceCombinationsContainer =
new ExtraSupportedSurfaceCombinationsContainer();
@@ -122,7 +122,7 @@
throw CameraUnavailableExceptionHelper.createFrom(e);
}
generateSupportedCombinationList();
- generateSurfaceSizeDefinition(windowManager);
+ generateSurfaceSizeDefinition(DisplayUtil.getDisplayManager(context));
checkCustomization();
}
@@ -1190,9 +1190,9 @@
// Utility classes and methods:
// *********************************************************************************************
- private void generateSurfaceSizeDefinition(WindowManager windowManager) {
+ private void generateSurfaceSizeDefinition(@NonNull DisplayManager displayManager) {
Size analysisSize = new Size(640, 480);
- Size previewSize = getPreviewSize(windowManager);
+ Size previewSize = getPreviewSize(displayManager);
Size recordSize = getRecordSize();
mSurfaceSizeDefinition =
SurfaceSizeDefinition.create(analysisSize, previewSize, recordSize);
@@ -1202,11 +1202,11 @@
* PREVIEW refers to the best size match to the device's screen resolution, or to 1080p
* (1920x1080), whichever is smaller.
*/
- @SuppressWarnings("deprecation") /* defaultDisplay */
+ @SuppressWarnings("deprecation") /* getRealSize */
@NonNull
- public static Size getPreviewSize(@NonNull WindowManager windowManager) {
+ static Size getPreviewSize(@NonNull DisplayManager displayManager) {
Point displaySize = new Point();
- windowManager.getDefaultDisplay().getRealSize(displaySize);
+ DisplayUtil.getMaxSizeDisplay(displayManager).getRealSize(displaySize);
Size displayViewSize;
if (displaySize.x > displaySize.y) {
@@ -1336,6 +1336,7 @@
}
/** Comparator based on area of the given {@link Size} objects. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
static final class CompareSizesByArea implements Comparator<Size> {
private boolean mReverse = false;
@@ -1363,6 +1364,7 @@
}
/** Comparator based on how close they are to the target aspect ratio. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
static final class CompareAspectRatiosByDistanceToTargetRatio implements Comparator<Rational> {
private Rational mTargetRatio;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java
index 768af0f..c02411d 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSession.java
@@ -52,6 +52,7 @@
*
* @see SynchronizedCaptureSessionOpener
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface SynchronizedCaptureSession {
@NonNull
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java
index dd04d80..1f868c3 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionBaseImpl.java
@@ -61,6 +61,7 @@
* {@link CameraCaptureSession.StateCallback} and convert the {@link CameraCaptureSession} to the
* SynchronizedCaptureSession object.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class SynchronizedCaptureSessionBaseImpl extends SynchronizedCaptureSession.StateCallback implements
SynchronizedCaptureSession, SynchronizedCaptureSessionOpener.OpenerImpl {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java
index 5fc9b68..df71852 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionImpl.java
@@ -26,6 +26,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.SynchronizedCaptureSessionOpener.SynchronizedSessionFeature;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
import androidx.camera.camera2.internal.compat.params.SessionConfigurationCompat;
@@ -61,6 +62,7 @@
* <p>b/146773463: It needs to check all the releasing capture sessions are ready for opening
* next capture session.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class SynchronizedCaptureSessionImpl extends SynchronizedCaptureSessionBaseImpl {
private static final String TAG = "SyncCaptureSessionImpl";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java
index 56c4671..fbbeff7 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionOpener.java
@@ -25,6 +25,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.StringDef;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
@@ -65,6 +66,7 @@
* @see #startWithDeferrableSurface
* @see #stop()
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SynchronizedCaptureSessionOpener {
/**
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java
index c08989b..8d31daf 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/SynchronizedCaptureSessionStateCallbacks.java
@@ -28,6 +28,7 @@
import java.util.Arrays;
import java.util.List;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SynchronizedCaptureSessionStateCallbacks extends
SynchronizedCaptureSession.StateCallback {
@@ -106,6 +107,7 @@
}
}
+ @RequiresApi(21)
static class Adapter extends SynchronizedCaptureSession.StateCallback {
@NonNull
private final CameraCaptureSession.StateCallback mCameraCaptureSessionStateCallback;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/TorchControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/TorchControl.java
index d5c3ba8..3b02170 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/TorchControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/TorchControl.java
@@ -18,10 +18,10 @@
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CaptureRequest;
-import android.hardware.camera2.TotalCaptureResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.CameraControl.OperationCanceledException;
@@ -47,6 +47,7 @@
* camera device is ready to do torch operations and be deactivated when the camera device is
* closing or closed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class TorchControl {
private static final String TAG = "TorchControl";
static final int DEFAULT_TORCH_STATE = TorchState.OFF;
@@ -78,9 +79,24 @@
mExecutor = executor;
Boolean hasFlashUnit =
cameraCharacteristics.get(CameraCharacteristics.FLASH_INFO_AVAILABLE);
- mHasFlashUnit = hasFlashUnit != null && hasFlashUnit.booleanValue();
+ mHasFlashUnit = hasFlashUnit != null && hasFlashUnit;
mTorchState = new MutableLiveData<>(DEFAULT_TORCH_STATE);
- mCamera2CameraControlImpl.addCaptureResultListener(mCaptureResultListener);
+ Camera2CameraControlImpl.CaptureResultListener captureResultListener = captureResult -> {
+ if (mEnableTorchCompleter != null) {
+ CaptureRequest captureRequest = captureResult.getRequest();
+ Integer flashMode = captureRequest.get(CaptureRequest.FLASH_MODE);
+ boolean torchEnabled =
+ flashMode != null && flashMode == CaptureRequest.FLASH_MODE_TORCH;
+
+ if (torchEnabled == mTargetTorchEnabled) {
+ mEnableTorchCompleter.set(null);
+ mEnableTorchCompleter = null;
+ }
+ }
+ // Return false to keep getting captureResult.
+ return false;
+ };
+ mCamera2CameraControlImpl.addCaptureResultListener(captureResultListener);
}
/**
@@ -196,26 +212,4 @@
liveData.postValue(value);
}
}
-
- private final Camera2CameraControlImpl.CaptureResultListener mCaptureResultListener =
- new Camera2CameraControlImpl.CaptureResultListener() {
-
- @ExecutedBy("mExecutor")
- @Override
- public boolean onCaptureResult(@NonNull TotalCaptureResult captureResult) {
- if (mEnableTorchCompleter != null) {
- CaptureRequest captureRequest = captureResult.getRequest();
- Integer flashMode = captureRequest.get(CaptureRequest.FLASH_MODE);
- boolean torchEnabled =
- flashMode != null && flashMode == CaptureRequest.FLASH_MODE_TORCH;
-
- if (torchEnabled == mTargetTorchEnabled) {
- mEnableTorchCompleter.set(null);
- mEnableTorchCompleter = null;
- }
- }
- // Return false to keep getting captureResult.
- return false;
- }
- };
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomControl.java
index 888e0b2..1c89838 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomControl.java
@@ -25,6 +25,7 @@
import androidx.annotation.FloatRange;
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.annotation.CameraExecutor;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
@@ -64,6 +65,7 @@
* on {@link ZoomControl} when apps are ready to accept zoom operations and set inactive if camera
* is closing or closed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ZoomControl {
private static final String TAG = "ZoomControl";
public static final float DEFAULT_ZOOM_RATIO = 1.0f;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomStateImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomStateImpl.java
index cc241a3..c436a6e 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomStateImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/ZoomStateImpl.java
@@ -16,10 +16,12 @@
package androidx.camera.camera2.internal;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ZoomState;
import androidx.core.math.MathUtils;
/** An implementation of {@link ZoomState} where the values can be set. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ZoomStateImpl implements ZoomState {
private float mZoomRatio;
private final float mMaxZoomRatio;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/ApiCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/ApiCompat.java
index 62e3da9..436f8db 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/ApiCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/ApiCompat.java
@@ -17,6 +17,7 @@
package androidx.camera.camera2.internal.compat;
import android.hardware.camera2.CameraCaptureSession;
+import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.OutputConfiguration;
@@ -38,6 +39,24 @@
}
/**
+ * Nested class to avoid verification errors for methods introduced in Android 5.0 (API 21).
+ */
+ @RequiresApi(21)
+ public static class Api21Impl {
+
+ private Api21Impl() {
+ }
+
+ /**
+ * @see CameraDevice#close()
+ */
+ @DoNotInline
+ public static void close(@NonNull CameraDevice cameraDevice) {
+ cameraDevice.close();
+ }
+ }
+
+ /**
* Nested class to avoid verification errors for methods introduced in Android 6.0 (API 23).
*/
@RequiresApi(23)
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraAccessExceptionCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraAccessExceptionCompat.java
index c5f93fe..3a8a173 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraAccessExceptionCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraAccessExceptionCompat.java
@@ -24,6 +24,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
@@ -37,6 +38,7 @@
/**
* Helper for accessing features in {@link CameraAccessException} in a backwards compatible fashion.
*/
+@RequiresApi(21)
public class CameraAccessExceptionCompat extends Exception {
// Start of the CameraAccessException error
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCaptureSessionCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCaptureSessionCompat.java
index 3a0a796..879e361 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCaptureSessionCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCaptureSessionCompat.java
@@ -304,6 +304,7 @@
CameraCaptureSession unwrap();
}
+ @RequiresApi(21)
static final class CaptureCallbackExecutorWrapper extends CameraCaptureSession.CaptureCallback {
final CameraCaptureSession.CaptureCallback mWrappedCallback;
@@ -319,73 +320,40 @@
public void onCaptureStarted(@NonNull final CameraCaptureSession session,
@NonNull final CaptureRequest request, final long timestamp,
final long frameNumber) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onCaptureStarted(session, request, timestamp, frameNumber);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCaptureStarted(session, request, timestamp,
+ frameNumber));
}
@Override
public void onCaptureProgressed(@NonNull final CameraCaptureSession session,
@NonNull final CaptureRequest request, @NonNull final CaptureResult partialResult) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onCaptureProgressed(session, request, partialResult);
- }
- });
+ mExecutor.execute(
+ () -> mWrappedCallback.onCaptureProgressed(session, request, partialResult));
}
@Override
public void onCaptureCompleted(@NonNull final CameraCaptureSession session,
@NonNull final CaptureRequest request, @NonNull final TotalCaptureResult result) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onCaptureCompleted(session, request, result);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCaptureCompleted(session, request, result));
}
@Override
public void onCaptureFailed(@NonNull final CameraCaptureSession session,
@NonNull final CaptureRequest request, @NonNull final CaptureFailure failure) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onCaptureFailed(session, request, failure);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCaptureFailed(session, request, failure));
}
@Override
public void onCaptureSequenceCompleted(@NonNull final CameraCaptureSession session,
final int sequenceId, final long frameNumber) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onCaptureSequenceCompleted(session, sequenceId, frameNumber);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCaptureSequenceCompleted(session, sequenceId,
+ frameNumber));
}
@Override
public void onCaptureSequenceAborted(@NonNull final CameraCaptureSession session,
final int sequenceId) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onCaptureSequenceAborted(session, sequenceId);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCaptureSequenceAborted(session, sequenceId));
}
@RequiresApi(24)
@@ -393,17 +361,13 @@
public void onCaptureBufferLost(@NonNull final CameraCaptureSession session,
@NonNull final CaptureRequest request, @NonNull final Surface target,
final long frameNumber) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- ApiCompat.Api24Impl.onCaptureBufferLost(mWrappedCallback, session, request,
- target, frameNumber);
- }
- });
+ mExecutor.execute(
+ () -> ApiCompat.Api24Impl.onCaptureBufferLost(mWrappedCallback, session,
+ request, target, frameNumber));
}
}
+ @RequiresApi(21)
static final class StateCallbackExecutorWrapper extends CameraCaptureSession.StateCallback {
final CameraCaptureSession.StateCallback mWrappedCallback;
@@ -417,83 +381,43 @@
@Override
public void onConfigured(@NonNull final CameraCaptureSession session) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onConfigured(session);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onConfigured(session));
}
@Override
public void onConfigureFailed(@NonNull final CameraCaptureSession session) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onConfigureFailed(session);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onConfigureFailed(session));
}
@Override
public void onReady(@NonNull final CameraCaptureSession session) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onReady(session);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onReady(session));
}
@Override
public void onActive(@NonNull final CameraCaptureSession session) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onActive(session);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onActive(session));
}
@RequiresApi(26)
@Override
public void onCaptureQueueEmpty(@NonNull final CameraCaptureSession session) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- ApiCompat.Api26Impl.onCaptureQueueEmpty(mWrappedCallback, session);
- }
- });
+ mExecutor.execute(
+ () -> ApiCompat.Api26Impl.onCaptureQueueEmpty(mWrappedCallback, session));
}
@Override
public void onClosed(@NonNull final CameraCaptureSession session) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- mWrappedCallback.onClosed(session);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onClosed(session));
}
@RequiresApi(23)
@Override
public void onSurfacePrepared(@NonNull final CameraCaptureSession session,
@NonNull final Surface surface) {
- mExecutor.execute(new Runnable() {
-
- @Override
- public void run() {
- ApiCompat.Api23Impl.onSurfacePrepared(mWrappedCallback, session, surface);
- }
- });
+ mExecutor.execute(() -> ApiCompat.Api23Impl.onSurfacePrepared(mWrappedCallback, session,
+ surface));
}
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java
index 107c0d6..267cf93 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraCharacteristicsCompat.java
@@ -22,6 +22,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import java.util.HashMap;
@@ -32,6 +33,7 @@
* A wrapper for {@link CameraCharacteristics} which caches the retrieved values to optimize
* the latency and might contain backward compatible fixes for certain parameters.
*/
+@RequiresApi(21)
public class CameraCharacteristicsCompat {
@NonNull
@GuardedBy("this")
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompat.java
index d388628..a780948 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompat.java
@@ -16,7 +16,6 @@
package androidx.camera.camera2.internal.compat;
-import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraDevice;
import android.os.Build;
import android.os.Handler;
@@ -119,25 +118,26 @@
* helper object that aggregates all supported parameters.
*
* @param config A session configuration (see {@link SessionConfigurationCompat}).
- * @throws IllegalArgumentException In case the session configuration
- * is invalid; or the output configurations are empty; or
- * the session configuration executor is invalid.
- * @throws CameraAccessException In case the camera device is no longer connected or has
- * encountered a fatal error.
+ * @throws IllegalArgumentException In case the session configuration
+ * is invalid; or the output configurations are empty; or
+ * the session configuration executor is invalid.
+ * @throws CameraAccessExceptionCompat In case the camera device is no longer connected or
+ * has encountered a fatal error.
*/
public void createCaptureSession(@NonNull SessionConfigurationCompat config)
- throws CameraAccessException {
+ throws CameraAccessExceptionCompat {
mImpl.createCaptureSession(config);
}
interface CameraDeviceCompatImpl {
void createCaptureSession(@NonNull SessionConfigurationCompat config)
- throws CameraAccessException;
+ throws CameraAccessExceptionCompat;
@NonNull
CameraDevice unwrap();
}
+ @RequiresApi(21)
static final class StateCallbackExecutorWrapper extends CameraDevice.StateCallback {
final CameraDevice.StateCallback mWrappedCallback;
@@ -151,42 +151,22 @@
@Override
public void onOpened(@NonNull final CameraDevice camera) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mWrappedCallback.onOpened(camera);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onOpened(camera));
}
@Override
public void onDisconnected(@NonNull final CameraDevice camera) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mWrappedCallback.onDisconnected(camera);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onDisconnected(camera));
}
@Override
public void onError(@NonNull final CameraDevice camera, final int error) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mWrappedCallback.onError(camera, error);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onError(camera, error));
}
@Override
public void onClosed(@NonNull final CameraDevice camera) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mWrappedCallback.onClosed(camera);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onClosed(camera));
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi23Impl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi23Impl.java
index 6950152e..2ede2ea 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi23Impl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi23Impl.java
@@ -48,7 +48,7 @@
@Override
public void createCaptureSession(@NonNull SessionConfigurationCompat config)
- throws CameraAccessException {
+ throws CameraAccessExceptionCompat {
checkPreconditions(mCameraDevice, config);
// Wrap the executor in the callback
@@ -63,18 +63,22 @@
Handler handler = Preconditions.checkNotNull(params).mCompatHandler;
InputConfigurationCompat inputConfigCompat = config.getInputConfiguration();
- if (inputConfigCompat != null) {
- // Client is requesting a reprocessable capture session
- InputConfiguration inputConfig = (InputConfiguration) inputConfigCompat.unwrap();
+ try {
+ if (inputConfigCompat != null) {
+ // Client is requesting a reprocessable capture session
+ InputConfiguration inputConfig = (InputConfiguration) inputConfigCompat.unwrap();
- Preconditions.checkNotNull(inputConfig);
- mCameraDevice.createReprocessableCaptureSession(inputConfig, surfaces, cb, handler);
- } else if (config.getSessionType() == SessionConfigurationCompat.SESSION_HIGH_SPEED) {
- // Client is requesting a high speed capture session
- mCameraDevice.createConstrainedHighSpeedCaptureSession(surfaces, cb, handler);
- } else {
- // Fall back to a normal capture session
- createBaseCaptureSession(mCameraDevice, surfaces, cb, handler);
+ Preconditions.checkNotNull(inputConfig);
+ mCameraDevice.createReprocessableCaptureSession(inputConfig, surfaces, cb, handler);
+ } else if (config.getSessionType() == SessionConfigurationCompat.SESSION_HIGH_SPEED) {
+ // Client is requesting a high speed capture session
+ mCameraDevice.createConstrainedHighSpeedCaptureSession(surfaces, cb, handler);
+ } else {
+ // Fall back to a normal capture session
+ createBaseCaptureSession(mCameraDevice, surfaces, cb, handler);
+ }
+ } catch (CameraAccessException e) {
+ throw CameraAccessExceptionCompat.toCameraAccessExceptionCompat(e);
}
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi24Impl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi24Impl.java
index a58b8e5..214b206 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi24Impl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi24Impl.java
@@ -48,7 +48,7 @@
@Override
public void createCaptureSession(@NonNull SessionConfigurationCompat config)
- throws CameraAccessException {
+ throws CameraAccessExceptionCompat {
checkPreconditions(mCameraDevice, config);
// Wrap the executor in the callback
@@ -63,22 +63,26 @@
Handler handler = Preconditions.checkNotNull(params).mCompatHandler;
InputConfigurationCompat inputConfigCompat = config.getInputConfiguration();
- if (inputConfigCompat != null) {
- // Client is requesting a reprocessable capture session
- InputConfiguration inputConfig = (InputConfiguration) inputConfigCompat.unwrap();
+ try {
+ if (inputConfigCompat != null) {
+ // Client is requesting a reprocessable capture session
+ InputConfiguration inputConfig = (InputConfiguration) inputConfigCompat.unwrap();
- Preconditions.checkNotNull(inputConfig);
- // Use OutputConfigurations on this API level
- mCameraDevice.createReprocessableCaptureSessionByConfigurations(inputConfig,
- SessionConfigurationCompat.transformFromCompat(outputs), cb, handler);
- } else if (config.getSessionType() == SessionConfigurationCompat.SESSION_HIGH_SPEED) {
- // Client is requesting a high speed capture session
- mCameraDevice.createConstrainedHighSpeedCaptureSession(unpackSurfaces(outputs), cb,
- handler);
- } else {
- // Fall back to a normal capture session (created from OutputConfigurations)
- mCameraDevice.createCaptureSessionByOutputConfigurations(
- SessionConfigurationCompat.transformFromCompat(outputs), cb, handler);
+ Preconditions.checkNotNull(inputConfig);
+ // Use OutputConfigurations on this API level
+ mCameraDevice.createReprocessableCaptureSessionByConfigurations(inputConfig,
+ SessionConfigurationCompat.transformFromCompat(outputs), cb, handler);
+ } else if (config.getSessionType() == SessionConfigurationCompat.SESSION_HIGH_SPEED) {
+ // Client is requesting a high speed capture session
+ mCameraDevice.createConstrainedHighSpeedCaptureSession(unpackSurfaces(outputs), cb,
+ handler);
+ } else {
+ // Fall back to a normal capture session (created from OutputConfigurations)
+ mCameraDevice.createCaptureSessionByOutputConfigurations(
+ SessionConfigurationCompat.transformFromCompat(outputs), cb, handler);
+ }
+ } catch (CameraAccessException e) {
+ throw CameraAccessExceptionCompat.toCameraAccessExceptionCompat(e);
}
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi28Impl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi28Impl.java
index d050df6..eb7dbfa 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi28Impl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatApi28Impl.java
@@ -34,10 +34,14 @@
@Override
public void createCaptureSession(@NonNull SessionConfigurationCompat config)
- throws CameraAccessException {
+ throws CameraAccessExceptionCompat {
SessionConfiguration sessionConfig = (SessionConfiguration) config.unwrap();
Preconditions.checkNotNull(sessionConfig);
- mCameraDevice.createCaptureSession(sessionConfig);
+ try {
+ mCameraDevice.createCaptureSession(sessionConfig);
+ } catch (CameraAccessException e) {
+ throw CameraAccessExceptionCompat.toCameraAccessExceptionCompat(e);
+ }
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatBaseImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatBaseImpl.java
index 47a5f03..53efa227 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatBaseImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatBaseImpl.java
@@ -103,13 +103,17 @@
@SuppressWarnings("deprecation") /* createCaptureSession */
void createBaseCaptureSession(@NonNull CameraDevice device, @NonNull List<Surface> surfaces,
@NonNull CameraCaptureSession.StateCallback cb, @NonNull Handler handler)
- throws CameraAccessException {
- device.createCaptureSession(surfaces, cb, handler);
+ throws CameraAccessExceptionCompat {
+ try {
+ device.createCaptureSession(surfaces, cb, handler);
+ } catch (CameraAccessException e) {
+ throw CameraAccessExceptionCompat.toCameraAccessExceptionCompat(e);
+ }
}
@Override
public void createCaptureSession(@NonNull SessionConfigurationCompat config)
- throws CameraAccessException {
+ throws CameraAccessExceptionCompat {
checkPreconditions(mCameraDevice, config);
if (config.getInputConfiguration() != null) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
index d92329d..67a8646 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/CameraManagerCompat.java
@@ -166,16 +166,25 @@
synchronized (mCameraCharacteristicsMap) {
characteristics = mCameraCharacteristicsMap.get(cameraId);
if (characteristics == null) {
- characteristics =
- CameraCharacteristicsCompat.toCameraCharacteristicsCompat(
- mImpl.getCameraCharacteristics(cameraId));
- mCameraCharacteristicsMap.put(cameraId, characteristics);
+ try {
+ characteristics =
+ CameraCharacteristicsCompat.toCameraCharacteristicsCompat(
+ mImpl.getCameraCharacteristics(cameraId));
+ mCameraCharacteristicsMap.put(cameraId, characteristics);
+ } catch (AssertionError e) {
+ // Some devices may throw AssertionError when creating CameraCharacteristics
+ // and FPS ranges are null. Catch the AssertionError and throw a
+ // CameraAccessExceptionCompat to make the app be able to receive an
+ // exception to gracefully handle it.
+ throw new CameraAccessExceptionCompat(
+ CameraAccessExceptionCompat.CAMERA_CHARACTERISTICS_CREATION_ERROR,
+ e.getMessage(), e);
+ }
}
}
return characteristics;
}
-
/**
* Open a connection to a camera with the given ID.
*
@@ -269,6 +278,7 @@
}
}
+ @RequiresApi(21)
static final class AvailabilityCallbackExecutorWrapper extends
CameraManager.AvailabilityCallback {
@@ -297,12 +307,8 @@
public void onCameraAccessPrioritiesChanged() {
synchronized (mLock) {
if (!mDisabled) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- ApiCompat.Api29Impl.onCameraAccessPrioritiesChanged(mWrappedCallback);
- }
- });
+ mExecutor.execute(() -> ApiCompat.Api29Impl.onCameraAccessPrioritiesChanged(
+ mWrappedCallback));
}
}
}
@@ -311,12 +317,7 @@
public void onCameraAvailable(@NonNull final String cameraId) {
synchronized (mLock) {
if (!mDisabled) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mWrappedCallback.onCameraAvailable(cameraId);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCameraAvailable(cameraId));
}
}
}
@@ -325,12 +326,7 @@
public void onCameraUnavailable(@NonNull final String cameraId) {
synchronized (mLock) {
if (!mDisabled) {
- mExecutor.execute(new Runnable() {
- @Override
- public void run() {
- mWrappedCallback.onCameraUnavailable(cameraId);
- }
- });
+ mExecutor.execute(() -> mWrappedCallback.onCameraUnavailable(cameraId));
}
}
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl.java
index b7dfe01..7786322 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi24Impl.java
@@ -99,6 +99,7 @@
return ((OutputConfigurationParamsApi24) mObject).mOutputConfiguration;
}
+ @RequiresApi(21)
private static final class OutputConfigurationParamsApi24 {
final OutputConfiguration mOutputConfiguration;
@Nullable
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi26Impl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi26Impl.java
index e05d996..a488a30 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi26Impl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatApi26Impl.java
@@ -164,6 +164,7 @@
return ((OutputConfigurationParamsApi26) mObject).mOutputConfiguration;
}
+ @RequiresApi(21)
private static final class OutputConfigurationParamsApi26 {
final OutputConfiguration mOutputConfiguration;
@Nullable
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatBaseImpl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatBaseImpl.java
index 3f1a586..4c7c9ac 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatBaseImpl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/OutputConfigurationCompatBaseImpl.java
@@ -191,6 +191,7 @@
return mObject.hashCode();
}
+ @RequiresApi(21)
private static final class OutputConfigurationParamsApi21 {
/**
* Maximum number of surfaces supported by one {@link OutputConfigurationCompat}.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/SessionConfigurationCompat.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/SessionConfigurationCompat.java
index 30cc378..ebc1fed 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/SessionConfigurationCompat.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/params/SessionConfigurationCompat.java
@@ -291,6 +291,7 @@
Object getSessionConfiguration();
}
+ @RequiresApi(21)
private static final class SessionConfigurationCompatBaseImpl implements
SessionConfigurationCompatImpl {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AeFpsRangeLegacyQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AeFpsRangeLegacyQuirk.java
index c602ae0..94cd307 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AeFpsRangeLegacyQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AeFpsRangeLegacyQuirk.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.impl.Quirk;
@@ -37,6 +38,7 @@
*
* @see androidx.camera.camera2.internal.compat.workaround.AeFpsRange
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AeFpsRangeLegacyQuirk implements Quirk {
@Nullable
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AspectRatioLegacyApi21Quirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AspectRatioLegacyApi21Quirk.java
index bc1f843..5302a95 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AspectRatioLegacyApi21Quirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/AspectRatioLegacyApi21Quirk.java
@@ -20,6 +20,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.camera2.internal.compat.workaround.TargetAspectRatio;
import androidx.camera.core.impl.Quirk;
@@ -33,6 +34,7 @@
* output. There is a bug because of a flipped scaling factor in the intermediate texture
* transform matrix, and it was fixed in L MR1. See: b/128924712.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AspectRatioLegacyApi21Quirk implements Quirk {
static boolean load(@NonNull final CameraCharacteristicsCompat cameraCharacteristicsCompat) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java
index 0c7088b..f1c3333 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CamcorderProfileResolutionQuirk.java
@@ -24,6 +24,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.ImageFormatConstants;
@@ -53,6 +54,7 @@
*
* @see CamcorderProfile#hasProfile
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CamcorderProfileResolutionQuirk implements Quirk {
private static final String TAG = "CamcorderProfileResolutionQuirk";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraNoResponseWhenEnablingFlashQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraNoResponseWhenEnablingFlashQuirk.java
index 168f72f..a286a6e 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraNoResponseWhenEnablingFlashQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraNoResponseWhenEnablingFlashQuirk.java
@@ -22,6 +22,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
@@ -34,6 +35,7 @@
*
* <p>See b/193336562 and b/194046401 for details.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraNoResponseWhenEnablingFlashQuirk implements UseTorchAsFlashQuirk {
@VisibleForTesting
public static final String BUILD_BRAND = "SAMSUNG";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java
index 23c7482..71c4cc9 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CameraQuirks.java
@@ -19,6 +19,7 @@
import android.hardware.camera2.CameraCharacteristics;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.impl.Quirks;
@@ -27,6 +28,7 @@
import java.util.List;
/** Provider of camera specific quirks. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraQuirks {
private CameraQuirks() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java
index 81a59e4..4483ecb 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/CrashWhenTakingPhotoWithAutoFlashAEModeQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.Arrays;
@@ -31,6 +32,7 @@
* https://issuetracker.google.com/161730578 and
* https://issuetracker.google.com/194046401
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CrashWhenTakingPhotoWithAutoFlashAEModeQuirk implements Quirk {
static final List<String> AFFECTED_MODELS = Arrays.asList(
// Enables on all Galaxy A3 devices.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirks.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirks.java
index d7cbd63..2572cf4 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirks.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirks.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.impl.Quirks;
@@ -30,6 +31,7 @@
* <p>
* Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirks {
@NonNull
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
index 5cd48c8..1094a2b 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/DeviceQuirksLoader.java
@@ -17,6 +17,7 @@
package androidx.camera.camera2.internal.compat.quirk;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.ArrayList;
@@ -25,6 +26,7 @@
/**
* Loads all device specific quirks required for the current device
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirksLoader {
private DeviceQuirksLoader() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java
index 29254f2..e365eddc 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java
@@ -21,6 +21,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.ImageFormatConstants;
import androidx.camera.core.impl.Quirk;
@@ -40,6 +41,7 @@
* Preview resolutions are used together with a large zoom in value. The same symptom happens on
* ImageAnalysis. See https://issuetracker.google.com/192129158.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExcludedSupportedSizesQuirk implements Quirk {
private static final String TAG = "ExcludedSupportedSizesQuirk";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java
index 66f15e9..c8572df 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExtraSupportedSurfaceCombinationsQuirk.java
@@ -20,6 +20,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.impl.SurfaceCombination;
import androidx.camera.core.impl.SurfaceConfig;
@@ -41,6 +42,7 @@
* additional YUV/640x480 + PRIV/PREVIEW + YUV/MAXIMUM and YUV/640x480 + YUV/PREVIEW +
* YUV/MAXIMUM configutations (See b/194149215).
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExtraSupportedSurfaceCombinationsQuirk implements Quirk {
private static final String TAG = "ExtraSupportedSurfaceCombinationsQuirk";
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java
index e8448bd..2b12b74 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCapturePixelHDRPlusQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.impl.Quirk;
@@ -29,6 +30,7 @@
* disabling ZSL, and when it is {@link ImageCapture#CAPTURE_MODE_MAXIMIZE_QUALITY}, HDR+ is
* turned on by enabling ZSL.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ImageCapturePixelHDRPlusQuirk implements Quirk {
static boolean load() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCaptureWashedOutImageQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCaptureWashedOutImageQuirk.java
index 1c4d4e0..5b2dec8 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCaptureWashedOutImageQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ImageCaptureWashedOutImageQuirk.java
@@ -22,6 +22,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
@@ -34,6 +35,7 @@
*
* <p>See b/176399765 and b/181966663.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ImageCaptureWashedOutImageQuirk implements UseTorchAsFlashQuirk {
@VisibleForTesting
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
index 2212cc4..378400a 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/JpegHalCorruptImageQuirk.java
@@ -19,6 +19,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.internal.compat.quirk.SoftwareJpegEncodingPreferredQuirk;
@@ -36,6 +37,7 @@
*
* @see <a href="https://issuetracker.google.com/159831206">issuetracker.google.com/159831206</a>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class JpegHalCorruptImageQuirk implements SoftwareJpegEncodingPreferredQuirk {
private static final Set<String> KNOWN_AFFECTED_DEVICES = new HashSet<>(
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/Nexus4AndroidLTargetAspectRatioQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/Nexus4AndroidLTargetAspectRatioQuirk.java
index 0f16efd..64e01ca 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/Nexus4AndroidLTargetAspectRatioQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/Nexus4AndroidLTargetAspectRatioQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.workaround.TargetAspectRatio;
import androidx.camera.core.impl.Quirk;
@@ -31,6 +32,7 @@
* configuring a JPEG that doesn't actually have the same aspect ratio as the maximum JPEG
* resolution. See: b/19606058.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Nexus4AndroidLTargetAspectRatioQuirk implements Quirk {
// List of devices with the issue.
private static final List<String> DEVICE_MODELS = Arrays.asList(
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java
index 970ad18..0017911 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/PreviewPixelHDRnetQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.Arrays;
@@ -35,6 +36,7 @@
* viewfinder stream to enable the wysiwyg preview, and developers can achieve WYSIWYG in their
* apps.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class PreviewPixelHDRnetQuirk implements Quirk {
/** The devices that support wysiwyg preview in 3rd party apps (go/p20-wysiwyg-hdr) */
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SamsungPreviewTargetAspectRatioQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SamsungPreviewTargetAspectRatioQuirk.java
index c5637ee..fb77c9a 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SamsungPreviewTargetAspectRatioQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/SamsungPreviewTargetAspectRatioQuirk.java
@@ -19,6 +19,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.PreviewConfig;
import androidx.camera.core.impl.Quirk;
@@ -32,6 +33,7 @@
* <p> On certain Samsung devices, the HAL provides 16:9 preview even when the Surface size is
* set to 4:3, which causes the preview to be stretched in PreviewView.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class SamsungPreviewTargetAspectRatioQuirk implements Quirk {
// List of devices with the issue.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/StillCaptureFlashStopRepeatingQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/StillCaptureFlashStopRepeatingQuirk.java
index bc50f27..8006591 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/StillCaptureFlashStopRepeatingQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/StillCaptureFlashStopRepeatingQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.Locale;
@@ -30,6 +31,7 @@
* when taking photos in dark environment with flash on/auto. Calling stopRepeating ahead of
* still capture and setRepeating again after capture is done can fix the issue. See b/172036589.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class StillCaptureFlashStopRepeatingQuirk implements Quirk {
static boolean load() {
return "SAMSUNG".equals(Build.MANUFACTURER.toUpperCase(Locale.US))
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/UseTorchAsFlashQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/UseTorchAsFlashQuirk.java
index 75650f6..1f26237 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/UseTorchAsFlashQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/UseTorchAsFlashQuirk.java
@@ -16,6 +16,7 @@
package androidx.camera.camera2.internal.compat.quirk;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -25,5 +26,6 @@
* <p>Subclasses of this interface can denote the reason why torch is required instead of AE
* pre-capture.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface UseTorchAsFlashQuirk extends Quirk {
}
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/YuvImageOnePixelShiftQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/YuvImageOnePixelShiftQuirk.java
index 0d4fa6a..06e74de 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/YuvImageOnePixelShiftQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/YuvImageOnePixelShiftQuirk.java
@@ -19,6 +19,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.core.internal.compat.quirk.OnePixelShiftQuirk;
@@ -26,6 +27,7 @@
* For these devices, workaround will be patched to shift one pixel right to left and
* duplicate the last pixel for YUV_420_888 data when converting to RGBA.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class YuvImageOnePixelShiftQuirk implements OnePixelShiftQuirk {
static boolean load(@NonNull CameraCharacteristicsCompat characteristicsCompat) {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AeFpsRange.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AeFpsRange.java
index 1f47da7..8c0be45 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AeFpsRange.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AeFpsRange.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.compat.quirk.AeFpsRangeLegacyQuirk;
import androidx.camera.core.impl.Quirks;
@@ -30,6 +31,7 @@
*
* @see AeFpsRangeLegacyQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AeFpsRange {
@Nullable
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AutoFlashAEModeDisabler.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AutoFlashAEModeDisabler.java
index fed5643..adef19f 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AutoFlashAEModeDisabler.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/AutoFlashAEModeDisabler.java
@@ -18,6 +18,7 @@
import android.hardware.camera2.CaptureRequest;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.quirk.CrashWhenTakingPhotoWithAutoFlashAEModeQuirk;
import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
@@ -25,6 +26,7 @@
* A workaround to turn off the auto flash AE mode if device has the
* {@link CrashWhenTakingPhotoWithAutoFlashAEModeQuirk}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AutoFlashAEModeDisabler {
/**
* Get AE mode corrected by the {@link CrashWhenTakingPhotoWithAutoFlashAEModeQuirk}.
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java
index 3d46881..e63fcda 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/CamcorderProfileResolutionValidator.java
@@ -20,6 +20,7 @@
import android.util.Size;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.quirk.CamcorderProfileResolutionQuirk;
import androidx.camera.core.impl.CamcorderProfileProxy;
@@ -32,6 +33,7 @@
*
* @see CamcorderProfileResolutionQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CamcorderProfileResolutionValidator {
private final CamcorderProfileResolutionQuirk mQuirk;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainer.java
index 17bacdc..988b24c 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainer.java
@@ -19,6 +19,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
import androidx.camera.camera2.internal.compat.quirk.ExcludedSupportedSizesQuirk;
@@ -31,6 +32,7 @@
*
* @see ExcludedSupportedSizesQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExcludedSupportedSizesContainer {
@NonNull
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java
index 42364de..91bf303 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ExtraSupportedSurfaceCombinationsContainer.java
@@ -17,6 +17,7 @@
package androidx.camera.camera2.internal.compat.workaround;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
import androidx.camera.camera2.internal.compat.quirk.ExtraSupportedSurfaceCombinationsQuirk;
import androidx.camera.core.impl.SurfaceCombination;
@@ -28,6 +29,7 @@
* Gets the extra supported surface combinations which are additional to the guaranteed supported
* configurations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExtraSupportedSurfaceCombinationsContainer {
private final ExtraSupportedSurfaceCombinationsQuirk mQuirk;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ImageCapturePixelHDRPlus.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ImageCapturePixelHDRPlus.java
index 22eaea8..7334bfb 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ImageCapturePixelHDRPlus.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/ImageCapturePixelHDRPlus.java
@@ -20,6 +20,7 @@
import android.hardware.camera2.CaptureRequest;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
import androidx.camera.camera2.internal.compat.quirk.ImageCapturePixelHDRPlusQuirk;
@@ -30,6 +31,7 @@
*
* @see ImageCapturePixelHDRPlusQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ImageCapturePixelHDRPlus {
/**
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/PreviewPixelHDRnet.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/PreviewPixelHDRnet.java
index c2a0684..6a001a8 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/PreviewPixelHDRnet.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/PreviewPixelHDRnet.java
@@ -19,6 +19,7 @@
import android.hardware.camera2.CaptureRequest;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
import androidx.camera.camera2.internal.compat.quirk.PreviewPixelHDRnetQuirk;
@@ -29,6 +30,7 @@
*
* @see PreviewPixelHDRnetQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class PreviewPixelHDRnet {
private PreviewPixelHDRnet() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/StillCaptureFlow.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/StillCaptureFlow.java
index 7a22956..aafd385 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/StillCaptureFlow.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/StillCaptureFlow.java
@@ -19,6 +19,7 @@
import android.hardware.camera2.CaptureRequest;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.quirk.DeviceQuirks;
import androidx.camera.camera2.internal.compat.quirk.StillCaptureFlashStopRepeatingQuirk;
@@ -28,6 +29,7 @@
* Workaround to fix device issues such as calling stopRepeating ahead of still
* capture on some devices when flash is on or auto. See b/172036589.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class StillCaptureFlow {
private final boolean mShouldStopRepeatingBeforeStillCapture;
public StillCaptureFlow() {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/TargetAspectRatio.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/TargetAspectRatio.java
index 6583a0b..ca81eca 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/TargetAspectRatio.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/TargetAspectRatio.java
@@ -18,6 +18,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.camera2.internal.compat.CameraCharacteristicsCompat;
import androidx.camera.camera2.internal.compat.quirk.AspectRatioLegacyApi21Quirk;
@@ -37,6 +38,7 @@
* @see Nexus4AndroidLTargetAspectRatioQuirk
* @see AspectRatioLegacyApi21Quirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class TargetAspectRatio {
/** 4:3 standard aspect ratio. */
public static final int RATIO_4_3 = 0;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/UseTorchAsFlash.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/UseTorchAsFlash.java
index d97c7ee..aa326ab 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/UseTorchAsFlash.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/workaround/UseTorchAsFlash.java
@@ -17,6 +17,7 @@
package androidx.camera.camera2.internal.compat.workaround;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.internal.compat.quirk.UseTorchAsFlashQuirk;
import androidx.camera.core.impl.Quirks;
@@ -25,6 +26,7 @@
*
* @see UseTorchAsFlashQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class UseTorchAsFlash {
private final boolean mHasUseTorchAsFlashQuirk;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java
index 6d54120..ef4de37 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraControl.java
@@ -18,6 +18,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.camera2.impl.Camera2ImplConfig;
@@ -47,6 +48,7 @@
* unexpected behavior depends on the options being applied.
*/
@ExperimentalCamera2Interop
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CameraControl {
/** @hide */
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraInfo.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraInfo.java
index 80fdc10..852b978 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraInfo.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2CameraInfo.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.camera2.internal.Camera2CameraInfoImpl;
@@ -32,6 +33,7 @@
* An interface for retrieving Camera2-related camera information.
*/
@ExperimentalCamera2Interop
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2CameraInfo {
private static final String TAG = "Camera2CameraInfo";
private final Camera2CameraInfoImpl mCamera2CameraInfoImpl;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java
index 9e4decc..13cc3dd 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/Camera2Interop.java
@@ -28,6 +28,7 @@
import android.hardware.camera2.CaptureResult;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.camera2.impl.Camera2ImplConfig;
@@ -36,6 +37,7 @@
/** Utilities related to interoperability with the {@link android.hardware.camera2} APIs. */
@ExperimentalCamera2Interop
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Camera2Interop {
/**
@@ -43,6 +45,7 @@
*
* @param <T> the type being built by the extendable builder.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Extender<T> {
ExtendableBuilder<T> mBaseBuilder;
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/CaptureRequestOptions.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/CaptureRequestOptions.java
index 35eddcd..1f19c3d 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/CaptureRequestOptions.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/interop/CaptureRequestOptions.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.camera2.impl.Camera2ImplConfig;
@@ -34,6 +35,7 @@
* A bundle of Camera2 capture request options.
*/
@ExperimentalCamera2Interop
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CaptureRequestOptions implements ReadableConfig {
private final Config mConfig;
@@ -101,6 +103,7 @@
/**
* Builder for creating {@link CaptureRequestOptions} instance.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements ExtendableBuilder<CaptureRequestOptions> {
private final MutableOptionsBundle mMutableOptionsBundle = MutableOptionsBundle.create();
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatTest.java
index f02c414..c8a722f 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraDeviceCompatTest.java
@@ -71,7 +71,8 @@
@Test
@Config(maxSdk = 23)
@SuppressWarnings("unchecked")
- public void createCaptureSession_createsSession_withBaseMethod() throws CameraAccessException {
+ public void createCaptureSession_createsSession_withBaseMethod()
+ throws CameraAccessException, CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_REGULAR,
mOutputs,
@@ -92,7 +93,7 @@
@Config(minSdk = 24, maxSdk = 27)
@SuppressWarnings("unchecked")
public void createCaptureSession_createsSession_byOutputConfiguration()
- throws CameraAccessException {
+ throws CameraAccessException, CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_REGULAR,
mOutputs,
@@ -111,7 +112,7 @@
@Test
@Config(minSdk = 28)
public void createCaptureSession_createsSession_bySessionConfiguration()
- throws CameraAccessException {
+ throws CameraAccessException, CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_REGULAR,
mOutputs,
@@ -127,7 +128,8 @@
@Test(expected = IllegalArgumentException.class)
@Config(maxSdk = 22)
- public void createCaptureSession_throwsForReprocessableSession() throws CameraAccessException {
+ public void createCaptureSession_throwsForReprocessableSession()
+ throws CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_REGULAR,
mOutputs,
@@ -143,7 +145,8 @@
@Test(expected = IllegalArgumentException.class)
@Config(maxSdk = 22)
- public void createCaptureSession_throwsForHighSpeedSession() throws CameraAccessException {
+ public void createCaptureSession_throwsForHighSpeedSession()
+ throws CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_HIGH_SPEED,
mOutputs,
@@ -156,7 +159,8 @@
@Test
@Config(minSdk = 23, maxSdk = 23)
@SuppressWarnings("unchecked")
- public void createCaptureSession_createsReprocessableSession() throws CameraAccessException {
+ public void createCaptureSession_createsReprocessableSession()
+ throws CameraAccessException, CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_REGULAR,
mOutputs,
@@ -181,7 +185,7 @@
@Config(minSdk = 24, maxSdk = 27)
@SuppressWarnings("unchecked")
public void createCaptureSession_createsReprocessableSession_byConfiguration()
- throws CameraAccessException {
+ throws CameraAccessException, CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_REGULAR,
mOutputs,
@@ -205,7 +209,8 @@
@Test
@Config(minSdk = 23, maxSdk = 27)
@SuppressWarnings("unchecked")
- public void createCaptureSession_createsHighSpeedSession() throws CameraAccessException {
+ public void createCaptureSession_createsHighSpeedSession()
+ throws CameraAccessException, CameraAccessExceptionCompat {
SessionConfigurationCompat sessionConfig = new SessionConfigurationCompat(
SessionConfigurationCompat.SESSION_HIGH_SPEED,
mOutputs,
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java
index 6e3cbdc..a09d6d3 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/CameraManagerCompatTest.java
@@ -77,7 +77,6 @@
mShadowCameraManager.addCallback(mInteractionCallback);
}
-
@Test
public void getCameraCharacteristicsCompat_callUnderlyingMethod()
throws CameraAccessExceptionCompat {
@@ -214,6 +213,16 @@
assertThat(unregisterCaptor.getValue()).isSameInstanceAs(originalCallback);
}
+ @Test(expected = CameraAccessExceptionCompat.class)
+ public void throwCameraAccessExceptionCompat_whenCallingGetCharacteristicsThrowAssertionError()
+ throws CameraAccessExceptionCompat {
+ when(mInteractionCallback.getCameraCharacteristics(any(String.class))).thenThrow(
+ new AssertionError("CameraManager#getCameraCharacteristics AssertionError!"));
+
+ CameraManagerCompat manager = CameraManagerCompat.from(mContext);
+ manager.getCameraCharacteristicsCompat(CAMERA_ID);
+ }
+
/**
* A Shadow of {@link CameraManager} which forwards invocations to callbacks to record
* interactions.
diff --git a/camera/camera-core/api/current.txt b/camera/camera-core/api/current.txt
index 5c5f3a3..9dbca99 100644
--- a/camera/camera-core/api/current.txt
+++ b/camera/camera-core/api/current.txt
@@ -1,17 +1,17 @@
// Signature format: 4.0
package androidx.camera.core {
- public class AspectRatio {
+ @RequiresApi(21) public class AspectRatio {
field public static final int RATIO_16_9 = 1; // 0x1
field public static final int RATIO_4_3 = 0; // 0x0
}
- public interface Camera {
+ @RequiresApi(21) public interface Camera {
method public androidx.camera.core.CameraControl getCameraControl();
method public androidx.camera.core.CameraInfo getCameraInfo();
}
- public interface CameraControl {
+ @RequiresApi(21) public interface CameraControl {
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
@@ -20,14 +20,14 @@
method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
}
- public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+ @RequiresApi(21) public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
}
- public interface CameraFilter {
+ @RequiresApi(21) public interface CameraFilter {
method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
}
- public interface CameraInfo {
+ @RequiresApi(21) public interface CameraInfo {
method public androidx.camera.core.CameraSelector getCameraSelector();
method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
method public androidx.camera.core.ExposureState getExposureState();
@@ -39,29 +39,29 @@
method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
}
- public final class CameraInfoUnavailableException extends java.lang.Exception {
+ @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
}
- public interface CameraProvider {
+ @RequiresApi(21) public interface CameraProvider {
method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
}
- public final class CameraSelector {
+ @RequiresApi(21) public final class CameraSelector {
field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
field public static final int LENS_FACING_BACK = 1; // 0x1
field public static final int LENS_FACING_FRONT = 0; // 0x0
}
- public static final class CameraSelector.Builder {
+ @RequiresApi(21) public static final class CameraSelector.Builder {
ctor public CameraSelector.Builder();
method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
method public androidx.camera.core.CameraSelector build();
method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
}
- @com.google.auto.value.AutoValue public abstract class CameraState {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
ctor public CameraState();
method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
@@ -76,12 +76,12 @@
field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
}
- public enum CameraState.ErrorType {
+ @RequiresApi(21) public enum CameraState.ErrorType {
enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
}
- @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
ctor public CameraState.StateError();
method public static androidx.camera.core.CameraState.StateError create(int);
method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
@@ -90,7 +90,7 @@
method public androidx.camera.core.CameraState.ErrorType getType();
}
- public enum CameraState.Type {
+ @RequiresApi(21) public enum CameraState.Type {
enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
@@ -98,7 +98,7 @@
enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
}
- public class CameraUnavailableException extends java.lang.Exception {
+ @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
ctor public CameraUnavailableException(int);
ctor public CameraUnavailableException(int, String?);
ctor public CameraUnavailableException(int, String?, Throwable?);
@@ -113,14 +113,14 @@
field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
}
- public final class CameraXConfig {
+ @RequiresApi(21) public final class CameraXConfig {
method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
method public int getMinimumLoggingLevel();
method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
}
- public static final class CameraXConfig.Builder {
+ @RequiresApi(21) public static final class CameraXConfig.Builder {
method public androidx.camera.core.CameraXConfig build();
method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
@@ -129,26 +129,26 @@
method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
}
- public static interface CameraXConfig.Provider {
+ @RequiresApi(21) public static interface CameraXConfig.Provider {
method public androidx.camera.core.CameraXConfig getCameraXConfig();
}
- public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+ @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
}
- public interface ExposureState {
+ @RequiresApi(21) public interface ExposureState {
method public int getExposureCompensationIndex();
method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
method public android.util.Rational getExposureCompensationStep();
method public boolean isExposureCompensationSupported();
}
- public interface ExtendableBuilder<T> {
+ @RequiresApi(21) public interface ExtendableBuilder<T> {
method public T build();
}
- public final class FocusMeteringAction {
+ @RequiresApi(21) public final class FocusMeteringAction {
method public long getAutoCancelDurationInMillis();
method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
@@ -159,7 +159,7 @@
field public static final int FLAG_AWB = 4; // 0x4
}
- public static class FocusMeteringAction.Builder {
+ @RequiresApi(21) public static class FocusMeteringAction.Builder {
ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
@@ -169,11 +169,11 @@
method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
}
- public final class FocusMeteringResult {
+ @RequiresApi(21) public final class FocusMeteringResult {
method public boolean isFocusSuccessful();
}
- public final class ImageAnalysis extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
method public void clearAnalyzer();
method public int getBackpressureStrategy();
method public int getImageQueueDepth();
@@ -188,11 +188,11 @@
field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
}
- public static interface ImageAnalysis.Analyzer {
+ @RequiresApi(21) public static interface ImageAnalysis.Analyzer {
method public void analyze(androidx.camera.core.ImageProxy);
}
- public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+ @RequiresApi(21) public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
ctor public ImageAnalysis.Builder();
method public androidx.camera.core.ImageAnalysis build();
method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
@@ -205,7 +205,7 @@
method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
}
- public final class ImageCapture extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
method public int getCaptureMode();
method public int getFlashMode();
method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
@@ -227,7 +227,7 @@
field public static final int FLASH_MODE_ON = 1; // 0x1
}
- public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+ @RequiresApi(21) public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
ctor public ImageCapture.Builder();
method public androidx.camera.core.ImageCapture build();
method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
@@ -239,7 +239,7 @@
method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
}
- public static final class ImageCapture.Metadata {
+ @RequiresApi(21) public static final class ImageCapture.Metadata {
ctor public ImageCapture.Metadata();
method public android.location.Location? getLocation();
method public boolean isReversedHorizontal();
@@ -249,21 +249,21 @@
method public void setReversedVertical(boolean);
}
- public abstract static class ImageCapture.OnImageCapturedCallback {
+ @RequiresApi(21) public abstract static class ImageCapture.OnImageCapturedCallback {
ctor public ImageCapture.OnImageCapturedCallback();
method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
method public void onError(androidx.camera.core.ImageCaptureException);
}
- public static interface ImageCapture.OnImageSavedCallback {
+ @RequiresApi(21) public static interface ImageCapture.OnImageSavedCallback {
method public void onError(androidx.camera.core.ImageCaptureException);
method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
}
- public static final class ImageCapture.OutputFileOptions {
+ @RequiresApi(21) public static final class ImageCapture.OutputFileOptions {
}
- public static final class ImageCapture.OutputFileOptions.Builder {
+ @RequiresApi(21) public static final class ImageCapture.OutputFileOptions.Builder {
ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
@@ -271,21 +271,21 @@
method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
}
- public static class ImageCapture.OutputFileResults {
+ @RequiresApi(21) public static class ImageCapture.OutputFileResults {
method public android.net.Uri? getSavedUri();
}
- public class ImageCaptureException extends java.lang.Exception {
+ @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
ctor public ImageCaptureException(int, String, Throwable?);
method public int getImageCaptureError();
}
- public interface ImageInfo {
+ @RequiresApi(21) public interface ImageInfo {
method public int getRotationDegrees();
method public long getTimestamp();
}
- public interface ImageProxy extends java.lang.AutoCloseable {
+ @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
method public void close();
method public android.graphics.Rect getCropRect();
method public int getFormat();
@@ -296,29 +296,29 @@
method public void setCropRect(android.graphics.Rect?);
}
- public static interface ImageProxy.PlaneProxy {
+ @RequiresApi(21) public static interface ImageProxy.PlaneProxy {
method public java.nio.ByteBuffer getBuffer();
method public int getPixelStride();
method public int getRowStride();
}
- public class InitializationException extends java.lang.Exception {
+ @RequiresApi(21) public class InitializationException extends java.lang.Exception {
ctor public InitializationException(String?);
ctor public InitializationException(String?, Throwable?);
ctor public InitializationException(Throwable?);
}
- public class MeteringPoint {
+ @RequiresApi(21) public class MeteringPoint {
method public float getSize();
}
- public abstract class MeteringPointFactory {
+ @RequiresApi(21) public abstract class MeteringPointFactory {
method public final androidx.camera.core.MeteringPoint createPoint(float, float);
method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
method public static float getDefaultPointSize();
}
- public final class Preview extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
method public int getTargetRotation();
method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
@@ -326,7 +326,7 @@
method public void setTargetRotation(int);
}
- public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+ @RequiresApi(21) public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
ctor public Preview.Builder();
method public androidx.camera.core.Preview build();
method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
@@ -335,22 +335,22 @@
method public androidx.camera.core.Preview.Builder setTargetRotation(int);
}
- public static interface Preview.SurfaceProvider {
+ @RequiresApi(21) public static interface Preview.SurfaceProvider {
method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
}
- @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
method public abstract android.graphics.Rect getCropRect();
method public abstract android.util.Size getResolution();
method public abstract int getRotationDegrees();
}
- public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+ @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
ctor public SurfaceOrientedMeteringPointFactory(float, float);
ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
}
- public final class SurfaceRequest {
+ @RequiresApi(21) public final class SurfaceRequest {
method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
method public void clearTransformationInfoListener();
method public android.util.Size getResolution();
@@ -359,7 +359,7 @@
method public boolean willNotProvideSurface();
}
- @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
method public abstract int getResultCode();
method public abstract android.view.Surface getSurface();
field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
@@ -369,36 +369,36 @@
field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
}
- @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
method public abstract android.graphics.Rect getCropRect();
method public abstract int getRotationDegrees();
}
- public static interface SurfaceRequest.TransformationInfoListener {
+ @RequiresApi(21) public static interface SurfaceRequest.TransformationInfoListener {
method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
}
- public class TorchState {
+ @RequiresApi(21) public class TorchState {
field public static final int OFF = 0; // 0x0
field public static final int ON = 1; // 0x1
}
- public abstract class UseCase {
+ @RequiresApi(21) public abstract class UseCase {
}
- public final class UseCaseGroup {
+ @RequiresApi(21) public final class UseCaseGroup {
method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
method public androidx.camera.core.ViewPort? getViewPort();
}
- public static final class UseCaseGroup.Builder {
+ @RequiresApi(21) public static final class UseCaseGroup.Builder {
ctor public UseCaseGroup.Builder();
method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
method public androidx.camera.core.UseCaseGroup build();
method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
}
- public final class ViewPort {
+ @RequiresApi(21) public final class ViewPort {
method public android.util.Rational getAspectRatio();
method public int getLayoutDirection();
method public int getRotation();
@@ -409,14 +409,14 @@
field public static final int FIT = 3; // 0x3
}
- public static final class ViewPort.Builder {
+ @RequiresApi(21) public static final class ViewPort.Builder {
ctor public ViewPort.Builder(android.util.Rational, int);
method public androidx.camera.core.ViewPort build();
method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
method public androidx.camera.core.ViewPort.Builder setScaleType(int);
}
- public interface ZoomState {
+ @RequiresApi(21) public interface ZoomState {
method public float getLinearZoom();
method public float getMaxZoomRatio();
method public float getMinZoomRatio();
diff --git a/camera/camera-core/api/public_plus_experimental_current.txt b/camera/camera-core/api/public_plus_experimental_current.txt
index 135a5c7..4a7ffd0 100644
--- a/camera/camera-core/api/public_plus_experimental_current.txt
+++ b/camera/camera-core/api/public_plus_experimental_current.txt
@@ -1,17 +1,17 @@
// Signature format: 4.0
package androidx.camera.core {
- public class AspectRatio {
+ @RequiresApi(21) public class AspectRatio {
field public static final int RATIO_16_9 = 1; // 0x1
field public static final int RATIO_4_3 = 0; // 0x0
}
- public interface Camera {
+ @RequiresApi(21) public interface Camera {
method public androidx.camera.core.CameraControl getCameraControl();
method public androidx.camera.core.CameraInfo getCameraInfo();
}
- public interface CameraControl {
+ @RequiresApi(21) public interface CameraControl {
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
@@ -20,14 +20,14 @@
method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
}
- public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+ @RequiresApi(21) public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
}
- public interface CameraFilter {
+ @RequiresApi(21) public interface CameraFilter {
method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
}
- public interface CameraInfo {
+ @RequiresApi(21) public interface CameraInfo {
method public androidx.camera.core.CameraSelector getCameraSelector();
method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
method public androidx.camera.core.ExposureState getExposureState();
@@ -39,29 +39,29 @@
method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
}
- public final class CameraInfoUnavailableException extends java.lang.Exception {
+ @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
}
- public interface CameraProvider {
+ @RequiresApi(21) public interface CameraProvider {
method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
}
- public final class CameraSelector {
+ @RequiresApi(21) public final class CameraSelector {
field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
field public static final int LENS_FACING_BACK = 1; // 0x1
field public static final int LENS_FACING_FRONT = 0; // 0x0
}
- public static final class CameraSelector.Builder {
+ @RequiresApi(21) public static final class CameraSelector.Builder {
ctor public CameraSelector.Builder();
method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
method public androidx.camera.core.CameraSelector build();
method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
}
- @com.google.auto.value.AutoValue public abstract class CameraState {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
ctor public CameraState();
method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
@@ -76,12 +76,12 @@
field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
}
- public enum CameraState.ErrorType {
+ @RequiresApi(21) public enum CameraState.ErrorType {
enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
}
- @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
ctor public CameraState.StateError();
method public static androidx.camera.core.CameraState.StateError create(int);
method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
@@ -90,7 +90,7 @@
method public androidx.camera.core.CameraState.ErrorType getType();
}
- public enum CameraState.Type {
+ @RequiresApi(21) public enum CameraState.Type {
enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
@@ -98,7 +98,7 @@
enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
}
- public class CameraUnavailableException extends java.lang.Exception {
+ @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
ctor public CameraUnavailableException(int);
ctor public CameraUnavailableException(int, String?);
ctor public CameraUnavailableException(int, String?, Throwable?);
@@ -113,14 +113,14 @@
field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
}
- public final class CameraXConfig {
+ @RequiresApi(21) public final class CameraXConfig {
method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
method public int getMinimumLoggingLevel();
method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
}
- public static final class CameraXConfig.Builder {
+ @RequiresApi(21) public static final class CameraXConfig.Builder {
method public androidx.camera.core.CameraXConfig build();
method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
@@ -129,29 +129,29 @@
method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
}
- public static interface CameraXConfig.Provider {
+ @RequiresApi(21) public static interface CameraXConfig.Provider {
method public androidx.camera.core.CameraXConfig getCameraXConfig();
}
- public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+ @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
}
- @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
+ @RequiresApi(21) @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalGetImage {
}
- public interface ExposureState {
+ @RequiresApi(21) public interface ExposureState {
method public int getExposureCompensationIndex();
method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
method public android.util.Rational getExposureCompensationStep();
method public boolean isExposureCompensationSupported();
}
- public interface ExtendableBuilder<T> {
+ @RequiresApi(21) public interface ExtendableBuilder<T> {
method public T build();
}
- public final class FocusMeteringAction {
+ @RequiresApi(21) public final class FocusMeteringAction {
method public long getAutoCancelDurationInMillis();
method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
@@ -162,7 +162,7 @@
field public static final int FLAG_AWB = 4; // 0x4
}
- public static class FocusMeteringAction.Builder {
+ @RequiresApi(21) public static class FocusMeteringAction.Builder {
ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
@@ -172,11 +172,11 @@
method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
}
- public final class FocusMeteringResult {
+ @RequiresApi(21) public final class FocusMeteringResult {
method public boolean isFocusSuccessful();
}
- public final class ImageAnalysis extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
method public void clearAnalyzer();
method public int getBackpressureStrategy();
method public int getImageQueueDepth();
@@ -191,11 +191,11 @@
field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
}
- public static interface ImageAnalysis.Analyzer {
+ @RequiresApi(21) public static interface ImageAnalysis.Analyzer {
method public void analyze(androidx.camera.core.ImageProxy);
}
- public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+ @RequiresApi(21) public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
ctor public ImageAnalysis.Builder();
method public androidx.camera.core.ImageAnalysis build();
method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
@@ -208,7 +208,7 @@
method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
}
- public final class ImageCapture extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
method public int getCaptureMode();
method public int getFlashMode();
method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
@@ -230,7 +230,7 @@
field public static final int FLASH_MODE_ON = 1; // 0x1
}
- public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+ @RequiresApi(21) public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
ctor public ImageCapture.Builder();
method public androidx.camera.core.ImageCapture build();
method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
@@ -242,7 +242,7 @@
method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
}
- public static final class ImageCapture.Metadata {
+ @RequiresApi(21) public static final class ImageCapture.Metadata {
ctor public ImageCapture.Metadata();
method public android.location.Location? getLocation();
method public boolean isReversedHorizontal();
@@ -252,21 +252,21 @@
method public void setReversedVertical(boolean);
}
- public abstract static class ImageCapture.OnImageCapturedCallback {
+ @RequiresApi(21) public abstract static class ImageCapture.OnImageCapturedCallback {
ctor public ImageCapture.OnImageCapturedCallback();
method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
method public void onError(androidx.camera.core.ImageCaptureException);
}
- public static interface ImageCapture.OnImageSavedCallback {
+ @RequiresApi(21) public static interface ImageCapture.OnImageSavedCallback {
method public void onError(androidx.camera.core.ImageCaptureException);
method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
}
- public static final class ImageCapture.OutputFileOptions {
+ @RequiresApi(21) public static final class ImageCapture.OutputFileOptions {
}
- public static final class ImageCapture.OutputFileOptions.Builder {
+ @RequiresApi(21) public static final class ImageCapture.OutputFileOptions.Builder {
ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
@@ -274,21 +274,21 @@
method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
}
- public static class ImageCapture.OutputFileResults {
+ @RequiresApi(21) public static class ImageCapture.OutputFileResults {
method public android.net.Uri? getSavedUri();
}
- public class ImageCaptureException extends java.lang.Exception {
+ @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
ctor public ImageCaptureException(int, String, Throwable?);
method public int getImageCaptureError();
}
- public interface ImageInfo {
+ @RequiresApi(21) public interface ImageInfo {
method public int getRotationDegrees();
method public long getTimestamp();
}
- public interface ImageProxy extends java.lang.AutoCloseable {
+ @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
method public void close();
method public android.graphics.Rect getCropRect();
method public int getFormat();
@@ -300,29 +300,29 @@
method public void setCropRect(android.graphics.Rect?);
}
- public static interface ImageProxy.PlaneProxy {
+ @RequiresApi(21) public static interface ImageProxy.PlaneProxy {
method public java.nio.ByteBuffer getBuffer();
method public int getPixelStride();
method public int getRowStride();
}
- public class InitializationException extends java.lang.Exception {
+ @RequiresApi(21) public class InitializationException extends java.lang.Exception {
ctor public InitializationException(String?);
ctor public InitializationException(String?, Throwable?);
ctor public InitializationException(Throwable?);
}
- public class MeteringPoint {
+ @RequiresApi(21) public class MeteringPoint {
method public float getSize();
}
- public abstract class MeteringPointFactory {
+ @RequiresApi(21) public abstract class MeteringPointFactory {
method public final androidx.camera.core.MeteringPoint createPoint(float, float);
method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
method public static float getDefaultPointSize();
}
- public final class Preview extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
method public int getTargetRotation();
method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
@@ -330,7 +330,7 @@
method public void setTargetRotation(int);
}
- public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+ @RequiresApi(21) public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
ctor public Preview.Builder();
method public androidx.camera.core.Preview build();
method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
@@ -339,22 +339,22 @@
method public androidx.camera.core.Preview.Builder setTargetRotation(int);
}
- public static interface Preview.SurfaceProvider {
+ @RequiresApi(21) public static interface Preview.SurfaceProvider {
method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
}
- @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
method public abstract android.graphics.Rect getCropRect();
method public abstract android.util.Size getResolution();
method public abstract int getRotationDegrees();
}
- public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+ @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
ctor public SurfaceOrientedMeteringPointFactory(float, float);
ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
}
- public final class SurfaceRequest {
+ @RequiresApi(21) public final class SurfaceRequest {
method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
method public void clearTransformationInfoListener();
method public android.util.Size getResolution();
@@ -363,7 +363,7 @@
method public boolean willNotProvideSurface();
}
- @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
method public abstract int getResultCode();
method public abstract android.view.Surface getSurface();
field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
@@ -373,36 +373,36 @@
field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
}
- @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
method public abstract android.graphics.Rect getCropRect();
method public abstract int getRotationDegrees();
}
- public static interface SurfaceRequest.TransformationInfoListener {
+ @RequiresApi(21) public static interface SurfaceRequest.TransformationInfoListener {
method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
}
- public class TorchState {
+ @RequiresApi(21) public class TorchState {
field public static final int OFF = 0; // 0x0
field public static final int ON = 1; // 0x1
}
- public abstract class UseCase {
+ @RequiresApi(21) public abstract class UseCase {
}
- public final class UseCaseGroup {
+ @RequiresApi(21) public final class UseCaseGroup {
method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
method public androidx.camera.core.ViewPort? getViewPort();
}
- public static final class UseCaseGroup.Builder {
+ @RequiresApi(21) public static final class UseCaseGroup.Builder {
ctor public UseCaseGroup.Builder();
method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
method public androidx.camera.core.UseCaseGroup build();
method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
}
- public final class ViewPort {
+ @RequiresApi(21) public final class ViewPort {
method public android.util.Rational getAspectRatio();
method public int getLayoutDirection();
method public int getRotation();
@@ -413,14 +413,14 @@
field public static final int FIT = 3; // 0x3
}
- public static final class ViewPort.Builder {
+ @RequiresApi(21) public static final class ViewPort.Builder {
ctor public ViewPort.Builder(android.util.Rational, int);
method public androidx.camera.core.ViewPort build();
method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
method public androidx.camera.core.ViewPort.Builder setScaleType(int);
}
- public interface ZoomState {
+ @RequiresApi(21) public interface ZoomState {
method public float getLinearZoom();
method public float getMaxZoomRatio();
method public float getMinZoomRatio();
diff --git a/camera/camera-core/api/restricted_current.txt b/camera/camera-core/api/restricted_current.txt
index 5c5f3a3..9dbca99 100644
--- a/camera/camera-core/api/restricted_current.txt
+++ b/camera/camera-core/api/restricted_current.txt
@@ -1,17 +1,17 @@
// Signature format: 4.0
package androidx.camera.core {
- public class AspectRatio {
+ @RequiresApi(21) public class AspectRatio {
field public static final int RATIO_16_9 = 1; // 0x1
field public static final int RATIO_4_3 = 0; // 0x0
}
- public interface Camera {
+ @RequiresApi(21) public interface Camera {
method public androidx.camera.core.CameraControl getCameraControl();
method public androidx.camera.core.CameraInfo getCameraInfo();
}
- public interface CameraControl {
+ @RequiresApi(21) public interface CameraControl {
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelFocusAndMetering();
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
method public com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> setExposureCompensationIndex(int);
@@ -20,14 +20,14 @@
method public com.google.common.util.concurrent.ListenableFuture<androidx.camera.core.FocusMeteringResult!> startFocusAndMetering(androidx.camera.core.FocusMeteringAction);
}
- public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
+ @RequiresApi(21) public static final class CameraControl.OperationCanceledException extends java.lang.Exception {
}
- public interface CameraFilter {
+ @RequiresApi(21) public interface CameraFilter {
method public java.util.List<androidx.camera.core.CameraInfo!> filter(java.util.List<androidx.camera.core.CameraInfo!>);
}
- public interface CameraInfo {
+ @RequiresApi(21) public interface CameraInfo {
method public androidx.camera.core.CameraSelector getCameraSelector();
method public androidx.lifecycle.LiveData<androidx.camera.core.CameraState!> getCameraState();
method public androidx.camera.core.ExposureState getExposureState();
@@ -39,29 +39,29 @@
method public default boolean isFocusMeteringSupported(androidx.camera.core.FocusMeteringAction);
}
- public final class CameraInfoUnavailableException extends java.lang.Exception {
+ @RequiresApi(21) public final class CameraInfoUnavailableException extends java.lang.Exception {
}
- public interface CameraProvider {
+ @RequiresApi(21) public interface CameraProvider {
method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
method public boolean hasCamera(androidx.camera.core.CameraSelector) throws androidx.camera.core.CameraInfoUnavailableException;
}
- public final class CameraSelector {
+ @RequiresApi(21) public final class CameraSelector {
field public static final androidx.camera.core.CameraSelector DEFAULT_BACK_CAMERA;
field public static final androidx.camera.core.CameraSelector DEFAULT_FRONT_CAMERA;
field public static final int LENS_FACING_BACK = 1; // 0x1
field public static final int LENS_FACING_FRONT = 0; // 0x0
}
- public static final class CameraSelector.Builder {
+ @RequiresApi(21) public static final class CameraSelector.Builder {
ctor public CameraSelector.Builder();
method public androidx.camera.core.CameraSelector.Builder addCameraFilter(androidx.camera.core.CameraFilter);
method public androidx.camera.core.CameraSelector build();
method public androidx.camera.core.CameraSelector.Builder requireLensFacing(int);
}
- @com.google.auto.value.AutoValue public abstract class CameraState {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class CameraState {
ctor public CameraState();
method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type);
method public static androidx.camera.core.CameraState create(androidx.camera.core.CameraState.Type, androidx.camera.core.CameraState.StateError?);
@@ -76,12 +76,12 @@
field public static final int ERROR_STREAM_CONFIG = 4; // 0x4
}
- public enum CameraState.ErrorType {
+ @RequiresApi(21) public enum CameraState.ErrorType {
enum_constant public static final androidx.camera.core.CameraState.ErrorType CRITICAL;
enum_constant public static final androidx.camera.core.CameraState.ErrorType RECOVERABLE;
}
- @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class CameraState.StateError {
ctor public CameraState.StateError();
method public static androidx.camera.core.CameraState.StateError create(int);
method public static androidx.camera.core.CameraState.StateError create(int, Throwable?);
@@ -90,7 +90,7 @@
method public androidx.camera.core.CameraState.ErrorType getType();
}
- public enum CameraState.Type {
+ @RequiresApi(21) public enum CameraState.Type {
enum_constant public static final androidx.camera.core.CameraState.Type CLOSED;
enum_constant public static final androidx.camera.core.CameraState.Type CLOSING;
enum_constant public static final androidx.camera.core.CameraState.Type OPEN;
@@ -98,7 +98,7 @@
enum_constant public static final androidx.camera.core.CameraState.Type PENDING_OPEN;
}
- public class CameraUnavailableException extends java.lang.Exception {
+ @RequiresApi(21) public class CameraUnavailableException extends java.lang.Exception {
ctor public CameraUnavailableException(int);
ctor public CameraUnavailableException(int, String?);
ctor public CameraUnavailableException(int, String?, Throwable?);
@@ -113,14 +113,14 @@
field public static final int CAMERA_UNKNOWN_ERROR = 0; // 0x0
}
- public final class CameraXConfig {
+ @RequiresApi(21) public final class CameraXConfig {
method public androidx.camera.core.CameraSelector? getAvailableCamerasLimiter(androidx.camera.core.CameraSelector?);
method public java.util.concurrent.Executor? getCameraExecutor(java.util.concurrent.Executor?);
method public int getMinimumLoggingLevel();
method public android.os.Handler? getSchedulerHandler(android.os.Handler?);
}
- public static final class CameraXConfig.Builder {
+ @RequiresApi(21) public static final class CameraXConfig.Builder {
method public androidx.camera.core.CameraXConfig build();
method public static androidx.camera.core.CameraXConfig.Builder fromConfig(androidx.camera.core.CameraXConfig);
method public androidx.camera.core.CameraXConfig.Builder setAvailableCamerasLimiter(androidx.camera.core.CameraSelector);
@@ -129,26 +129,26 @@
method public androidx.camera.core.CameraXConfig.Builder setSchedulerHandler(android.os.Handler);
}
- public static interface CameraXConfig.Provider {
+ @RequiresApi(21) public static interface CameraXConfig.Provider {
method public androidx.camera.core.CameraXConfig getCameraXConfig();
}
- public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+ @RequiresApi(21) public final class DisplayOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
ctor public DisplayOrientedMeteringPointFactory(android.view.Display, androidx.camera.core.CameraInfo, float, float);
}
- public interface ExposureState {
+ @RequiresApi(21) public interface ExposureState {
method public int getExposureCompensationIndex();
method public android.util.Range<java.lang.Integer!> getExposureCompensationRange();
method public android.util.Rational getExposureCompensationStep();
method public boolean isExposureCompensationSupported();
}
- public interface ExtendableBuilder<T> {
+ @RequiresApi(21) public interface ExtendableBuilder<T> {
method public T build();
}
- public final class FocusMeteringAction {
+ @RequiresApi(21) public final class FocusMeteringAction {
method public long getAutoCancelDurationInMillis();
method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAe();
method public java.util.List<androidx.camera.core.MeteringPoint!> getMeteringPointsAf();
@@ -159,7 +159,7 @@
field public static final int FLAG_AWB = 4; // 0x4
}
- public static class FocusMeteringAction.Builder {
+ @RequiresApi(21) public static class FocusMeteringAction.Builder {
ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint);
ctor public FocusMeteringAction.Builder(androidx.camera.core.MeteringPoint, int);
method public androidx.camera.core.FocusMeteringAction.Builder addPoint(androidx.camera.core.MeteringPoint);
@@ -169,11 +169,11 @@
method public androidx.camera.core.FocusMeteringAction.Builder setAutoCancelDuration(@IntRange(from=1) long, java.util.concurrent.TimeUnit);
}
- public final class FocusMeteringResult {
+ @RequiresApi(21) public final class FocusMeteringResult {
method public boolean isFocusSuccessful();
}
- public final class ImageAnalysis extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class ImageAnalysis extends androidx.camera.core.UseCase {
method public void clearAnalyzer();
method public int getBackpressureStrategy();
method public int getImageQueueDepth();
@@ -188,11 +188,11 @@
field public static final int STRATEGY_KEEP_ONLY_LATEST = 0; // 0x0
}
- public static interface ImageAnalysis.Analyzer {
+ @RequiresApi(21) public static interface ImageAnalysis.Analyzer {
method public void analyze(androidx.camera.core.ImageProxy);
}
- public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
+ @RequiresApi(21) public static final class ImageAnalysis.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageAnalysis> {
ctor public ImageAnalysis.Builder();
method public androidx.camera.core.ImageAnalysis build();
method public androidx.camera.core.ImageAnalysis.Builder setBackgroundExecutor(java.util.concurrent.Executor);
@@ -205,7 +205,7 @@
method public androidx.camera.core.ImageAnalysis.Builder setTargetRotation(int);
}
- public final class ImageCapture extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class ImageCapture extends androidx.camera.core.UseCase {
method public int getCaptureMode();
method public int getFlashMode();
method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
@@ -227,7 +227,7 @@
field public static final int FLASH_MODE_ON = 1; // 0x1
}
- public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
+ @RequiresApi(21) public static final class ImageCapture.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.ImageCapture> {
ctor public ImageCapture.Builder();
method public androidx.camera.core.ImageCapture build();
method public androidx.camera.core.ImageCapture.Builder setCaptureMode(int);
@@ -239,7 +239,7 @@
method public androidx.camera.core.ImageCapture.Builder setTargetRotation(int);
}
- public static final class ImageCapture.Metadata {
+ @RequiresApi(21) public static final class ImageCapture.Metadata {
ctor public ImageCapture.Metadata();
method public android.location.Location? getLocation();
method public boolean isReversedHorizontal();
@@ -249,21 +249,21 @@
method public void setReversedVertical(boolean);
}
- public abstract static class ImageCapture.OnImageCapturedCallback {
+ @RequiresApi(21) public abstract static class ImageCapture.OnImageCapturedCallback {
ctor public ImageCapture.OnImageCapturedCallback();
method public void onCaptureSuccess(androidx.camera.core.ImageProxy);
method public void onError(androidx.camera.core.ImageCaptureException);
}
- public static interface ImageCapture.OnImageSavedCallback {
+ @RequiresApi(21) public static interface ImageCapture.OnImageSavedCallback {
method public void onError(androidx.camera.core.ImageCaptureException);
method public void onImageSaved(androidx.camera.core.ImageCapture.OutputFileResults);
}
- public static final class ImageCapture.OutputFileOptions {
+ @RequiresApi(21) public static final class ImageCapture.OutputFileOptions {
}
- public static final class ImageCapture.OutputFileOptions.Builder {
+ @RequiresApi(21) public static final class ImageCapture.OutputFileOptions.Builder {
ctor public ImageCapture.OutputFileOptions.Builder(java.io.File);
ctor public ImageCapture.OutputFileOptions.Builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
ctor public ImageCapture.OutputFileOptions.Builder(java.io.OutputStream);
@@ -271,21 +271,21 @@
method public androidx.camera.core.ImageCapture.OutputFileOptions.Builder setMetadata(androidx.camera.core.ImageCapture.Metadata);
}
- public static class ImageCapture.OutputFileResults {
+ @RequiresApi(21) public static class ImageCapture.OutputFileResults {
method public android.net.Uri? getSavedUri();
}
- public class ImageCaptureException extends java.lang.Exception {
+ @RequiresApi(21) public class ImageCaptureException extends java.lang.Exception {
ctor public ImageCaptureException(int, String, Throwable?);
method public int getImageCaptureError();
}
- public interface ImageInfo {
+ @RequiresApi(21) public interface ImageInfo {
method public int getRotationDegrees();
method public long getTimestamp();
}
- public interface ImageProxy extends java.lang.AutoCloseable {
+ @RequiresApi(21) public interface ImageProxy extends java.lang.AutoCloseable {
method public void close();
method public android.graphics.Rect getCropRect();
method public int getFormat();
@@ -296,29 +296,29 @@
method public void setCropRect(android.graphics.Rect?);
}
- public static interface ImageProxy.PlaneProxy {
+ @RequiresApi(21) public static interface ImageProxy.PlaneProxy {
method public java.nio.ByteBuffer getBuffer();
method public int getPixelStride();
method public int getRowStride();
}
- public class InitializationException extends java.lang.Exception {
+ @RequiresApi(21) public class InitializationException extends java.lang.Exception {
ctor public InitializationException(String?);
ctor public InitializationException(String?, Throwable?);
ctor public InitializationException(Throwable?);
}
- public class MeteringPoint {
+ @RequiresApi(21) public class MeteringPoint {
method public float getSize();
}
- public abstract class MeteringPointFactory {
+ @RequiresApi(21) public abstract class MeteringPointFactory {
method public final androidx.camera.core.MeteringPoint createPoint(float, float);
method public final androidx.camera.core.MeteringPoint createPoint(float, float, float);
method public static float getDefaultPointSize();
}
- public final class Preview extends androidx.camera.core.UseCase {
+ @RequiresApi(21) public final class Preview extends androidx.camera.core.UseCase {
method public androidx.camera.core.ResolutionInfo? getResolutionInfo();
method public int getTargetRotation();
method @UiThread public void setSurfaceProvider(java.util.concurrent.Executor, androidx.camera.core.Preview.SurfaceProvider?);
@@ -326,7 +326,7 @@
method public void setTargetRotation(int);
}
- public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
+ @RequiresApi(21) public static final class Preview.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.core.Preview> {
ctor public Preview.Builder();
method public androidx.camera.core.Preview build();
method public androidx.camera.core.Preview.Builder setTargetAspectRatio(int);
@@ -335,22 +335,22 @@
method public androidx.camera.core.Preview.Builder setTargetRotation(int);
}
- public static interface Preview.SurfaceProvider {
+ @RequiresApi(21) public static interface Preview.SurfaceProvider {
method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
}
- @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class ResolutionInfo {
method public abstract android.graphics.Rect getCropRect();
method public abstract android.util.Size getResolution();
method public abstract int getRotationDegrees();
}
- public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
+ @RequiresApi(21) public class SurfaceOrientedMeteringPointFactory extends androidx.camera.core.MeteringPointFactory {
ctor public SurfaceOrientedMeteringPointFactory(float, float);
ctor public SurfaceOrientedMeteringPointFactory(float, float, androidx.camera.core.UseCase);
}
- public final class SurfaceRequest {
+ @RequiresApi(21) public final class SurfaceRequest {
method public void addRequestCancellationListener(java.util.concurrent.Executor, Runnable);
method public void clearTransformationInfoListener();
method public android.util.Size getResolution();
@@ -359,7 +359,7 @@
method public boolean willNotProvideSurface();
}
- @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.Result {
method public abstract int getResultCode();
method public abstract android.view.Surface getSurface();
field public static final int RESULT_INVALID_SURFACE = 2; // 0x2
@@ -369,36 +369,36 @@
field public static final int RESULT_WILL_NOT_PROVIDE_SURFACE = 4; // 0x4
}
- @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract static class SurfaceRequest.TransformationInfo {
method public abstract android.graphics.Rect getCropRect();
method public abstract int getRotationDegrees();
}
- public static interface SurfaceRequest.TransformationInfoListener {
+ @RequiresApi(21) public static interface SurfaceRequest.TransformationInfoListener {
method public void onTransformationInfoUpdate(androidx.camera.core.SurfaceRequest.TransformationInfo);
}
- public class TorchState {
+ @RequiresApi(21) public class TorchState {
field public static final int OFF = 0; // 0x0
field public static final int ON = 1; // 0x1
}
- public abstract class UseCase {
+ @RequiresApi(21) public abstract class UseCase {
}
- public final class UseCaseGroup {
+ @RequiresApi(21) public final class UseCaseGroup {
method public java.util.List<androidx.camera.core.UseCase!> getUseCases();
method public androidx.camera.core.ViewPort? getViewPort();
}
- public static final class UseCaseGroup.Builder {
+ @RequiresApi(21) public static final class UseCaseGroup.Builder {
ctor public UseCaseGroup.Builder();
method public androidx.camera.core.UseCaseGroup.Builder addUseCase(androidx.camera.core.UseCase);
method public androidx.camera.core.UseCaseGroup build();
method public androidx.camera.core.UseCaseGroup.Builder setViewPort(androidx.camera.core.ViewPort);
}
- public final class ViewPort {
+ @RequiresApi(21) public final class ViewPort {
method public android.util.Rational getAspectRatio();
method public int getLayoutDirection();
method public int getRotation();
@@ -409,14 +409,14 @@
field public static final int FIT = 3; // 0x3
}
- public static final class ViewPort.Builder {
+ @RequiresApi(21) public static final class ViewPort.Builder {
ctor public ViewPort.Builder(android.util.Rational, int);
method public androidx.camera.core.ViewPort build();
method public androidx.camera.core.ViewPort.Builder setLayoutDirection(int);
method public androidx.camera.core.ViewPort.Builder setScaleType(int);
}
- public interface ZoomState {
+ @RequiresApi(21) public interface ZoomState {
method public float getLinearZoom();
method public float getMaxZoomRatio();
method public float getMinZoomRatio();
diff --git a/camera/camera-core/build.gradle b/camera/camera-core/build.gradle
index 87b0277..26487d1 100644
--- a/camera/camera-core/build.gradle
+++ b/camera/camera-core/build.gradle
@@ -51,6 +51,7 @@
})
testImplementation("androidx.exifinterface:exifinterface:1.3.2")
+ androidTestImplementation(libs.multidex)
androidTestImplementation(libs.testExtJunit)
androidTestImplementation(libs.testCore)
androidTestImplementation(libs.testRunner)
@@ -78,7 +79,7 @@
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
externalNativeBuild {
def versionScript = file("src/main/cpp/jni.lds").getAbsolutePath()
cmake {
diff --git a/camera/camera-core/lint.xml b/camera/camera-core/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-core/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java
index 0013339..7cee794c 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageProxyTest.java
@@ -28,6 +28,7 @@
import androidx.annotation.OptIn;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -41,6 +42,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class AndroidImageProxyTest {
private static final long INITIAL_TIMESTAMP = 138990020L;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java
index 53a4333..6c6136f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/AndroidImageReaderProxyTest.java
@@ -33,6 +33,7 @@
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Before;
import org.junit.Test;
@@ -41,6 +42,7 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class AndroidImageReaderProxyTest {
private final ImageReader mImageReader = mock(ImageReader.class);
private ImageReaderProxy mImageReaderProxy;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
index 04937f2..a34bbd7 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/CameraXTest.java
@@ -27,6 +27,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.After;
import org.junit.Before;
@@ -41,6 +42,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CameraXTest {
private Context mContext;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java
index 0e873a7..de7c213 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCase.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.UseCaseConfig;
@@ -32,6 +33,7 @@
* <p>This is used to complement the {@link FakeUseCase} for testing instances where a use case of
* different type is created.
*/
+@RequiresApi(21)
public class FakeOtherUseCase extends UseCase {
private volatile boolean mIsDetached = false;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
index 4abb61e..6e221b0 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/FakeOtherUseCaseConfig.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.impl.Config;
@@ -26,12 +27,11 @@
import androidx.camera.core.impl.OptionsBundle;
import androidx.camera.core.impl.SessionConfig;
import androidx.camera.core.impl.UseCaseConfig;
-import androidx.core.util.Consumer;
-import java.util.Collection;
import java.util.UUID;
/** A fake configuration for {@link FakeOtherUseCase}. */
+@RequiresApi(21)
public class FakeOtherUseCaseConfig implements UseCaseConfig<FakeOtherUseCase> {
private final Config mConfig;
@@ -184,16 +184,5 @@
getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, eventCallback);
return this;
}
-
- /** @hide */
- @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
}
}
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
index aaa9ed5..32e1649 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ForwardingImageProxyTest.java
@@ -27,6 +27,7 @@
import androidx.annotation.OptIn;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -41,6 +42,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class ForwardingImageProxyTest {
private final ImageProxy mBaseImageProxy = mock(ImageProxy.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
index 880191d..ec851c5 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisAbstractAnalyzerTest.java
@@ -39,6 +39,7 @@
import androidx.camera.testing.fakes.FakeImageInfo;
import androidx.camera.testing.fakes.FakeImageProxy;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import com.google.common.util.concurrent.ListenableFuture;
@@ -56,6 +57,7 @@
*/
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class ImageAnalysisAbstractAnalyzerTest {
private static final int WIDTH = 8;
private static final int HEIGHT = 8;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java
index 59247ca..54ba2b2 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageAnalysisDeviceTest.java
@@ -28,6 +28,7 @@
import androidx.camera.testing.fakes.FakeCameraInfoInternal;
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -35,6 +36,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class ImageAnalysisDeviceTest {
private final CameraInternal mMockCameraInternal = mock(CameraInternal.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
index bbd6f61..4ad0e86 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageCaptureTest.java
@@ -48,6 +48,7 @@
import androidx.exifinterface.media.ExifInterface;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Before;
@@ -76,6 +77,7 @@
*/
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class ImageCaptureTest {
private CameraUseCaseAdapter mCameraUseCaseAdapter;
private final Instrumentation mInstrumentation = InstrumentationRegistry.getInstrumentation();
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
index 1ddc65d..2b979d9 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProcessingUtilTest.java
@@ -26,6 +26,7 @@
import androidx.camera.testing.fakes.FakeImageInfo;
import androidx.camera.testing.fakes.FakeImageProxy;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.After;
@@ -35,6 +36,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class ImageProcessingUtilTest {
private static final int WIDTH = 8;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java
index e908f70..cc7e0d2 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageProxyDownsamplerTest.java
@@ -25,6 +25,7 @@
import androidx.annotation.NonNull;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -34,6 +35,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class ImageProxyDownsamplerTest {
private static final int WIDTH = 8;
private static final int HEIGHT = 8;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java
index 4b7be25..0ac83ab 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageReaderProxysTest.java
@@ -46,6 +46,7 @@
*/
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class ImageReaderProxysTest {
private ExecutorService mConsumerExecutor;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java
index 1738617..5037730 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/ImageSaverTest.java
@@ -48,6 +48,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.rule.GrantPermissionRule;
import org.junit.After;
@@ -76,6 +77,7 @@
*/
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class ImageSaverTest {
private static final int WIDTH = 160;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java
index ecf0c0b..fb7b030 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/IoExecutorTest.java
@@ -19,6 +19,7 @@
import androidx.annotation.GuardedBy;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -32,6 +33,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class IoExecutorTest {
private Executor mIoExecutor;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java
index 6c2b905..8a0a68f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/MetadataImageReaderTest.java
@@ -31,6 +31,7 @@
import androidx.camera.testing.fakes.FakeImageReaderProxy;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.After;
import org.junit.Before;
@@ -46,6 +47,7 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class MetadataImageReaderTest {
private static final long TIMESTAMP_0 = 0L;
private static final long TIMESTAMP_1 = 1000L;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
index dbf19e5..7287460 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SafeCloseImageReaderProxyTest.java
@@ -31,6 +31,7 @@
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.camera.testing.fakes.FakeImageReaderProxy;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -39,6 +40,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class SafeCloseImageReaderProxyTest {
private FakeImageReaderProxy mFakeImageReaderProxy;
private SafeCloseImageReaderProxy mSafeCloseImageReaderProxy;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java
index 04fed7a..eb095d9 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SingleCloseImageProxyTest.java
@@ -21,6 +21,7 @@
import static org.mockito.Mockito.verify;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -29,6 +30,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class SingleCloseImageProxyTest {
private final ImageProxy mImageProxy = mock(ImageProxy.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
index 4389db1..efa2d2f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/SurfaceRequestTest.java
@@ -37,6 +37,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.After;
@@ -52,6 +53,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class SurfaceRequestTest {
private static final Size FAKE_SIZE = new Size(0, 0);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java
index 71cc836..39772e4 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/UseCaseTest.java
@@ -49,6 +49,7 @@
import androidx.camera.testing.fakes.FakeUseCaseConfig;
import androidx.camera.testing.fakes.FakeUseCaseConfigFactory;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -60,6 +61,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class UseCaseTest {
private static final Size SURFACE_RESOLUTION = new Size(640, 480);
private CameraInternal mMockCameraInternal;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
index 45b1947..ce31a22 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CamcorderProfileProxyTest.kt
@@ -18,6 +18,7 @@
import android.media.CamcorderProfile
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Assume.assumeTrue
@@ -27,6 +28,7 @@
@RunWith(AndroidJUnit4::class)
@SmallTest
@Suppress("DEPRECATION")
+@SdkSuppress(minSdkVersion = 21)
public class CamcorderProfileProxyTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java
index 4bb7423..77cd42f 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureCallbacksTest.java
@@ -25,12 +25,14 @@
import androidx.camera.core.impl.CameraCaptureCallbacks.NoOpCameraCaptureCallback;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class CameraCaptureCallbacksTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java
index 3369e35..c0d99fe 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CameraCaptureFailureTest.java
@@ -20,6 +20,7 @@
import androidx.camera.core.impl.CameraCaptureFailure.Reason;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -27,6 +28,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class CameraCaptureFailureTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java
index 148e9b7..371bd8a 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/CaptureConfigTest.java
@@ -30,6 +30,7 @@
import androidx.camera.testing.DeferrableSurfacesUtil;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import com.google.common.collect.Lists;
@@ -42,6 +43,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class CaptureConfigTest {
private static final Option<Integer> OPTION = Config.Option.create(
"camerax.test.option_0", Integer.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
index a76dc4d..b5d0248 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ConstantObservableTest.kt
@@ -20,6 +20,7 @@
import androidx.camera.testing.asFlow
import androidx.concurrent.futures.await
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CompletableDeferred
@@ -33,6 +34,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class ConstantObservableTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java
index 2f1684c..a83af98 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/DeferrableSurfacesTest.java
@@ -30,6 +30,7 @@
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import com.google.common.util.concurrent.ListenableFuture;
@@ -49,6 +50,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class DeferrableSurfacesTest {
private ScheduledExecutorService mScheduledExecutorService;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java
index dae33b0..1eea3f5 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ImmediateSurfaceTest.java
@@ -27,6 +27,7 @@
import androidx.camera.core.impl.utils.futures.FutureCallback;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import com.google.common.util.concurrent.ListenableFuture;
@@ -42,6 +43,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class ImmediateSurfaceTest {
private Surface mMockSurface = Mockito.mock(Surface.class);
private ImmediateSurface mImmediateSurface;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
index 805fb7b..79413be 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/LiveDataObservableTest.kt
@@ -19,6 +19,7 @@
import androidx.camera.testing.asFlow
import androidx.concurrent.futures.await
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import androidx.testutils.assertThrows
import com.google.common.truth.Truth.assertThat
@@ -34,6 +35,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class LiveDataObservableTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java
index 4666f7e..26bf8fd 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/SessionConfigTest.java
@@ -29,6 +29,7 @@
import androidx.camera.testing.fakes.FakeMultiValueSet;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import com.google.common.collect.Lists;
@@ -41,6 +42,7 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class SessionConfigTest {
private static final Option<Integer> OPTION = Option.create(
"camerax.test.option_0", Integer.class);
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt
index 0d901b2..0052b91 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/StateObservableTest.kt
@@ -20,6 +20,7 @@
import androidx.concurrent.futures.await
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import androidx.testutils.assertThrows
import com.google.common.truth.Truth.assertThat
@@ -42,6 +43,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class StateObservableTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
index e7afeb1..1d44d7b 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/UseCaseAttachStateTest.java
@@ -30,6 +30,7 @@
import androidx.camera.testing.DeferrableSurfacesUtil;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -39,6 +40,7 @@
@MediumTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class UseCaseAttachStateTest {
private final CameraDevice mMockCameraDevice = mock(CameraDevice.class);
private final CameraCaptureSession mMockCameraCaptureSession =
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java
index 5487370..976dcb3 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/ViewPortsTest.java
@@ -37,6 +37,7 @@
import androidx.camera.core.internal.ViewPorts;
import androidx.camera.testing.fakes.FakeUseCase;
import androidx.camera.testing.fakes.FakeUseCaseConfig;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -56,6 +57,7 @@
@SmallTest
@SuppressLint("UnsupportedTestRunner")
@RunWith(Enclosed.class)
+@SdkSuppress(minSdkVersion = 21)
public class ViewPortsTest {
// Rotation degrees.
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt
index 8b88aa5..c6386b0 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/ExifOutputStreamTest.kt
@@ -21,11 +21,13 @@
import androidx.camera.core.impl.CameraCaptureMetaData
import androidx.exifinterface.media.ExifInterface
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import java.io.File
@LargeTest
+@SdkSuppress(minSdkVersion = 21)
public class ExifOutputStreamTest {
@Test
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java
index 18beebd..ae61ac2 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/impl/utils/executors/HandlerScheduledExecutorServiceTest.java
@@ -29,6 +29,7 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Test;
@@ -47,6 +48,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class HandlerScheduledExecutorServiceTest {
private static final long DELAYED_TASK_DELAY_MILLIS = 250;
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
index b137450..3c4aa14 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.java
@@ -49,6 +49,7 @@
import androidx.test.annotation.UiThreadTest;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -63,6 +64,7 @@
/** JUnit test cases for {@link CameraUseCaseAdapter} class. */
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class CameraUseCaseAdapterTest {
FakeCameraDeviceSurfaceManager mFakeCameraDeviceSurfaceManager;
FakeCamera mFakeCamera;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
index 80198a0..4ed7152 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageProxy.java
@@ -22,11 +22,13 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.TagBundle;
import java.nio.ByteBuffer;
/** An {@link ImageProxy} which wraps around an {@link Image}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class AndroidImageProxy implements ImageProxy {
@GuardedBy("this")
private final Image mImage;
@@ -96,6 +98,7 @@
}
/** An {@link ImageProxy.PlaneProxy} which wraps around an {@link Image.Plane}. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
private static final class PlaneProxy implements ImageProxy.PlaneProxy {
@GuardedBy("this")
private final Image.Plane mPlane;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
index a2ac50e..ea2a97e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AndroidImageReaderProxy.java
@@ -23,6 +23,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageReaderProxy;
import androidx.camera.core.impl.utils.MainThreadAsyncHandler;
@@ -34,6 +35,7 @@
* <p>All methods map one-to-one between this {@link ImageReaderProxy} and the wrapped {@link
* ImageReader}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class AndroidImageReaderProxy implements ImageReaderProxy {
@GuardedBy("this")
private final ImageReader mImageReader;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java b/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java
index 3233526..ac5f593 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/AspectRatio.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.IntDef;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import java.lang.annotation.Retention;
@@ -27,6 +28,7 @@
*
* <p>Aspect ratio is the ratio of width to height.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AspectRatio {
/** 4:3 standard aspect ratio. */
public static final int RATIO_4_3 = 0;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Camera.java b/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
index 4f29e186..ee03877b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Camera.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.CameraConfig;
import androidx.camera.core.impl.CameraInternal;
@@ -34,6 +35,7 @@
*androidx.lifecycle.LifecycleOwner, CameraSelector, UseCase...) An example} of how to obtain an
* instance of this class can be found in the {@link androidx.camera.lifecycle} package.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Camera {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java
index 4484992..2e00cd3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraClosedException.java
@@ -16,9 +16,11 @@
package androidx.camera.core;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/** This exception is thrown when request is cancelled due to that camera is closed */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CameraClosedException extends RuntimeException {
/** @hide */
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
index 9fa6afc..d24a652 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraControl.java
@@ -18,6 +18,7 @@
import androidx.annotation.FloatRange;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import com.google.common.util.concurrent.ListenableFuture;
@@ -40,6 +41,7 @@
* {@link ListenableFuture} will fail immediately with
* {@link CameraControl.OperationCanceledException}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraControl {
/**
* Enable the torch or disable the torch.
@@ -187,6 +189,7 @@
* {@link Future#cancel(boolean)}, {@link OperationCanceledException} occurs when there is
* something wrong inside CameraControl and it has to cancel the operation.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class OperationCanceledException extends Exception {
/** @hide */
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
index fc0f985..fb29ce2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraExecutor.java
@@ -18,6 +18,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraFactory;
import androidx.core.util.Preconditions;
@@ -32,6 +33,7 @@
/**
* A camera executor class that executes camera operations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CameraExecutor implements Executor {
private static final String TAG = "CameraExecutor";
private static final int DEFAULT_CORE_THREADS = 1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
index 99bc713..c71d8ec 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraFilter.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.CameraConfig;
import androidx.camera.core.impl.ExtendedCameraConfigProviderStore;
@@ -27,6 +28,7 @@
/**
* An interface for filtering cameras.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraFilter {
/**
* Default identifier of camera filter.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
index b479649..cb387cf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfo.java
@@ -19,6 +19,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.StringDef;
@@ -35,6 +36,7 @@
*
* <p>Applications can retrieve an instance via {@link Camera#getCameraInfo()}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraInfo {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java
index f3f4cc0..88ba0d4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraInfoUnavailableException.java
@@ -16,10 +16,12 @@
package androidx.camera.core;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
/** An exception thrown when unable to retrieve information about a camera. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraInfoUnavailableException extends Exception {
/** @hide */
@RestrictTo(Scope.LIBRARY_GROUP)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
index 8a80db0..ffec29fc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraProvider.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -29,6 +30,7 @@
* allows the applications to check whether any camera exists to fulfill the requirements or to
* get {@link CameraInfo} instances of all cameras to retrieve the camera information.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraProvider {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
index 9ddde07..c3d43b0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraSelector.java
@@ -18,6 +18,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CameraInternal;
@@ -34,6 +35,7 @@
* A set of requirements and priorities used to select a camera or return a filtered set of
* cameras.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraSelector {
/** A camera on the device facing the same direction as the device's screen. */
@@ -189,6 +191,7 @@
}
/** Builder for a {@link CameraSelector}. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder {
private final LinkedHashSet<CameraFilter> mCameraFilterSet;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
index e87b5a3..16e5e58 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraState.java
@@ -21,6 +21,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -130,6 +131,7 @@
*
* <p>Whenever the camera encounters an error, it reports it through {@link #getError()}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class CameraState {
@@ -256,6 +258,7 @@
* {@link #ERROR_STREAM_CONFIG}, {@link #ERROR_CAMERA_DISABLED},
* {@link #ERROR_CAMERA_FATAL_ERROR} and {@link #ERROR_DO_NOT_DISTURB_MODE_ENABLED}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public enum ErrorType {
/**
* An error the camera encountered that CameraX will attempt to recover from.
@@ -277,6 +280,7 @@
}
/** States the camera can be in. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public enum Type {
/**
* Represents a state where the camera is waiting for a signal to attempt to open the camera
@@ -438,6 +442,7 @@
* </tr>
* </table>
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract static class StateError {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java
index 354c71c..2e951d1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraUnavailableException.java
@@ -20,6 +20,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import java.lang.annotation.Retention;
@@ -29,6 +30,7 @@
* {@code CameraUnavailableException} is thrown when a camera device could not be queried or opened
* or if the connection to an opened camera device is no longer valid.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraUnavailableException extends Exception {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
index 03dd3dd..7c480ad 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraX.java
@@ -31,6 +31,7 @@
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CameraDeviceSurfaceManager;
@@ -62,6 +63,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@MainThread
@RestrictTo(Scope.LIBRARY_GROUP)
public final class CameraX {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
index b85a908..c9272f5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraXConfig.java
@@ -23,6 +23,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CameraDeviceSurfaceManager;
@@ -57,6 +58,7 @@
* @see CameraXConfig.Builder
*/
@SuppressWarnings("HiddenSuperclass")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraXConfig implements TargetConfig<CameraX> {
/**
@@ -69,6 +71,7 @@
* androidx.camera.lifecycle.ProcessCameraProvider#getInstance(android.content.Context)
* Examples} of how this is used can be found in the {@link androidx.camera.lifecycle} package.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Provider {
/** Returns the configuration to use for initializing an instance of CameraX. */
@NonNull
@@ -202,6 +205,7 @@
/** A builder for generating {@link CameraXConfig} objects. */
@SuppressWarnings("ObjectToString")
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder
implements TargetConfig.Builder<CameraX, CameraXConfig.Builder> {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java
index d56a818..175c36d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraXThreads.java
@@ -16,6 +16,7 @@
package androidx.camera.core;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -25,6 +26,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class CameraXThreads {
/** @hide */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java b/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
index c441810..e8470cf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CaptureBundles.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CaptureBundle;
import androidx.camera.core.impl.CaptureStage;
@@ -28,6 +29,7 @@
/**
* Different implementations of {@link CaptureBundle}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CaptureBundles {
/** Creates a {@link CaptureBundle} which contain a single default {@link CaptureStage}. */
@NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java b/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java
index 31610f1..f614281 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CaptureProcessorPipeline.java
@@ -22,6 +22,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CaptureProcessor;
import androidx.camera.core.impl.ImageProxyBundle;
import androidx.camera.core.impl.ImageReaderProxy;
@@ -38,6 +39,7 @@
/**
* A CaptureProcessor which can link two CaptureProcessors.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class CaptureProcessorPipeline implements CaptureProcessor {
private final CaptureProcessor mPreCaptureProcessor;
private final CaptureProcessor mPostCaptureProcessor;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java
index fda57c8..2f24daa 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/DisplayOrientedMeteringPointFactory.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.CameraInfoInternal;
@@ -48,6 +49,7 @@
*
* @see MeteringPoint
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class DisplayOrientedMeteringPointFactory extends MeteringPointFactory {
/** The logical width of FoV in current display orientation */
private final float mWidth;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java b/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java
index b84dc050..a5f3634 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ExperimentalGetImage.java
@@ -20,6 +20,7 @@
import android.media.Image;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresOptIn;
import java.lang.annotation.Retention;
@@ -36,6 +37,7 @@
* {@link Image#close()}. Instead when the Image needs to be closed, {@link ImageProxy#close()}
* should be called on the ImageProxy from which the Image was retrieved.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@Retention(CLASS)
@RequiresOptIn
public @interface ExperimentalGetImage {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java b/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java
index 7979a74..be7699d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ExposureState.java
@@ -20,12 +20,14 @@
import android.util.Rational;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* An interface which contains the camera exposure related information.
*
* <p>Applications can retrieve an instance via {@link CameraInfo#getExposureState()}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ExposureState {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java b/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java
index ab417ba..bbb6251 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ExtendableBuilder.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.MutableConfig;
@@ -26,6 +27,7 @@
*
* @param <T> the type being built by this builder.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ExtendableBuilder<T> {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
index 4173040..a7adde0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringAction.java
@@ -19,6 +19,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.core.util.Preconditions;
@@ -67,6 +68,7 @@
* default the auto-cancel duration is 5 seconds. Apps can call {@link Builder#disableAutoCancel()}
* to disable auto-cancel.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FocusMeteringAction {
/**
@@ -154,6 +156,7 @@
/**
* The builder used to create the {@link FocusMeteringAction}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class Builder {
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
final List<MeteringPoint> mMeteringPointsAf = new ArrayList<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java
index f7afcc3..ce43cbf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/FocusMeteringResult.java
@@ -17,11 +17,13 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/**
* Result of the {@link CameraControl#startFocusAndMetering(FocusMeteringAction)}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FocusMeteringResult {
private boolean mIsFocusSuccessful;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
index 3372c84..672dd35 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ForwardingImageProxy.java
@@ -22,6 +22,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.HashSet;
import java.util.Set;
@@ -35,6 +36,7 @@
* <p>Listeners for the image close call can be added. When the image is closed, the listeners will
* be notified.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
abstract class ForwardingImageProxy implements ImageProxy {
@GuardedBy("this")
protected final ImageProxy mImage;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
index c690dbef..6431f05 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysis.java
@@ -26,7 +26,6 @@
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_RESOLUTION;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
-import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -51,6 +50,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CameraInfoInternal;
@@ -74,13 +74,11 @@
import androidx.camera.core.internal.TargetConfig;
import androidx.camera.core.internal.ThreadConfig;
import androidx.camera.core.internal.compat.quirk.OnePixelShiftQuirk;
-import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
import androidx.lifecycle.LifecycleOwner;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executor;
@@ -96,6 +94,7 @@
* Failing to close the image will cause future images to be stalled or dropped depending on the
* backpressure strategy.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageAnalysis extends UseCase {
////////////////////////////////////////////////////////////////////////////////////////////
@@ -675,6 +674,7 @@
* to receive images and perform custom processing by implementing the
* {@link ImageAnalysis.Analyzer#analyze(ImageProxy)} function.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Analyzer {
/**
* Analyzes an image to produce a result.
@@ -722,6 +722,7 @@
*
* @hide
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public static final class Defaults implements ConfigProvider<ImageAnalysisConfig> {
private static final Size DEFAULT_TARGET_RESOLUTION = new Size(640, 480);
@@ -748,6 +749,7 @@
/** Builder for a {@link ImageAnalysis}. */
@SuppressWarnings("ObjectToString")
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder
implements ImageOutputConfig.Builder<Builder>,
ThreadConfig.Builder<Builder>,
@@ -1209,16 +1211,5 @@
imageReaderProxyProvider);
return this;
}
-
- /** @hide */
- @RestrictTo(Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
}
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
index d7dc3f1..12d1f07 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisAbstractAnalyzer.java
@@ -23,6 +23,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageReaderProxy;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -39,6 +40,7 @@
* This is an extension of {@link ImageAnalysis}. It has the same lifecycle and share part of the
* states.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
abstract class ImageAnalysisAbstractAnalyzer implements ImageReaderProxy.OnImageAvailableListener {
private static final String TAG = "ImageAnalysisAnalyzer";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java
index df579f5..4463eda 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisBlockingAnalyzer.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageReaderProxy;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.camera.core.impl.utils.futures.FutureCallback;
@@ -30,6 +31,7 @@
*
* <p> Used with {@link ImageAnalysis}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageAnalysisBlockingAnalyzer extends ImageAnalysisAbstractAnalyzer {
@Nullable
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java
index 9fec57b..4ffa539 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageAnalysisNonBlockingAnalyzer.java
@@ -19,6 +19,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.core.impl.ImageReaderProxy;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -34,6 +35,7 @@
*
* <p> Used with {@link ImageAnalysis}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageAnalysisNonBlockingAnalyzer extends ImageAnalysisAbstractAnalyzer {
// The executor for managing cached image.
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 3ed0819..55d1539 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
@@ -40,7 +40,6 @@
import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_USE_CASE_EVENT_CALLBACK;
import static androidx.camera.core.impl.ImageCaptureConfig.OPTION_USE_SOFTWARE_JPEG_ENCODER;
import static androidx.camera.core.impl.ImageInputConfig.OPTION_INPUT_FORMAT;
-import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
import static androidx.camera.core.internal.utils.ImageUtil.min;
import static androidx.camera.core.internal.utils.ImageUtil.sizeToVertexes;
@@ -71,6 +70,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.UiThread;
@@ -118,7 +118,6 @@
import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability;
import androidx.camera.core.internal.utils.ImageUtil;
import androidx.concurrent.futures.CallbackToFutureAdapter;
-import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
import androidx.lifecycle.LifecycleOwner;
@@ -133,7 +132,6 @@
import java.nio.ByteBuffer;
import java.util.ArrayDeque;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Deque;
import java.util.HashSet;
import java.util.List;
@@ -167,6 +165,7 @@
* <p>When capturing to memory, the captured image is made available through an {@link ImageProxy}
* via an {@link ImageCapture.OnImageCapturedCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageCapture extends UseCase {
////////////////////////////////////////////////////////////////////////////////////////////
@@ -1791,6 +1790,7 @@
}
/** Listener containing callbacks for image file I/O events. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface OnImageSavedCallback {
/** Called when an image has been successfully saved. */
void onImageSaved(@NonNull OutputFileResults outputFileResults);
@@ -1807,6 +1807,7 @@
/**
* Callback for when an image capture has completed.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract static class OnImageCapturedCallback {
/**
* Callback for when the image has been captured.
@@ -1888,6 +1889,7 @@
* either a {@link File}, {@link MediaStore} or a {@link OutputStream}. The metadata will be
* stored with the saved image. For JPEG this will be included in the EXIF.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class OutputFileOptions {
@Nullable
@@ -1958,6 +1960,7 @@
/**
* Builder class for {@link OutputFileOptions}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info
public static final class Builder {
@Nullable
private File mFile;
@@ -2048,6 +2051,7 @@
/**
* Info about the saved image file.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class OutputFileResults {
@Nullable
private Uri mSavedUri;
@@ -2070,6 +2074,7 @@
}
/** Holder class for metadata that will be saved with captured images. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Metadata {
/**
* Indicates a left-right mirroring (reflection).
@@ -2311,6 +2316,7 @@
}
@VisibleForTesting
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
static class ImageCaptureRequest {
@RotationValue
final int mRotationDegrees;
@@ -2499,6 +2505,7 @@
/** Builder for an {@link ImageCapture}. */
@SuppressWarnings("ObjectToString")
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements
UseCaseConfig.Builder<ImageCapture, ImageCaptureConfig, Builder>,
ImageOutputConfig.Builder<Builder>,
@@ -3049,16 +3056,5 @@
getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
return this;
}
-
- /** @hide */
- @RestrictTo(Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
}
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java
index 56e5f72..5847aa6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCaptureException.java
@@ -18,12 +18,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* An exception thrown to indicate an error has occurred during image capture or while saving the
* captured image. See {@link ImageCapture.OnImageCapturedCallback} and
* {@link ImageCapture.OnImageSavedCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ImageCaptureException extends Exception {
@ImageCapture.ImageCaptureError
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
index f5feed0..8ae16ad 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageInfo.java
@@ -17,11 +17,13 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.TagBundle;
import androidx.camera.core.impl.utils.ExifData;
/** Metadata for an image. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageInfo {
/**
* Returns all tags stored in the metadata.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
index 415f150..d5dbee2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProcessingUtil.java
@@ -22,11 +22,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageReaderProxy;
import java.nio.ByteBuffer;
/** Utility class to convert an {@link Image} from YUV to RGB. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageProcessingUtil {
private static final String TAG = "ImageProcessingUtil";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
index 867a605..16404a4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxy.java
@@ -22,10 +22,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
/** An image proxy which has a similar interface as {@link android.media.Image}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageProxy extends AutoCloseable {
/**
* Closes the underlying {@link android.media.Image}.
@@ -84,6 +86,7 @@
PlaneProxy[] getPlanes();
/** A plane proxy which has an analogous interface as {@link android.media.Image.Plane}. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface PlaneProxy {
/**
* Returns the row stride.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
index 08e7f24..b7a2eb9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageProxyDownsampler.java
@@ -20,10 +20,12 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
/** Utility functions for downsampling an {@link ImageProxy}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageProxyDownsampler {
private ImageProxyDownsampler() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java
index 9e38a5d..3cd407e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderFormatRecommender.java
@@ -19,9 +19,12 @@
import android.graphics.ImageFormat;
import android.media.ImageReader;
+import androidx.annotation.RequiresApi;
+
import com.google.auto.value.AutoValue;
/** Recommends formats for a combination of {@link ImageReader} instances. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageReaderFormatRecommender {
private ImageReaderFormatRecommender() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java
index a75a49d..12839ce 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxyProvider.java
@@ -17,6 +17,7 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.ImageReaderProxy;
@@ -25,6 +26,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public interface ImageReaderProxyProvider {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java
index f4cdc15..7e5ccc1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageReaderProxys.java
@@ -19,11 +19,13 @@
import android.media.ImageReader;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageReaderProxy;
/**
* Different implementations of {@link ImageReaderProxy}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageReaderProxys {
private ImageReaderProxys() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java
index 63567ae..98d2189 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageSaver.java
@@ -25,6 +25,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.Exif;
import androidx.camera.core.internal.compat.workaround.ExifRotationAvailability;
import androidx.camera.core.internal.utils.ImageUtil;
@@ -41,6 +42,7 @@
import java.util.concurrent.Executor;
import java.util.concurrent.RejectedExecutionException;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ImageSaver implements Runnable {
private static final String TAG = "ImageSaver";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
index 010bc49..e18d65a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImmutableImageInfo.java
@@ -17,11 +17,13 @@
package androidx.camera.core;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.TagBundle;
import androidx.camera.core.impl.utils.ExifData;
import com.google.auto.value.AutoValue;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
abstract class ImmutableImageInfo implements ImageInfo {
public static ImageInfo create(@NonNull TagBundle tag, long timestamp,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java b/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java
index a29b185..2ccc113 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/InitializationException.java
@@ -17,11 +17,13 @@
package androidx.camera.core;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* {@code InitializationException} is thrown when a failure occurs during an initialization
* process.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class InitializationException extends Exception {
public InitializationException(@Nullable String message) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Logger.java b/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
index f51e244..3703bbd 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Logger.java
@@ -22,6 +22,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/**
@@ -55,6 +56,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public final class Logger {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
index 168641e..fcd0a7d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MetadataImageReader.java
@@ -23,6 +23,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureCallback;
import androidx.camera.core.impl.CameraCaptureResult;
import androidx.camera.core.impl.ImageReaderProxy;
@@ -45,6 +46,7 @@
* acquired at one time as defined by <code>maxImages</code> in the constructor. Any ImageProxy
* produced after that will be dropped unless one of the ImageProxy currently acquired is closed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class MetadataImageReader implements ImageReaderProxy, ForwardingImageProxy.OnImageCloseListener {
private static final String TAG = "MetadataImageReader";
private final Object mLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java
index ddc11d9..23c2d6a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPoint.java
@@ -19,6 +19,7 @@
import android.util.Rational;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/**
@@ -49,6 +50,7 @@
* The metering rectangle defined by the {@link MeteringPoint} has the same shape as the sensor
* array.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class MeteringPoint {
private float mNormalizedX;
private float mNormalizedY;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java
index 74c8674..b0f64c6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/MeteringPointFactory.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/**
@@ -34,6 +35,7 @@
* @see #createPoint(float, float)
* @see #createPoint(float, float, float)
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class MeteringPointFactory {
/**
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 2badfe1..0d7d4c6 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
@@ -34,7 +34,6 @@
import static androidx.camera.core.impl.PreviewConfig.OPTION_TARGET_RESOLUTION;
import static androidx.camera.core.impl.PreviewConfig.OPTION_TARGET_ROTATION;
import static androidx.camera.core.impl.PreviewConfig.OPTION_USE_CASE_EVENT_CALLBACK;
-import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
import android.graphics.ImageFormat;
@@ -54,6 +53,7 @@
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.UiThread;
@@ -86,7 +86,6 @@
import androidx.core.util.Consumer;
import androidx.lifecycle.LifecycleOwner;
-import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executor;
@@ -134,6 +133,7 @@
* </code>
* </pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Preview extends UseCase {
////////////////////////////////////////////////////////////////////////////////////////////
@@ -561,6 +561,7 @@
*
* @see Preview#setSurfaceProvider(Executor, SurfaceProvider)
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface SurfaceProvider {
/**
* Called when a new {@link Surface} has been requested by the camera.
@@ -650,6 +651,7 @@
/** Builder for a {@link Preview}. */
@SuppressWarnings("ObjectToString")
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder
implements UseCaseConfig.Builder<Preview, PreviewConfig, Builder>,
ImageOutputConfig.Builder<Builder>,
@@ -1044,17 +1046,5 @@
getMutableConfig().insertOption(OPTION_PREVIEW_CAPTURE_PROCESSOR, captureProcessor);
return this;
}
-
- /** @hide */
- @RestrictTo(Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
-
}
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
index 3afb75c..9e6a52c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingImageReader.java
@@ -24,6 +24,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureCallback;
import androidx.camera.core.impl.CaptureBundle;
import androidx.camera.core.impl.CaptureProcessor;
@@ -52,6 +53,7 @@
* the {@link CaptureProcessor} set, then returns a single output ImageProxy to
* OnImageAvailableListener.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ProcessingImageReader implements ImageReaderProxy {
private static final String TAG = "ProcessingImageReader";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
index 0769084..acb6077 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ProcessingSurface.java
@@ -28,6 +28,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureCallback;
import androidx.camera.core.impl.CaptureProcessor;
import androidx.camera.core.impl.CaptureStage;
@@ -45,6 +46,7 @@
/**
* A {@link DeferrableSurface} that does processing and outputs a {@link SurfaceTexture}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ProcessingSurface extends DeferrableSurface {
private static final String TAG = "ProcessingSurfaceTextur";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java
index 8a836c7..eeee01f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ResolutionInfo.java
@@ -20,6 +20,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageOutputConfig;
import com.google.auto.value.AutoValue;
@@ -33,6 +34,7 @@
* {@link ImageAnalysis} before an {@link ImageProxy} is received from
* {@link ImageAnalysis.Analyzer}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class ResolutionInfo {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
index 5f8c672..8132309 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SafeCloseImageReaderProxy.java
@@ -21,6 +21,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageReaderProxy;
import java.util.concurrent.Executor;
@@ -29,6 +30,7 @@
* An {@link ImageReaderProxy} that wraps another ImageReaderProxy to safely wait until all
* produced {@link ImageProxy} are closed before closing the ImageReaderProxy.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class SafeCloseImageReaderProxy implements ImageReaderProxy {
// Lock to synchronize acquired ImageProxys and close.
private final Object mLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java
index 7e79369..3c45ed6 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxy.java
@@ -21,10 +21,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* An {@link ImageProxy} which overwrites the {@link ImageInfo}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SettableImageProxy extends ForwardingImageProxy{
private final ImageInfo mImageInfo;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java
index b66e09e..8bf8a73 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SettableImageProxyBundle.java
@@ -20,6 +20,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageProxyBundle;
import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -33,6 +34,7 @@
* A {@link ImageProxyBundle} with a predefined set of captured ids. The {@link ListenableFuture}
* for the capture id becomes valid when the corresponding {@link ImageProxy} has been set.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SettableImageProxyBundle implements ImageProxyBundle {
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
final Object mLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java
index 1f0ca63..a6ddb1e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SingleCloseImageProxy.java
@@ -17,8 +17,10 @@
package androidx.camera.core;
import androidx.annotation.GuardedBy;
+import androidx.annotation.RequiresApi;
/** A {@link ImageProxy} which filters out redundant calls to {@link #close()}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SingleCloseImageProxy extends ForwardingImageProxy {
@GuardedBy("this")
private boolean mClosed = false;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java
index 8529d79..3c3c74de 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOrientedMeteringPointFactory.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/**
@@ -44,6 +45,7 @@
*
* @see MeteringPoint
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class SurfaceOrientedMeteringPointFactory extends MeteringPointFactory {
/** the width of the area in surface orientation */
private final float mWidth;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
index b9fb40f..ae5c4bf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceRequest.java
@@ -30,6 +30,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.CameraInternal;
import androidx.camera.core.impl.DeferrableSurface;
@@ -60,6 +61,7 @@
*
* @see Preview.SurfaceProvider#onSurfaceRequested(SurfaceRequest)
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SurfaceRequest {
private final Size mResolution;
@@ -474,6 +476,7 @@
* Listener that receives updates of the {@link TransformationInfo} associated with the
* {@link SurfaceRequest}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface TransformationInfoListener {
/**
@@ -498,6 +501,7 @@
* Result of providing a surface to a {@link SurfaceRequest} via
* {@link #provideSurface(Surface, Executor, Consumer)}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract static class Result {
@@ -651,6 +655,7 @@
* @see CameraCharacteristics#SENSOR_ORIENTATION
* @see ViewPort
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract static class TransformationInfo {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java b/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java
index b91b28d..bf52caf 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/TorchState.java
@@ -17,12 +17,14 @@
package androidx.camera.core;
import androidx.annotation.IntDef;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** The camera flash torch state. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class TorchState {
/** Torch is off. */
public static final int OFF = 0;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
index 25ac77d..a1b203e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCase.java
@@ -27,6 +27,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CameraControlInternal;
@@ -56,6 +57,7 @@
* that are usable by a camera. UseCase also will communicate of the active/inactive state to
* the Camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class UseCase {
////////////////////////////////////////////////////////////////////////////////////////////
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
index cb5459a..0926e89 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import androidx.lifecycle.Lifecycle;
@@ -32,6 +33,7 @@
* {@link UseCaseGroup} usually share some common properties like the FOV defined by
* {@link ViewPort}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class UseCaseGroup {
@Nullable
@@ -64,6 +66,7 @@
/**
* A builder for generating {@link UseCaseGroup}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder {
private ViewPort mViewPort;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
index 1b891d9..8ef82f0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/VideoCapture.java
@@ -22,7 +22,6 @@
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_RESOLUTION;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
-import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -99,7 +98,6 @@
import androidx.camera.core.internal.utils.VideoUtil;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
-import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
@@ -110,7 +108,6 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
-import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executor;
@@ -126,6 +123,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class VideoCapture extends UseCase {
@@ -1314,6 +1312,7 @@
*
* @hide
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public static final class Defaults
implements ConfigProvider<VideoCaptureConfig> {
@@ -1836,18 +1835,6 @@
getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
return this;
}
-
- /** @hide */
- @RestrictTo(Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
-
}
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java b/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java
index bd134d5..01a01c5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ViewPort.java
@@ -23,6 +23,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.ImageOutputConfig;
import androidx.core.util.Preconditions;
@@ -54,6 +55,7 @@
* a way that only the area defined by the crop rect is visible to end users. Once the crop rect
* is applied, all the use cases will produce the same image with possibly different resolutions.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ViewPort {
/**
@@ -199,6 +201,7 @@
/**
* Builder for {@link ViewPort}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder {
private static final int DEFAULT_LAYOUT_DIRECTION = android.util.LayoutDirection.LTR;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java b/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java
index 0cbdb84..ad1e334 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ZoomState.java
@@ -16,11 +16,14 @@
package androidx.camera.core;
+import androidx.annotation.RequiresApi;
+
/**
* An interface which contains the zoom related information from a camera.
*
* <p>Applications can retrieve an instance via {@link CameraInfo#getZoomState()}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ZoomState {
/**
* Returns the zoom ratio. The value is 1.0 by default.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
index 865e2d1..e8ed228 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProvider.java
@@ -19,10 +19,12 @@
import android.media.CamcorderProfile;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* CamcorderProfileProvider is used to obtain the {@link CamcorderProfileProxy}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CamcorderProfileProvider {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
index 5f0e82e..3c37a1b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CamcorderProfileProxy.java
@@ -19,6 +19,7 @@
import android.media.CamcorderProfile;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -26,6 +27,7 @@
* CamcorderProfileProxy defines the get methods that is mapping to the fields of
* {@link CamcorderProfile}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class CamcorderProfileProxy {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java
index f82b4c5..05083ec 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallback.java
@@ -17,12 +17,14 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* A callback object for tracking the progress of a capture request submitted to the camera device.
* Once one of the methods is called, other methods won't be called again on the same instance.
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class CameraCaptureCallback {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java
index 1ca2fe0..744c289 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureCallbacks.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.Arrays;
@@ -25,6 +26,7 @@
/**
* Different implementations of {@link CameraCaptureCallback}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraCaptureCallbacks {
private CameraCaptureCallbacks() {
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java
index 279ce53d..af4b320 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureFailure.java
@@ -17,11 +17,13 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* A report of failed capture for a single image capture.
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraCaptureFailure {
private final Reason mReason;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java
index 1650b4d..3e73d54 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureMetaData.java
@@ -16,10 +16,13 @@
package androidx.camera.core.impl;
+import androidx.annotation.RequiresApi;
+
/**
* This class defines the enumeration constants used for querying the camera capture mode and
* results.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraCaptureMetaData {
private CameraCaptureMetaData() {
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java
index a808987..cdaa454 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResult.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraCaptureMetaData.AeState;
import androidx.camera.core.impl.CameraCaptureMetaData.AfMode;
import androidx.camera.core.impl.CameraCaptureMetaData.AfState;
@@ -28,6 +29,7 @@
* The result of a single image capture.
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraCaptureResult {
/** Returns the current auto focus mode of operation. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java
index 6ccf048..a6867ac 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraCaptureResults.java
@@ -18,12 +18,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageInfo;
import androidx.camera.core.internal.CameraCaptureResultImageInfo;
/**
* Utility functionality for {@link CameraCaptureResult}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraCaptureResults {
/**
* Retrieves the underlying {@link CameraCaptureResult} from the {@link ImageInfo} if the
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
index 7a9196b..90c9cac 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfig.java
@@ -19,6 +19,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.Preview;
@@ -28,6 +29,7 @@
/**
* Configuration for a {@link androidx.camera.core.Camera}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraConfig extends ReadableConfig {
// Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
index 48302fe..b535d3b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigProvider.java
@@ -20,11 +20,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraInfo;
/**
* Provides the ability to create a {@link CameraConfig} given a {@link CameraInfo}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraConfigProvider {
CameraConfigProvider EMPTY = (cameraInfo, context) -> null;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java
index fd99c72c9..1eb8774e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraConfigs.java
@@ -17,10 +17,12 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* Utility methods for operating on {@link CameraConfig} instances.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraConfigs {
private static final CameraConfig EMPTY_CONFIG = new EmptyCameraConfig();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
index cea2721..d770f51 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraControlInternal.java
@@ -21,6 +21,7 @@
import android.graphics.Rect;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraControl;
import androidx.camera.core.FocusMeteringAction;
import androidx.camera.core.FocusMeteringResult;
@@ -39,6 +40,7 @@
* triggering
* AF/AE.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraControlInternal extends CameraControl {
/** Returns the current flash mode. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java
index 00df7bd..3d16c28 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraDeviceSurfaceManager.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.InitializationException;
import java.util.List;
@@ -31,6 +32,7 @@
* Camera device manager to provide the guaranteed supported stream capabilities related info for
* all camera devices
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraDeviceSurfaceManager {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
index 1e87b19..814ea36 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFactory.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.CameraUnavailableException;
import androidx.camera.core.InitializationException;
@@ -29,6 +30,7 @@
/**
* The factory class that creates {@link CameraInternal} instances.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraFactory {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java
index 7c3be42..b40f6b41 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraFilters.java
@@ -16,6 +16,7 @@
package androidx.camera.core.impl;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraFilter;
import java.util.Collections;
@@ -23,6 +24,7 @@
/**
* Implementations of different {@link CameraFilter}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraFilters {
/**
* A camera filter which returns all input camera infos.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
index a0fd33d..d35e1d0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInfoInternal.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.CameraSelector;
import androidx.core.util.Preconditions;
@@ -30,6 +31,7 @@
*
* <p>Contains methods for retrieving characteristics for a specific camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraInfoInternal extends CameraInfo {
/**
* Returns the LensFacing of this camera.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
index c7e24bc..5987245 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraInternal.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraControl;
import androidx.camera.core.CameraInfo;
@@ -34,6 +35,7 @@
*
* <p> It is a Camera instance backed by a single physical camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CameraInternal extends Camera, UseCase.StateChangeCallback {
/**
* The state of a camera within the process.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java
index e920606..020d772 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraRepository.java
@@ -20,6 +20,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraUnavailableException;
import androidx.camera.core.InitializationException;
import androidx.camera.core.Logger;
@@ -39,6 +40,7 @@
/**
* A collection of {@link CameraInternal} instances.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraRepository {
private static final String TAG = "CameraRepository";
private final Object mCamerasLock = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java
index 0364baf..cea9370 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraStateRegistry.java
@@ -19,6 +19,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.WorkerThread;
import androidx.camera.core.Camera;
import androidx.camera.core.Logger;
@@ -37,6 +38,7 @@
* Cameras that are in a {@link CameraInternal.State#PENDING_OPEN} state can be notified when
* there is a slot available to open a camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraStateRegistry {
private static final String TAG = "CameraStateRegistry";
private final StringBuilder mDebugString = new StringBuilder();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
index 72f263f..5c98ae1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraThreadConfig.java
@@ -19,6 +19,7 @@
import android.os.Handler;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -27,6 +28,7 @@
/**
* Configuration options for threads used by the camera stack implementation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class CameraThreadConfig {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
index b09f9dd..9ec589f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CameraValidator.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.Logger;
@@ -29,6 +30,7 @@
* Validation methods to verify the camera is initialized successfully, more info please reference
* b/167201193.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraValidator {
private CameraValidator() {
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java
index 5b3c2a7..77870fd 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureBundle.java
@@ -17,12 +17,14 @@
package androidx.camera.core.impl;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
/**
* A interface to return an ordered collection of {@link CaptureStage}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CaptureBundle {
/**
* Returns a list of {@link CaptureStage} in order of how they are to be issued.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java
index 018ec009..78d4181 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureConfig.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.Collection;
@@ -37,6 +38,7 @@
* <p>The CaptureConfig contains all the {@link android.hardware.camera2} parameters that are
* required to issue a {@link CaptureRequest}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CaptureConfig {
/** Indicates template type is not set. */
public static final int TEMPLATE_TYPE_NONE = -1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java
index 54c7037b..d9073d5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureProcessor.java
@@ -19,6 +19,7 @@
import android.util.Size;
import android.view.Surface;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.Preview;
@@ -26,6 +27,7 @@
/**
* A processing step of the image capture pipeline.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CaptureProcessor {
/**
* This gets called to update where the CaptureProcessor should write the output of {@link
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java
index a93bf97..4cf81b7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/CaptureStage.java
@@ -16,9 +16,12 @@
package androidx.camera.core.impl;
+import androidx.annotation.RequiresApi;
+
/**
* A {@link CaptureConfig} with an identifier.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CaptureStage {
/** Returns the identifier for the capture. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java
index e26c48f..243f987 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Config.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -35,6 +36,7 @@
* {@link Config#retrieveOptionWithPriority} and {@link Config#getPriorities} can be used to
* retrieve option value of specified priority.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Config {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java
index 972316a..85db119 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConfigProvider.java
@@ -17,12 +17,14 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* A class which provides a {@link Config} object.
*
* @param <C> the {@link Config} type provided
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ConfigProvider<C extends Config> {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
index f090d00c..da66819 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ConstantObservable.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@@ -29,6 +30,7 @@
* An {@link Observable} whose value is set at construction time and never changes.
* @param <T> The observed type.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ConstantObservable<T> implements Observable<T> {
private static final ConstantObservable<Object> NULL_OBSERVABLE =
new ConstantObservable<>(null);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java
index 3900a5b..1352d7f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurface.java
@@ -24,6 +24,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.Logger;
@@ -45,6 +46,7 @@
* <p>Resources managed by this class can be safely cleaned up upon completion of the
* {@link ListenableFuture} returned by {@link #getTerminationFuture()}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class DeferrableSurface {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java
index ee73821..6e4789c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeferrableSurfaces.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.FutureCallback;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -39,6 +40,7 @@
/**
* Utility functions for manipulating {@link DeferrableSurface}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class DeferrableSurfaces {
private DeferrableSurfaces() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java
index 7b28a94..441f99a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/DeviceProperties.java
@@ -19,12 +19,14 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
/**
* Container of the device properties.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class DeviceProperties {
/** Creates an instance by querying the properties from {@link android.os.Build}. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
index 66fc97b..725d8af 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ExtendedCameraConfigProviderStore.java
@@ -18,6 +18,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.HashMap;
import java.util.Map;
@@ -26,6 +27,7 @@
* Stores {@link CameraConfigProvider} instances which allow building {@link CameraConfig} using
* keys (extensions modes for example). The provided {@link CameraConfig}s are unique to the device.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ExtendedCameraConfigProviderStore {
private static final Object LOCK = new Object();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java
index 1da3738..6f8bc8a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Identifier.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -25,6 +26,7 @@
* The caller should make the input value object unique when calling the {@link #create(Object)}
* function. So that the {@link Identifier} can be recognized and used for specific purposes.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class Identifier {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
index a53a1f6..5a298f1 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageAnalysisConfig.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.ImageAnalysis;
@@ -31,6 +32,7 @@
/**
* Configuration for an image analysis use case.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageAnalysisConfig
implements UseCaseConfig<ImageAnalysis>,
ImageOutputConfig,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
index c40c3ef..9c535eb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageCaptureConfig.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageCapture.CaptureMode;
@@ -31,6 +32,7 @@
/**
* Configuration for an image capture use case.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageCaptureConfig implements UseCaseConfig<ImageCapture>, ImageOutputConfig,
IoConfig {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java
index 4dff791..ac6d4c7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageFormatConstants.java
@@ -16,10 +16,13 @@
package androidx.camera.core.impl;
+import androidx.annotation.RequiresApi;
+
/**
* This class used to constant values corresponding to the internal defined image format value used
* in StreamConfigurationMap.java.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageFormatConstants {
// Internal format in StreamConfigurationMap.java that will be mapped to public ImageFormat.JPEG
public static final int INTERNAL_DEFINED_IMAGE_FORMAT_JPEG = 0x21;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java
index 63f3591..89fff66 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInfoProcessor.java
@@ -18,12 +18,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageInfo;
/**
* A processing step that updates the necessary {@link CaptureStage} based on the current
* {@link ImageInfo}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageInfoProcessor {
/**
* Returns the {@link CaptureStage} which should be issued for the processing.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java
index 225e6e6..2947d4b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageInputConfig.java
@@ -16,9 +16,11 @@
package androidx.camera.core.impl;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Camera;
/** Configuration containing options for configuring the input image data of a pipeline. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageInputConfig extends ReadableConfig {
Config.Option<Integer> OPTION_INPUT_FORMAT =
Config.Option.create("camerax.core.imageInput.inputFormat", int.class);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java
index 62d5e09..93b3ab4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageOutputConfig.java
@@ -24,6 +24,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.AspectRatio;
import java.lang.annotation.Retention;
@@ -33,6 +34,7 @@
/**
* Configuration containing options for configuring the output image data of a pipeline.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageOutputConfig extends ReadableConfig {
/**
* Invalid integer rotation.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java
index 9594745..9ecbd1c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageProxyBundle.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageProxy;
import com.google.common.util.concurrent.ListenableFuture;
@@ -26,6 +27,7 @@
/**
* A set of {@link ImageProxy} which are mapped an identifier.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageProxyBundle {
/**
* Get a {@link ListenableFuture} for a {@link ImageProxy}.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
index 4b2d253..7db3473 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImageReaderProxy.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.ImageProxy;
@@ -35,6 +36,7 @@
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageReaderProxy {
/**
* Acquires the latest image in the queue.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java
index aeb8aaf..057f327 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ImmediateSurface.java
@@ -20,6 +20,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@@ -28,6 +29,7 @@
* A {@link DeferrableSurface} which always returns immediately.
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImmediateSurface extends DeferrableSurface {
private final Surface mSurface;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
index e388744..3ac75d8d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingCameraFilter.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraFilter;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.CameraSelector;
@@ -28,6 +29,7 @@
/**
* A filter that filters camera based on lens facing.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class LensFacingCameraFilter implements CameraFilter {
@CameraSelector.LensFacing
private int mLensFacing;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java
index 1db98f3..6748024 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LensFacingConverter.java
@@ -18,11 +18,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
/**
* Helper class that defines certain enum-like methods for {@link CameraSelector.LensFacing}
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class LensFacingConverter {
private LensFacingConverter() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
index e8520da..4378e9f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/LiveDataObservable.java
@@ -21,6 +21,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.core.util.Preconditions;
@@ -47,6 +48,7 @@
* @param <T> The data type used for
* {@link Observable.Observer#onNewData(Object)}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class LiveDataObservable<T> implements Observable<T> {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java
index d2fc5c4..a2ca5a2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MetadataHolderService.java
@@ -22,11 +22,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* A placeholder service to avoid adding application-level metadata. The service is only used to
* expose metadata defined in the library's manifest. It is never invoked.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class MetadataHolderService extends Service {
@Nullable
@Override
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java
index d83bd3c..6776d2e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MultiValueSet.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.Collections;
@@ -29,6 +30,7 @@
*
* @param <C> The type of the parameter.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class MultiValueSet<C> {
private Set<C> mSet = new HashSet<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java
index 67b8936..107b439 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableConfig.java
@@ -18,12 +18,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* MutableConfig is a {@link Config} that can be modified.
*
* <p>MutableConfig is the interface used to create immutable Config objects.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface MutableConfig extends Config {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java
index 6ff127e..f376a07 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableOptionsBundle.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.Collections;
import java.util.Map;
@@ -29,6 +30,7 @@
/**
* A MutableOptionsBundle is an {@link OptionsBundle} which allows for insertion/removal.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class MutableOptionsBundle extends OptionsBundle implements MutableConfig {
@NonNull
private static final OptionPriority DEFAULT_PRIORITY = OptionPriority.OPTIONAL;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java
index 90fa540..2931c781 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableStateObservable.java
@@ -18,12 +18,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* A {@link StateObservable} whose state can be set.
*
* @param <T> The state type.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class MutableStateObservable<T> extends StateObservable<T> {
private MutableStateObservable(@Nullable Object initialState, boolean isError) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java
index 342060a..8fc5d48 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/MutableTagBundle.java
@@ -19,12 +19,14 @@
import android.util.ArrayMap;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.Map;
/**
* A mutable {@link TagBundle} which allows insertion/removal.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class MutableTagBundle extends TagBundle {
private MutableTagBundle(Map<String, Object> source) {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java
index 4491d48..40fa94c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Observable.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.common.util.concurrent.ListenableFuture;
@@ -28,6 +29,7 @@
*
* @param <T> The type of the data in the stream.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Observable<T> {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java
index ceb9f8a..cc36b52 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/OptionsBundle.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.Collections;
import java.util.Comparator;
@@ -33,6 +34,7 @@
* <p>OptionsBundle is a collection of {@link Config.Option}s and their values which can be
* queried based on exact {@link Config.Option} objects or based on Option ids.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class OptionsBundle implements Config {
protected static final Comparator<Option<?>> ID_COMPARE =
(o1, o2) -> {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java
index 4d633f9..609342c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/OutputSurface.java
@@ -20,12 +20,14 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
/**
* A class wrapping output surface information for initializing {@link SessionProcessor}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class OutputSurface {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java
index de4e98c1..146c52a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/PreviewConfig.java
@@ -18,12 +18,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Preview;
import androidx.camera.core.internal.ThreadConfig;
/**
* Configuration for a {@link Preview} use case.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class PreviewConfig
implements UseCaseConfig<Preview>,
ImageOutputConfig,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java
index 48a8fd2..eb282da 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirk.java
@@ -16,6 +16,8 @@
package androidx.camera.core.impl;
+import androidx.annotation.RequiresApi;
+
/**
* Defines an inconsistency, a limitation, or any behavior that deviates from the standard behavior.
*
@@ -25,5 +27,6 @@
*
* @see Quirks
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Quirk {
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java
index 5e3871f..5887e59b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/Quirks.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.List;
@@ -26,6 +27,7 @@
* Wraps a list of {@link Quirk}s, allowing to easily retrieve a {@link Quirk} instance by its
* class.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Quirks {
@NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java
index 52bdee6..b533694 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/ReadableConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.Set;
@@ -27,6 +28,7 @@
* <p>ReadableConfig objects are also {@link Config} objects, so can be passed to any method that
* expects a {@link Config}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ReadableConfig extends Config {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java
index 9fdbcbf..ef6c237 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/RequestProcessor.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -29,6 +30,7 @@
*
* <p>The images to be fetched is managed inside {@link SessionProcessor}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface RequestProcessor {
/**
* Submit a request.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java
index fb02c44..b599e5b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionConfig.java
@@ -23,6 +23,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.internal.compat.workaround.SurfaceSorter;
@@ -41,6 +42,7 @@
* required to initialize a {@link android.hardware.camera2.CameraCaptureSession} and issue a {@link
* CaptureRequest}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SessionConfig {
/** The set of {@link Surface} that data from the camera will be put into. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java
index 6bbf57c..99f8a46 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessor.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraInfo;
/**
@@ -37,6 +38,7 @@
* <p>The SessionProcessor is expected to release all intermediate {@link ImageReader}s when
* {@link #deInitSession()} is called.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface SessionProcessor {
/**
* Initializes the session and returns a transformed {@link SessionConfig} which should be
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java
index e3617b1..68d23ed 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SessionProcessorSurface.java
@@ -19,6 +19,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import com.google.common.util.concurrent.ListenableFuture;
@@ -30,6 +31,7 @@
* <p>It is similar as {@link ImmediateSurface} but contains output config Id that can be used to
* query the surface the id associates with.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SessionProcessorSurface extends DeferrableSurface {
private final Surface mSurface;
private final int mOutputConfigId;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java
index 829c73b..292b79b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SingleImageProxyBundle.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageInfo;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.impl.utils.futures.Futures;
@@ -29,6 +30,7 @@
/**
* An {@link ImageProxyBundle} that contains a single {@link ImageProxy}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SingleImageProxyBundle implements ImageProxyBundle {
private final int mCaptureId;
private final ImageProxy mImageProxy;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java
index ed3ab43..8505c92 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/StateObservable.java
@@ -19,6 +19,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.core.util.Preconditions;
@@ -55,6 +56,7 @@
*
* @param <T> The state type.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class StateObservable<T> implements Observable<T> {
private static final int INITIAL_VERSION = 0;
@@ -180,6 +182,7 @@
}
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
private static final class ObserverWrapper<T> implements Runnable {
private static final Object NOT_SET = new Object();
private static final int NO_VERSION = -1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java
index 7afe835..43ada23 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceCombination.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.List;
@@ -29,6 +30,7 @@
* of surface configuration type and size pairs can be supported for different hardware level camera
* devices. This structure is used to store a list of surface configuration as a combination.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SurfaceCombination {
private final List<SurfaceConfig> mSurfaceConfigList = new ArrayList<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java
index 7a1d3b0..1428065 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceConfig.java
@@ -20,6 +20,7 @@
import android.os.Handler;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -33,6 +34,7 @@
* of surface configuration type and size pairs can be supported for different hardware level camera
* devices.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class SurfaceConfig {
/** Prevent subclassing */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java
index bbb89bd..7c6f9ea 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/SurfaceSizeDefinition.java
@@ -18,6 +18,8 @@
import android.util.Size;
+import androidx.annotation.RequiresApi;
+
import com.google.auto.value.AutoValue;
/**
@@ -27,6 +29,7 @@
* guaranteed stream combinations for different hardware level devices.
*/
@SuppressWarnings("AutoValueImmutableFields")
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class SurfaceSizeDefinition {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java
index 30851f0..ae4ae00 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/TagBundle.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.Map;
import java.util.Set;
@@ -28,6 +29,7 @@
/**
* A TagBundle is an immutable tags collection which does not allow insertion/removal.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class TagBundle {
/** It is used to store all the keys and Tags */
protected final Map<String, Object> mTagMap;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java
index 30bc983..f284b5c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseAttachState.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import java.util.ArrayList;
@@ -34,7 +35,7 @@
* the camera capture, but not currently capturing. Active means the use case is either currently
* issuing a capture request or one has already been issued.
*/
-
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class UseCaseAttachState {
private static final String TAG = "UseCaseAttachState";
/** The name of the camera the use cases are attached to. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
index f973bf1..70bdbc4 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfig.java
@@ -18,20 +18,19 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.ExtendableBuilder;
import androidx.camera.core.UseCase;
import androidx.camera.core.internal.TargetConfig;
import androidx.camera.core.internal.UseCaseEventConfig;
-import androidx.core.util.Consumer;
-
-import java.util.Collection;
/**
* Configuration containing options for use cases.
*
* @param <T> The use case being configured.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface UseCaseConfig<T extends UseCase> extends TargetConfig<T>, UseCaseEventConfig,
ImageInputConfig {
// Option Declarations:
@@ -75,12 +74,6 @@
*/
Option<CameraSelector> OPTION_CAMERA_SELECTOR =
Config.Option.create("camerax.core.useCase.cameraSelector", CameraSelector.class);
- /**
- * Option: camerax.core.useCase.attachedUseCasesUpdateListener
- */
- Option<Consumer<Collection<UseCase>>> OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER =
- Config.Option.create("camerax.core.useCase.attachedUseCasesUpdateListener",
- Consumer.class);
// *********************************************************************************************
@@ -257,32 +250,6 @@
}
/**
- * Retrieves the attached use cases update listener that will be updated when one or more use
- * cases are attached or detached.
- *
- * @param valueIfMissing The value to return if this configuration option has not been set.
- * @return The stored value or <code>valueIfMissing</code> if the value does not exist in this
- * configuration.
- */
- @Nullable
- default Consumer<Collection<UseCase>> getAttachedUseCasesUpdateListener(
- @Nullable Consumer<Collection<UseCase>> valueIfMissing) {
- return retrieveOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER, valueIfMissing);
- }
-
- /**
- * Retrieves the attached use cases update listener that will be updated when the use case is
- * attached.
- *
- * @return The stored value, if it exists in this configuration.
- * @throws IllegalArgumentException if the option does not exist in this configuration.
- */
- @NonNull
- default Consumer<Collection<UseCase>> getAttachedUseCasesUpdateListener() {
- return retrieveOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER);
- }
-
- /**
* Builder for a {@link UseCase}.
*
* @param <T> The type of the object which will be built by {@link #build()}.
@@ -360,18 +327,6 @@
B setCameraSelector(@NonNull CameraSelector cameraSelector);
/**
- * Sets the attached use cases update listener that will be updated when the use case is
- * attached.
- *
- * @param attachedUseCasesUpdateListener The attached use cases update listener appended
- * internally.
- * @return The current Builder.
- */
- @NonNull
- B setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener);
-
- /**
* Retrieves the configuration used by this builder.
*
* @return the configuration used by this builder.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java
index ea5df64..a66b306 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/UseCaseConfigFactory.java
@@ -20,11 +20,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.InitializationException;
/**
* A Repository for generating use case configurations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface UseCaseConfigFactory {
enum CaptureType {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java
index 42dce8b..883d8c3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/VideoCaptureConfig.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.VideoCapture;
import androidx.camera.core.internal.ThreadConfig;
@@ -25,6 +26,7 @@
*
* <p>In the earlier stage, the VideoCapture is deprioritized.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class VideoCaptureConfig
implements UseCaseConfig<VideoCapture>,
ImageOutputConfig,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java
index f64adc4..dbdabbc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Absent.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import androidx.core.util.Supplier;
@@ -25,6 +26,7 @@
*
* <p>Copied and adapted from Guava.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class Absent<T> extends Optional<T> {
static final Absent<Object> sInstance = new Absent<>();
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java
index 318761b..c1294e5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataInputStream.java
@@ -16,6 +16,8 @@
package androidx.camera.core.impl.utils;
+import androidx.annotation.RequiresApi;
+
import java.io.ByteArrayInputStream;
import java.io.DataInput;
import java.io.DataInputStream;
@@ -29,6 +31,7 @@
* order.
*/
// Note: This class is adapted from {@link androidx.exifinterface.media.ExifInterface}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ByteOrderedDataInputStream extends InputStream implements DataInput {
private static final ByteOrder LITTLE_ENDIAN = ByteOrder.LITTLE_ENDIAN;
private static final ByteOrder BIG_ENDIAN = ByteOrder.BIG_ENDIAN;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java
index 5f830f8..3b49af3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ByteOrderedDataOutputStream.java
@@ -16,6 +16,8 @@
package androidx.camera.core.impl.utils;
+import androidx.annotation.RequiresApi;
+
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
@@ -26,6 +28,7 @@
* order.
*/
// Note: This class is adapted from {@link androidx.exifinterface.media.ExifInterface}
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ByteOrderedDataOutputStream extends FilterOutputStream {
final OutputStream mOutputStream;
private ByteOrder mByteOrder;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
index cc39e50..4ead922 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CameraOrientationUtil.java
@@ -18,12 +18,14 @@
import android.view.Surface;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.ImageOutputConfig.RotationValue;
/**
* Contains utility methods related to camera orientation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraOrientationUtil {
private static final String TAG = "CameraOrientationUtil";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java
index 89e1983..051c5e0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/CloseGuardHelper.java
@@ -28,6 +28,7 @@
*
* <p>All operations will be no-ops on non-supported API levels.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CloseGuardHelper {
private final CloseGuardImpl mImpl;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
index a75d1a9..13bb51e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ContextUtil.java
@@ -28,6 +28,7 @@
/**
* Utility class for {@link Context} related operations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ContextUtil {
/**
* Gets the application context and preserves the attribution tag.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java
index ac6a24b..315b3fc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Exif.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.Logger;
import androidx.exifinterface.media.ExifInterface;
@@ -42,6 +43,7 @@
*
* <p>Call {@link #save()} to persist changes to disc.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Exif {
/** Timestamp value indicating a timestamp value that is either not set or not valid */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java
index 02a1d39..86442e9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifAttribute.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import java.io.IOException;
@@ -31,6 +32,7 @@
*
* This class was pulled from the {@link androidx.exifinterface.media.ExifInterface} class.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ExifAttribute {
private static final String TAG = "ExifAttribute";
public static final long BYTES_OFFSET_UNKNOWN = -1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java
index ea5d08a..e347233 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifData.java
@@ -115,6 +115,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.CameraCaptureMetaData;
import androidx.core.util.Preconditions;
@@ -141,6 +142,7 @@
// types besides JPEG have been removed. Support for thumbnails/strips has been removed along
// with many exif tags. If more tags are required, the source code for ExifInterface should be
// referenced and can be adapted to this class.
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExifData {
private static final String TAG = "ExifData";
private static final boolean DEBUG = false;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java
index a2594fd..319a175 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifOutputStream.java
@@ -26,6 +26,7 @@
import static androidx.camera.core.impl.utils.ExifData.IFD_TYPE_PRIMARY;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.core.util.Preconditions;
@@ -68,6 +69,7 @@
* }
* </pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ExifOutputStream extends FilterOutputStream {
private static final String TAG = "ExifOutputStream";
private static final boolean DEBUG = false;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java
index c0df33b..c760f54 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/ExifTag.java
@@ -24,6 +24,7 @@
import static androidx.camera.core.impl.utils.ExifAttribute.IFD_FORMAT_UNDEFINED;
import static androidx.camera.core.impl.utils.ExifAttribute.IFD_FORMAT_USHORT;
+import androidx.annotation.RequiresApi;
import androidx.exifinterface.media.ExifInterface;
/**
@@ -34,6 +35,7 @@
*
* @see ExifInterface
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ExifTag {
public final int number;
public final String name;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java
index 3b6353d..1b83064 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/LongRational.java
@@ -17,11 +17,13 @@
package androidx.camera.core.impl.utils;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* The rational data type of EXIF tag. Contains a pair of longs representing the
* numerator and denominator of a Rational number.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class LongRational {
private final long mNumerator;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java
index f90cdc0..7b13ef9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/MainThreadAsyncHandler.java
@@ -19,12 +19,14 @@
import android.os.Handler;
import android.os.Looper;
+import androidx.annotation.RequiresApi;
import androidx.core.os.HandlerCompat;
/**
* Singleton instance of an async main thread {@link Handler}.
* @see HandlerCompat#createAsync(Looper)
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class MainThreadAsyncHandler {
private static volatile Handler sHandler;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java
index fd8fc4f..2d23f95 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Optional.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import androidx.core.util.Supplier;
@@ -68,6 +69,7 @@
* this type, so it is safe to cast an {@code Optional<T>} to {@code Optional<S>} for any
* supertype {@code S} of {@code T}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class Optional<T> implements Serializable {
/**
* Returns an {@code Optional} instance with no contained reference.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java
index 1132fec..6714f16 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Present.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import androidx.core.util.Supplier;
@@ -25,6 +26,7 @@
*
* <p>Copied and adapted from Guava.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class Present<T> extends Optional<T> {
private final T mReference;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java
index 50bd09b..2846661 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/Threads.java
@@ -18,11 +18,13 @@
import android.os.Looper;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
/**
* Helpers for {@link Thread}s.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Threads {
// Prevent instantiation.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java
index 943b67d..4d6d86d 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/CameraXExecutors.java
@@ -20,6 +20,7 @@
import android.os.Looper;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
@@ -27,6 +28,7 @@
/**
* Utility class for generating specific implementations of {@link Executor}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraXExecutors {
// Should not be instantiated
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java
index 97d2d10..776239c 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/DirectExecutor.java
@@ -16,12 +16,15 @@
package androidx.camera.core.impl.utils.executor;
+import androidx.annotation.RequiresApi;
+
import java.util.concurrent.Executor;
/**
* An {@link Executor} that runs each task in the thread that invokes {@link Executor#execute
* execute}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class DirectExecutor implements Executor {
private static volatile DirectExecutor sDirectExecutor;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java
index 8644b6a..541fe35 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HandlerScheduledExecutorService.java
@@ -21,6 +21,7 @@
import android.os.SystemClock;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -45,6 +46,7 @@
*
* <p>Currently, can only be used to schedule future non-repeating tasks.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class HandlerScheduledExecutorService extends AbstractExecutorService implements
ScheduledExecutorService {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java
index ea835b9..04351c9 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/HighPriorityExecutor.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils.executor;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraXThreads;
import java.util.concurrent.Executor;
@@ -27,6 +28,7 @@
/**
* A singleton executor used for non-blocking tasks.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class HighPriorityExecutor implements Executor {
private static volatile Executor sExecutor;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java
index ad6d4dd..8e2ef48 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/IoExecutor.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils.executor;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraXThreads;
import java.util.Locale;
@@ -29,6 +30,7 @@
/**
* A singleton executor which should be used for I/O tasks.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
// TODO(b/115779693): Make this executor configurable
final class IoExecutor implements Executor {
private static volatile Executor sExecutor;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java
index 977c9d9..9a981fc 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/MainThreadExecutor.java
@@ -19,6 +19,8 @@
import android.os.Handler;
import android.os.Looper;
+import androidx.annotation.RequiresApi;
+
import java.util.concurrent.Executor;
import java.util.concurrent.ScheduledExecutorService;
@@ -29,6 +31,7 @@
* <p>Since {@link ScheduledExecutorService} implements {@link Executor}, this can also be used
* as a simple Executor.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class MainThreadExecutor {
private static volatile ScheduledExecutorService sInstance;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java
index 9d99a82..33390ae 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/executor/SequentialExecutor.java
@@ -22,6 +22,7 @@
import static androidx.camera.core.impl.utils.executor.SequentialExecutor.WorkerRunningState.RUNNING;
import androidx.annotation.GuardedBy;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.core.util.Preconditions;
@@ -46,6 +47,7 @@
*
* <p>Copied and adapted from Guava.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SequentialExecutor implements Executor {
private static final String TAG = "SequentialExecutor";
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java
index 1ffb5e7..039dade 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/AsyncFunction.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils.futures;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.common.util.concurrent.ListenableFuture;
@@ -36,6 +37,7 @@
* @param <O>
*/
@FunctionalInterface
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface AsyncFunction<I, O> {
/**
* Returns an output {@code Future} to use in place of the given {@code input}. The output
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java
index ff36dcd..df12799 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ChainingListenableFuture.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import com.google.common.util.concurrent.ListenableFuture;
@@ -50,6 +51,7 @@
* in a {@code UndeclaredThrowableException} so that this class can get access to the cause.
*
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ChainingListenableFuture<I, O> extends FutureChain<O> implements Runnable {
@Nullable
private AsyncFunction<? super I, ? extends O> mFunction;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java
index 681271f..3c30e57 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureCallback.java
@@ -17,6 +17,7 @@
package androidx.camera.core.impl.utils.futures;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.common.util.concurrent.ListenableFuture;
@@ -36,6 +37,7 @@
* @since 10.0
* @param <V>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface FutureCallback<V> {
/** Invoked with the result of the {@code Future} computation when it is successful. */
void onSuccess(@Nullable V result);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java
index 6cf3de9..19e1cfb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/FutureChain.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.arch.core.util.Function;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.core.util.Preconditions;
@@ -42,6 +43,7 @@
* }</pre>
* @param <V>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FutureChain<V> implements ListenableFuture<V> {
@NonNull
private final ListenableFuture<V> mDelegate;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
index f2e0299..f277485 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/Futures.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.arch.core.util.Function;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -39,6 +40,7 @@
/**
* Utility class for generating specific implementations of {@link ListenableFuture}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Futures {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java
index 6ce54d0..3871479 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ImmediateFuture.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.core.util.Preconditions;
@@ -35,6 +36,7 @@
* <p>This implementation is based off of the Guava ImmediateSuccessfulFuture class.
* @param <V> The type of the value stored in the future.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
abstract class ImmediateFuture<V> implements ListenableFuture<V> {
private static final String TAG = "ImmediateFuture";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java
index 45cb086..e86a202 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/impl/utils/futures/ListFuture.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.core.util.Preconditions;
@@ -49,6 +50,7 @@
* each component future to fill out the value in the List when that future
* completes.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ListFuture<V> implements ListenableFuture<List<V>> {
@Nullable
List<? extends ListenableFuture<? extends V>> mFutures;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
index ea4f5a5..dd396b5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraCaptureResultImageInfo.java
@@ -17,12 +17,14 @@
package androidx.camera.core.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageInfo;
import androidx.camera.core.impl.CameraCaptureResult;
import androidx.camera.core.impl.TagBundle;
import androidx.camera.core.impl.utils.ExifData;
/** An ImageInfo that is created by a {@link CameraCaptureResult}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraCaptureResultImageInfo implements ImageInfo {
private final CameraCaptureResult mCameraCaptureResult;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index 09b6da7..060844a2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -24,6 +24,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraControl;
import androidx.camera.core.CameraInfo;
@@ -44,7 +45,6 @@
import androidx.camera.core.impl.UseCaseConfig;
import androidx.camera.core.impl.UseCaseConfigFactory;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
-import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
import java.util.ArrayList;
@@ -64,6 +64,7 @@
* extensions in order to select the correct CameraInternal instance which has the required
* camera id.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraUseCaseAdapter implements Camera {
@NonNull
private CameraInternal mCameraInternal;
@@ -259,7 +260,6 @@
// use cases.
mUseCases.addAll(newUseCases);
if (mAttached) {
- notifyAttachedUseCasesChange(mUseCases);
mCameraInternal.attachUseCases(newUseCases);
}
@@ -323,7 +323,6 @@
synchronized (mLock) {
if (!mAttached) {
mCameraInternal.attachUseCases(mUseCases);
- notifyAttachedUseCasesChange(mUseCases);
restoreInteropConfig();
// Notify to update the use case's active state because it may be cleared if the
@@ -566,22 +565,6 @@
}
/**
- * Notify the attached use cases change to the listener
- */
- private void notifyAttachedUseCasesChange(@NonNull List<UseCase> useCases) {
- CameraXExecutors.mainThreadExecutor().execute(() -> {
- for (UseCase useCase : useCases) {
- Consumer<Collection<UseCase>> attachedUseCasesUpdateListener =
- useCase.getCurrentConfig().getAttachedUseCasesUpdateListener(null);
-
- if (attachedUseCasesUpdateListener != null) {
- attachedUseCasesUpdateListener.accept(Collections.unmodifiableList(useCases));
- }
- }
- });
- }
-
- /**
* Calculates the new required extra use cases according to the use cases bound by the
* application and the existing extra use cases.
*
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java
index f62de7f..fd3fec5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ImmutableZoomState.java
@@ -17,6 +17,7 @@
package androidx.camera.core.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ZoomState;
import com.google.auto.value.AutoValue;
@@ -24,6 +25,7 @@
/**
* An implementation of {@link ZoomState} that is immutable.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class ImmutableZoomState implements ZoomState {
/** Create an immutable instance of {@link ZoomState}. */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java
index 7f283be..173f9f3 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/IoConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ReadableConfig;
import java.util.concurrent.Executor;
@@ -25,6 +26,7 @@
/**
* Configuration containing IO related options.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface IoConfig extends ReadableConfig {
// Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java
index ad97e73..74bed52 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/TargetConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.ReadableConfig;
@@ -27,6 +28,7 @@
*
* @param <T> The type of the object being configured.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface TargetConfig<T> extends ReadableConfig {
// Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
index e31c0f4..6435a03 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ThreadConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ReadableConfig;
import java.util.concurrent.Executor;
@@ -25,6 +26,7 @@
/**
* Configuration containing options pertaining to threads used by the configured object.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ThreadConfig extends ReadableConfig {
// Option Declarations:
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java
index 729683e..3e8a1e5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/UseCaseEventConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.ReadableConfig;
@@ -25,6 +26,7 @@
/**
* Configuration containing options pertaining to EventCallback object.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface UseCaseEventConfig extends ReadableConfig {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java
index 2a88ff6..8f39855 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/ViewPorts.java
@@ -26,6 +26,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.UseCase;
import androidx.camera.core.ViewPort;
import androidx.camera.core.internal.utils.ImageUtil;
@@ -37,6 +38,7 @@
/**
* Utility methods for calculating viewports.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ViewPorts {
private ViewPorts() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java
index fec5d94..db756d6b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirks.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.impl.Quirks;
@@ -30,6 +31,7 @@
* <p>
* Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirks {
@NonNull
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
index aab22f8..79ddcbb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/DeviceQuirksLoader.java
@@ -17,6 +17,7 @@
package androidx.camera.core.internal.compat.quirk;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.ArrayList;
@@ -25,6 +26,7 @@
/**
* Loads all device specific quirks required for the current device
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirksLoader {
private DeviceQuirksLoader() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
index 4992f44..4713958 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/ImageCaptureRotationOptionQuirk.java
@@ -19,6 +19,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.Quirk;
@@ -35,6 +36,7 @@
* calculate the rotation value according to the target rotation setting for the final output
* image. See: b/171492111.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageCaptureRotationOptionQuirk implements Quirk {
static boolean load() {
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java
index 70adcc1..15d272a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/OnePixelShiftQuirk.java
@@ -16,6 +16,7 @@
package androidx.camera.core.internal.compat.quirk;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -24,5 +25,6 @@
*
* <p>Subclasses of this quirk may contain device specific information.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface OnePixelShiftQuirk extends Quirk {
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java
index de15939..68573e0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SoftwareJpegEncodingPreferredQuirk.java
@@ -17,6 +17,7 @@
package androidx.camera.core.internal.compat.quirk;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -26,5 +27,6 @@
* <p>Subclasses of this quirk may prefer CameraX produces JPEGs itself (likely from a YUV
* format) for compatibility or performance reasons.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface SoftwareJpegEncodingPreferredQuirk extends Quirk {
}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java
index e9eb4e01..40c9770 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/quirk/SurfaceOrderQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.internal.compat.workaround.SurfaceSorter;
@@ -35,6 +36,7 @@
*
* @see SurfaceSorter
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class SurfaceOrderQuirk implements Quirk {
private static final Set<String> BUILD_HARDWARE_SET = new HashSet<>(Arrays.asList(
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java
index 8dae82b..dc2bebb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/ExifRotationAvailability.java
@@ -19,6 +19,7 @@
import android.graphics.ImageFormat;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.internal.compat.quirk.DeviceQuirks;
@@ -30,6 +31,7 @@
*
* @see ImageCaptureRotationOptionQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExifRotationAvailability {
/**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java
index 55bc649..ff0324b 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/compat/workaround/SurfaceSorter.java
@@ -19,6 +19,7 @@
import android.media.MediaCodec;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Preview;
import androidx.camera.core.VideoCapture;
import androidx.camera.core.impl.DeferrableSurface;
@@ -33,6 +34,7 @@
*
* @see SurfaceOrderQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class SurfaceSorter {
// The larger priority value will be placed at the back of the list.
private static final int PRIORITY_MEDIA_CODEC_SURFACE = 1;
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
index 59ec4f2..e6ebb17 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/ImageUtil.java
@@ -28,6 +28,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.Logger;
@@ -38,6 +39,7 @@
/**
* Utility class for image related operations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageUtil {
private static final String TAG = "ImageUtil";
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java
index dc9e693..006db56e 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/UseCaseConfigUtil.java
@@ -20,6 +20,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.ImageOutputConfig;
import androidx.camera.core.impl.UseCaseConfig;
import androidx.camera.core.impl.utils.CameraOrientationUtil;
@@ -27,6 +28,7 @@
/**
* Contains utility methods related to UseCaseConfig.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class UseCaseConfigUtil {
private UseCaseConfigUtil() {}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java
index 590b64b..71693e7 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/utils/VideoUtil.java
@@ -23,12 +23,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.core.util.Preconditions;
/**
* Utility class for video recording related operations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class VideoUtil {
private static final String TAG = "VideoUtil";
diff --git a/camera/camera-extensions-stub/build.gradle b/camera/camera-extensions-stub/build.gradle
index 6d234f3..2ed55c3 100644
--- a/camera/camera-extensions-stub/build.gradle
+++ b/camera/camera-extensions-stub/build.gradle
@@ -26,12 +26,6 @@
api("androidx.annotation:annotation:1.0.0")
}
-android {
- defaultConfig {
- minSdkVersion 21
- }
-}
-
androidx {
name = "Jetpack Camera Library OEM Extensions Stub"
publish = Publish.NONE
diff --git a/camera/camera-extensions/build.gradle b/camera/camera-extensions/build.gradle
index 6feb049..e137b58 100644
--- a/camera/camera-extensions/build.gradle
+++ b/camera/camera-extensions/build.gradle
@@ -54,6 +54,7 @@
androidTestImplementation(libs.kotlinStdlib)
androidTestImplementation(libs.mockitoCore, excludes.bytebuddy) // DexMaker has its own MockMaker
androidTestImplementation(libs.truth)
+ androidTestImplementation(libs.multidex)
androidTestImplementation(project(":camera:camera-lifecycle"))
androidTestImplementation(project(":camera:camera-testing"))
androidTestImplementation(project(":internal-testutils-truth"))
@@ -63,7 +64,11 @@
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
+ }
+
+ buildTypes.all {
+ consumerProguardFiles "proguard-rules.pro"
}
// Use Robolectric 4.+
diff --git a/camera/camera-extensions/lint.xml b/camera/camera-extensions/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-extensions/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-extensions/proguard-rules.pro b/camera/camera-extensions/proguard-rules.pro
new file mode 100644
index 0000000..f468308
--- /dev/null
+++ b/camera/camera-extensions/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Copyright (C) 2020 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Needs to keep the classes implementing the vendor library interfaces in the extensions module.
+# Otherwise, it will cause AbstractMethodError if proguard is enabled.
+-keep class androidx.camera.extensions.ExtensionsManager$** {*;}
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
index e15deb5..65b0b5c 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ExtensionsManagerTest.kt
@@ -30,6 +30,7 @@
import androidx.camera.testing.CameraUtil
import androidx.camera.testing.fakes.FakeLifecycleOwner
import androidx.camera.testing.fakes.FakeUseCase
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import androidx.testutils.assertThrows
@@ -48,6 +49,7 @@
@SmallTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
class ExtensionsManagerTest(
@field:ExtensionMode.Mode @param:ExtensionMode.Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt
index a0c448b..7753a7e 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/ImageCaptureExtenderValidationTest.kt
@@ -51,6 +51,7 @@
@SmallTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
class ImageCaptureExtenderValidationTest(
@field:Mode @param:Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
@@ -137,7 +138,7 @@
}
@Test
- @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.O_MR1)
+ @SdkSuppress(minSdkVersion = 21, maxSdkVersion = Build.VERSION_CODES.O_MR1)
fun returnsNullFromOnPresetSession_whenAPILevelOlderThan28() {
// Creates the ImageCaptureExtenderImpl to check that onPresetSession() returns null when
// API level is older than 28.
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt
index d5da017..e68cfb8 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/PreviewExtenderValidationTest.kt
@@ -48,6 +48,7 @@
@SmallTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
class PreviewExtenderValidationTest(
@field:Mode @param:Mode private val extensionMode: Int,
@field:CameraSelector.LensFacing @param:CameraSelector.LensFacing private val lensFacing: Int
@@ -131,7 +132,7 @@
}
@Test
- @SdkSuppress(maxSdkVersion = Build.VERSION_CODES.O_MR1)
+ @SdkSuppress(minSdkVersion = 21, maxSdkVersion = Build.VERSION_CODES.O_MR1)
fun returnsNullFromOnPresetSession_whenAPILevelOlderThan28() {
// Creates the ImageCaptureExtenderImpl to check that onPresetSession() returns null when
// API level is older than 28.
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt
index cef523b..cd987ab 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/ImageCaptureConfigProviderTest.kt
@@ -36,6 +36,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
@@ -56,7 +57,7 @@
@MediumTest
@RunWith(AndroidJUnit4::class)
-
+@SdkSuppress(minSdkVersion = 21)
class ImageCaptureConfigProviderTest {
@get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/PreviewConfigProviderTest.kt b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/PreviewConfigProviderTest.kt
index 7be9086..1f25c2c 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/PreviewConfigProviderTest.kt
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/internal/PreviewConfigProviderTest.kt
@@ -42,6 +42,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
@@ -64,6 +65,7 @@
@MediumTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class PreviewConfigProviderTest {
@get:Rule
val useCamera = CameraUtil.grantCameraPermissionAndPreTest()
diff --git a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
index c4d0e15..4f61e65 100644
--- a/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
+++ b/camera/camera-extensions/src/androidTest/java/androidx/camera/extensions/util/ExtensionsTestUtil.java
@@ -27,6 +27,7 @@
import android.hardware.camera2.CameraCharacteristics;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
import androidx.camera.extensions.ExtensionMode;
import androidx.camera.extensions.impl.AutoImageCaptureExtenderImpl;
@@ -48,6 +49,7 @@
/**
* Extension test util functions.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExtensionsTestUtil {
@NonNull
public static Collection<Object[]> getAllExtensionsLensFacingCombinations() {
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
index 73e7c9e..0da3b2b 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionCameraFilter.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.interop.Camera2CameraInfo;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
import androidx.camera.core.CameraFilter;
@@ -37,6 +38,7 @@
* A filter that filters camera based on extender implementation. If the implementation is
* unavailable, the camera will be considered available.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ExtensionCameraFilter implements CameraFilter {
private final Identifier mId;
private final VendorExtender mVendorExtender;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionMode.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionMode.java
index d14c35b..89bc006 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionMode.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionMode.java
@@ -17,6 +17,7 @@
package androidx.camera.extensions;
import androidx.annotation.IntDef;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraProvider;
@@ -28,6 +29,7 @@
/**
* The available modes for the extensions.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ExtensionMode {
/** Normal mode without any specific effect applied. */
public static final int NONE = 0;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java
index e44e5cc..5aab6b2 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsConfig.java
@@ -17,6 +17,7 @@
package androidx.camera.extensions;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraConfig;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.Identifier;
@@ -27,6 +28,7 @@
/**
* Implementation of CameraConfig which provides the extensions capability.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class ExtensionsConfig implements CameraConfig {
// Option Declarations:
// *********************************************************************************************
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
index 8a0d53c..0cddd0d 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsInfo.java
@@ -17,12 +17,16 @@
package androidx.camera.extensions;
+import android.content.Context;
+import android.hardware.camera2.CameraCharacteristics;
+import android.util.Pair;
import android.util.Range;
import android.util.Size;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
import androidx.camera.core.CameraFilter;
import androidx.camera.core.CameraInfo;
@@ -40,8 +44,11 @@
import androidx.camera.extensions.internal.ExtensionsUseCaseConfigFactory;
import androidx.camera.extensions.internal.VendorExtender;
import androidx.camera.extensions.internal.Version;
+import androidx.camera.extensions.internal.compat.workaround.ExtensionDisabledValidator;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
/**
* A class for querying extensions related information.
@@ -53,9 +60,12 @@
* call can be used to get the specified {@link CameraSelector} to bind use cases and enable the
* extension mode on the camera.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ExtensionsInfo {
private static final String EXTENDED_CAMERA_CONFIG_PROVIDER_ID_PREFIX = ":camera:camera"
+ "-extensions-";
+ private static final ExtensionDisabledValidator sExtensionDisabledValidator =
+ new ExtensionDisabledValidator();
/**
* Returns a {@link CameraSelector} for the specified extension mode.
@@ -237,8 +247,15 @@
@NonNull
private static VendorExtender getVendorExtender(int mode) {
+ boolean isAdvancedExtenderSupported = isAdvancedExtenderSupported();
+
+ // Force disable extension for some devices by quirk.
+ if (sExtensionDisabledValidator.shouldDisableExtension(isAdvancedExtenderSupported)) {
+ return new DisabledVendorExtender();
+ }
+
VendorExtender vendorExtender;
- if (isAdvancedExtenderSupported()) {
+ if (isAdvancedExtenderSupported) {
vendorExtender = new AdvancedVendorExtender(mode);
} else {
vendorExtender = new BasicVendorExtender(mode);
@@ -283,4 +300,47 @@
private ExtensionsInfo() {
}
+
+ static class DisabledVendorExtender implements VendorExtender {
+ @Override
+ public boolean isExtensionAvailable(@NonNull String cameraId,
+ @NonNull Map<String, CameraCharacteristics> characteristicsMap) {
+ return false;
+ }
+
+ @Override
+ public void init(@NonNull CameraInfo cameraInfo) {
+
+ }
+
+ @Nullable
+ @Override
+ public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size size) {
+ return null;
+ }
+
+ @NonNull
+ @Override
+ public List<Pair<Integer, Size[]>> getSupportedPreviewOutputResolutions() {
+ return Collections.emptyList();
+ }
+
+ @NonNull
+ @Override
+ public List<Pair<Integer, Size[]>> getSupportedCaptureOutputResolutions() {
+ return Collections.emptyList();
+ }
+
+ @NonNull
+ @Override
+ public Size[] getSupportedYuvAnalysisResolutions() {
+ return new Size[0];
+ }
+
+ @Nullable
+ @Override
+ public SessionProcessor createSessionProcessor(@NonNull Context context) {
+ return null;
+ }
+ }
}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
index 3e74c77..7748d56 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/ExtensionsManager.java
@@ -22,6 +22,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
import androidx.camera.core.CameraProvider;
@@ -82,6 +83,7 @@
* }
* </pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ExtensionsManager {
private static final String TAG = "ExtensionsManager";
@@ -173,7 +175,7 @@
}
},
CameraXExecutors.directExecutor());
- } catch (NoSuchMethodError | NoClassDefFoundError e) {
+ } catch (NoSuchMethodError | NoClassDefFoundError | AbstractMethodError e) {
Logger.e(TAG, "Failed to initialize extensions. Some classes or methods "
+ "are missed in the vendor library. " + e);
completer.set(getOrCreateExtensionsManager(
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java
index 07799cd..88c4207 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureProcessor.java
@@ -24,6 +24,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2CameraCaptureResultConverter;
import androidx.camera.core.ExperimentalGetImage;
import androidx.camera.core.ImageInfo;
@@ -46,6 +47,7 @@
/**
* A {@link CaptureProcessor} that calls a vendor provided implementation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AdaptingCaptureProcessor implements CaptureProcessor {
private final CaptureProcessorImpl mImpl;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureStage.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureStage.java
index 3276023..225da9a 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureStage.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingCaptureStage.java
@@ -20,12 +20,14 @@
import android.util.Pair;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.core.impl.CaptureConfig;
import androidx.camera.core.impl.CaptureStage;
import androidx.camera.extensions.impl.CaptureStageImpl;
/** A {@link CaptureStage} that calls a vendor provided implementation. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AdaptingCaptureStage implements CaptureStage {
private final CaptureConfig mCaptureRequestConfiguration;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
index fad4afa..2b2a6b3 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingPreviewProcessor.java
@@ -24,6 +24,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2CameraCaptureResultConverter;
import androidx.camera.core.ExperimentalGetImage;
import androidx.camera.core.ImageInfo;
@@ -44,6 +45,7 @@
/**
* A {@link CaptureProcessor} that calls a vendor provided preview processing implementation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AdaptingPreviewProcessor implements CaptureProcessor, CloseableProcessor {
private static final String TAG = "AdaptingPreviewProcesso";
private final PreviewImageProcessorImpl mImpl;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
index c1445b9..c8ff32f 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdaptingRequestUpdateProcessor.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2CameraCaptureResultConverter;
import androidx.camera.core.ImageInfo;
import androidx.camera.core.impl.CameraCaptureResult;
@@ -35,6 +36,7 @@
/**
* A {@link ImageInfoProcessor} that calls a vendor provided preview processing implementation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AdaptingRequestUpdateProcessor implements ImageInfoProcessor,
CloseableProcessor {
private final PreviewExtenderImpl mPreviewExtenderImpl;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
index 7915f33..08a60e7 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/AdvancedVendorExtender.java
@@ -26,6 +26,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.interop.Camera2CameraInfo;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
import androidx.camera.core.CameraInfo;
@@ -48,6 +49,7 @@
/**
* Advanced vendor interface implementation
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AdvancedVendorExtender implements VendorExtender {
private final AdvancedExtenderImpl mAdvancedExtenderImpl;
private String mCameraId;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java
index 783554f..e31e8d9 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BasicVendorExtender.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.interop.Camera2CameraInfo;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
import androidx.camera.core.CameraInfo;
@@ -54,6 +55,7 @@
/**
* Basic vendor interface implementation
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class BasicVendorExtender implements VendorExtender {
private static final String TAG = "BasicVendorExtender";
private final @ExtensionMode.Mode int mMode;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BlockingCloseAccessCounter.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BlockingCloseAccessCounter.java
index dc03bef..b41659e 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BlockingCloseAccessCounter.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/BlockingCloseAccessCounter.java
@@ -17,6 +17,7 @@
package androidx.camera.extensions.internal;
import androidx.annotation.GuardedBy;
+import androidx.annotation.RequiresApi;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.Condition;
@@ -45,6 +46,7 @@
* }
* }</pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class BlockingCloseAccessCounter {
@GuardedBy("mLock")
private AtomicInteger mAccessCount = new AtomicInteger(0);
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
index 5fb4252..495a6b8d 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/CloseableProcessor.java
@@ -16,10 +16,13 @@
package androidx.camera.extensions.internal;
+import androidx.annotation.RequiresApi;
+
/**
* A processor that can be closed so that the underlying processing implementation is skipped,
* if it has been closed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CloseableProcessor {
/**
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
index cf7a8fb..6b58434 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionVersion.java
@@ -17,12 +17,14 @@
package androidx.camera.extensions.internal;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.extensions.impl.ExtensionVersionImpl;
/**
* Provides interfaces to check the extension version.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class ExtensionVersion {
private static final String TAG = "ExtenderVersion";
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionsUseCaseConfigFactory.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionsUseCaseConfigFactory.java
index d3180d1..b792fe7 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionsUseCaseConfigFactory.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ExtensionsUseCaseConfigFactory.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.MutableOptionsBundle;
import androidx.camera.core.impl.OptionsBundle;
@@ -30,6 +31,7 @@
* Implementation of UseCaseConfigFactory to provide the default extensions configurations for use
* cases.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ExtensionsUseCaseConfigFactory implements UseCaseConfigFactory {
private final ImageCaptureConfigProvider mImageCaptureConfigProvider;
private final PreviewConfigProvider mPreviewConfigProvider;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
index c51e759..d3a3bea 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/ImageCaptureConfigProvider.java
@@ -26,6 +26,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.impl.CameraEventCallback;
import androidx.camera.camera2.impl.CameraEventCallbacks;
@@ -53,6 +54,7 @@
/**
* Provides extensions related configs for image capture
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ImageCaptureConfigProvider implements ConfigProvider<ImageCaptureConfig> {
private static final String TAG = "ImageCaptureConfigProvider";
static final Config.Option<Integer> OPTION_IMAGE_CAPTURE_CONFIG_PROVIDER_MODE =
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
index 0d21105..14e3138a 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/PreviewConfigProvider.java
@@ -26,6 +26,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.impl.CameraEventCallback;
import androidx.camera.camera2.impl.CameraEventCallbacks;
@@ -49,6 +50,7 @@
/**
* For providing extensions config for preview.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class PreviewConfigProvider implements ConfigProvider<PreviewConfig> {
private static final String TAG = "PreviewConfigProvider";
static final Config.Option<Integer> OPTION_PREVIEW_CONFIG_PROVIDER_MODE = Config.Option.create(
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorExtender.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorExtender.java
index 81b5807..e1f7380 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorExtender.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VendorExtender.java
@@ -25,6 +25,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.impl.SessionProcessor;
@@ -35,6 +36,7 @@
* A unified vendor extensions interface which interacts with both basic and advanced extender
* vendor implementation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface VendorExtender {
/**
* Indicates whether the extension is supported on the device.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java
index 7f13db4..d37eeb4 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/Version.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
@@ -31,6 +32,7 @@
/**
* Class encapsulating a version with major, minor, patch and description values.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class Version implements Comparable<Version> {
public static final Version VERSION_1_0 = Version.create(1, 0, 0, "");
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java
index 19a4e1d..99ad205 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/VersionName.java
@@ -17,10 +17,12 @@
package androidx.camera.extensions.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* The version of CameraX extension releases.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class VersionName {
// Current version of vendor library implementation that the CameraX extension supports. This
// needs to be increased along with the version of vendor library interface.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/DeviceQuirks.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/DeviceQuirks.java
new file mode 100644
index 0000000..11074bb
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/DeviceQuirks.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.extensions.internal.compat.quirk;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+import androidx.camera.core.impl.Quirks;
+
+/**
+ * Provider of device specific quirks, which are used for device specific workarounds.
+ * <p>
+ * Device specific quirks depend on device properties, including the manufacturer
+ * ({@link android.os.Build#MANUFACTURER}), model ({@link android.os.Build#MODEL}) and OS
+ * level ({@link android.os.Build.VERSION#SDK_INT}).
+ * <p>
+ * Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class DeviceQuirks {
+
+ @NonNull
+ private static final Quirks QUIRKS;
+
+ static {
+ QUIRKS = new Quirks(DeviceQuirksLoader.loadQuirks());
+ }
+
+ private DeviceQuirks() {
+ }
+
+ /** Returns all device specific quirks loaded on the current device. */
+ @NonNull
+ public static Quirks getAll() {
+ return QUIRKS;
+ }
+
+ /**
+ * Retrieves a specific device {@link Quirk} instance given its type.
+ *
+ * @param quirkClass The type of device quirk to retrieve.
+ * @return A device {@link Quirk} instance of the provided type, or {@code null} if it isn't
+ * found.
+ */
+ @Nullable
+ public static <T extends Quirk> T get(@NonNull final Class<T> quirkClass) {
+ return QUIRKS.get(quirkClass);
+ }
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/DeviceQuirksLoader.java
new file mode 100644
index 0000000..bd85647
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/DeviceQuirksLoader.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.extensions.internal.compat.quirk;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Loads all device specific quirks required for the current device
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class DeviceQuirksLoader {
+
+ private DeviceQuirksLoader() {
+ }
+
+ /**
+ * Goes through all defined device-specific quirks, and returns those that should be loaded
+ * on the current device.
+ */
+ @NonNull
+ static List<Quirk> loadQuirks() {
+ final List<Quirk> quirks = new ArrayList<>();
+
+ if (ExtensionDisabledQuirk.load()) {
+ quirks.add(new ExtensionDisabledQuirk());
+ }
+
+ return quirks;
+ }
+}
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java
new file mode 100644
index 0000000..7447218
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/ExtensionDisabledQuirk.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.extensions.internal.compat.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+/**
+ * Quirk required to disable extension for some devices.
+ *
+ * <p>An example is Pixel 5 which the availability check result of the basic extension interface
+ * face should be false, but it actually return true. Therefore, a default VendorExtender will
+ * be used to return false availability check result. See b/199408131.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class ExtensionDisabledQuirk implements Quirk {
+ static boolean load() {
+ return isPixel5();
+ }
+
+ /**
+ * Checks whether extension should be disabled.
+ */
+ public boolean shouldDisableExtension(boolean isAdvancedExtenderSupported) {
+ return !isAdvancedExtenderSupported && isPixel5();
+ }
+
+ private static boolean isPixel5() {
+ return "google".equalsIgnoreCase(Build.BRAND) && "redfin".equalsIgnoreCase(Build.DEVICE);
+ }
+}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/package-info.java
similarity index 78%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/package-info.java
index 2ab52fb..b3ced1b 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/quirk/package-info.java
@@ -14,7 +14,10 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.extensions.internal.compat.quirk;
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java
new file mode 100644
index 0000000..d920317
--- /dev/null
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidator.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.extensions.internal.compat.workaround;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.extensions.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.extensions.internal.compat.quirk.ExtensionDisabledQuirk;
+
+/**
+ * Validates whether extension should be disabled.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class ExtensionDisabledValidator {
+ private ExtensionDisabledQuirk mQuirk;
+
+ /**
+ * Constructs an instance of {@link ExtensionDisabledValidator}.
+ */
+ public ExtensionDisabledValidator() {
+ mQuirk = DeviceQuirks.get(ExtensionDisabledQuirk.class);
+ }
+
+ /**
+ * Checks whether extension should be disabled.
+ */
+ public boolean shouldDisableExtension(boolean isAdvancedExtenderSupported) {
+ return mQuirk == null ? false : mQuirk.shouldDisableExtension(isAdvancedExtenderSupported);
+ }
+}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/package-info.java
similarity index 78%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/package-info.java
index 2ab52fb..cc91045 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/compat/workaround/package-info.java
@@ -14,7 +14,10 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+/**
+ * @hide
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY)
+package androidx.camera.extensions.internal.compat.workaround;
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import androidx.annotation.RestrictTo;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java
index b4a33c9..a9dc65d 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/AdvancedSessionProcessor.java
@@ -28,6 +28,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2CameraCaptureResultConverter;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.interop.CaptureRequestOptions;
@@ -54,6 +55,7 @@
/**
* A {@link SessionProcessor} based on OEMs' {@link SessionProcessorImpl}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AdvancedSessionProcessor extends SessionProcessorBase {
private final SessionProcessorImpl mImpl;
private final Context mContext;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java
index 712026f..7ffecb8 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -25,6 +26,7 @@
* A config representing a {@link android.hardware.camera2.params.OutputConfiguration} where
* Surface will be created by the information in this config.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface Camera2OutputConfig {
/**
* Gets the id of this output config. The id can be used to identify the stream in vendor
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java
index 5bd3240..c461f5b 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2OutputConfigBuilder.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.extensions.impl.advanced.Camera2OutputConfigImpl;
import androidx.camera.extensions.impl.advanced.ImageReaderOutputConfigImpl;
import androidx.camera.extensions.impl.advanced.MultiResolutionImageReaderOutputConfigImpl;
@@ -36,6 +37,7 @@
/**
* A builder for building {@link Camera2OutputConfig}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class Camera2OutputConfigBuilder {
private static AtomicInteger sLastId = new AtomicInteger(0);
private OutputConfig mOutputConfig;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java
index c077ee1..4ba35a5 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfig.java
@@ -19,6 +19,7 @@
import android.hardware.camera2.CaptureRequest;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.List;
import java.util.Map;
@@ -26,6 +27,7 @@
/**
* A config representing a {@link android.hardware.camera2.params.SessionConfiguration}
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface Camera2SessionConfig {
/**
* Returns all the {@link Camera2OutputConfig}s that will be used to create
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java
index c178bee..60e13b7 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/Camera2SessionConfigBuilder.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.extensions.impl.advanced.Camera2SessionConfigImpl;
import java.util.ArrayList;
@@ -31,6 +32,7 @@
/**
* A builder implementation to build the {@link Camera2SessionConfig} instance.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class Camera2SessionConfigBuilder {
private int mSessionTemplateId = CameraDevice.TEMPLATE_PREVIEW;
private Map<CaptureRequest.Key<?>, Object> mSessionParameters = new HashMap<>();
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java
index fac650f..4ab0374 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageProcessor.java
@@ -18,10 +18,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* An interface to receive and process the upcoming next available Image.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageProcessor {
/**
* The reference count will be decremented when this method returns. If an extension wants
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java
index 98f4249..79965c9 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReaderOutputConfig.java
@@ -19,10 +19,12 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* Surface will be created by constructing an ImageReader.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageReaderOutputConfig extends Camera2OutputConfig {
/**
* Returns the size of the surface.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java
index 43d866f..c3b88c6 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/ImageReference.java
@@ -19,6 +19,7 @@
import android.media.Image;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* An Image reference container that enables the Image sharing between Camera2/CameraX and OEM
@@ -27,6 +28,7 @@
*
* <p>Implemented by Camera2/CameraX.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageReference {
/**
* Increment the reference count. Returns true if the value was incremented.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java
index 21fd271..7a33619 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/MultiResolutionImageReaderOutputConfig.java
@@ -16,9 +16,12 @@
package androidx.camera.extensions.internal.sessionprocessor;
+import androidx.annotation.RequiresApi;
+
/**
* Surface will be created by constructing a MultiResolutionImageReader.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface MultiResolutionImageReaderOutputConfig extends Camera2OutputConfig {
/**
* Gets the image format of the surface.
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java
index 1ec8a84..7b61ff4 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SessionProcessorBase.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.OptIn;
+import androidx.annotation.RequiresApi;
import androidx.camera.camera2.impl.Camera2ImplConfig;
import androidx.camera.camera2.interop.Camera2CameraInfo;
import androidx.camera.camera2.interop.ExperimentalCamera2Interop;
@@ -49,6 +50,7 @@
* Base class for SessionProcessor implementation. It is responsible for creating image readers and
* maintaining the {@link ImageProcessor} associated with the image reader.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
abstract class SessionProcessorBase implements SessionProcessor {
private static final String TAG = "SessionProcessorBase";
@NonNull
@@ -190,6 +192,7 @@
protected abstract void deInitSessionInternal();
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
private static class ImageRefHolder implements ImageReference {
private int mRefCount;
private Image mImage;
diff --git a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java
index 15f494b..4881283 100644
--- a/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java
+++ b/camera/camera-extensions/src/main/java/androidx/camera/extensions/internal/sessionprocessor/SurfaceOutputConfig.java
@@ -19,10 +19,12 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* Use Surface directly to create the OutputConfiguration.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface SurfaceOutputConfig extends Camera2OutputConfig {
/**
* Get the {@link Surface}. It'll return a valid surface only when type is TYPE_SURFACE.
diff --git a/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt
new file mode 100644
index 0000000..4203a6b
--- /dev/null
+++ b/camera/camera-extensions/src/test/java/androidx/camera/extensions/internal/compat/workaround/ExtensionDisabledValidatorTest.kt
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.extensions.internal.compat.workaround
+
+import android.os.Build
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.ParameterizedRobolectricTestRunner
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+import org.robolectric.util.ReflectionHelpers
+
+@RunWith(ParameterizedRobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class ExtensionDisabledValidatorTest(private val config: TestConfig) {
+ @Test
+ fun shouldUseDefaultVendorExtender() {
+ // Set up device properties
+ if (config.brand != null) {
+ ReflectionHelpers.setStaticField(Build::class.java, "BRAND", config.brand)
+ ReflectionHelpers.setStaticField(Build::class.java, "DEVICE", config.device)
+ }
+
+ val validator =
+ ExtensionDisabledValidator()
+ assertThat(validator.shouldDisableExtension(config.isAdvancedExtenderSupported))
+ .isEqualTo(config.shouldDisableExtension)
+ }
+
+ class TestConfig(
+ val brand: String?,
+ val device: String?,
+ val isAdvancedExtenderSupported: Boolean,
+ val shouldDisableExtension: Boolean
+ )
+
+ companion object {
+ @JvmStatic
+ @ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
+ fun createTestSet(): List<TestConfig> {
+ return listOf(
+ TestConfig("Google", "Redfin", false, true),
+ TestConfig("Google", "Redfin", true, false),
+ TestConfig("", "", false, false),
+ TestConfig("", "", true, false)
+ )
+ }
+ }
+}
diff --git a/camera/camera-lifecycle/api/current.txt b/camera/camera-lifecycle/api/current.txt
index f4ee4e4..7077f67 100644
--- a/camera/camera-lifecycle/api/current.txt
+++ b/camera/camera-lifecycle/api/current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.lifecycle {
- public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+ @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
diff --git a/camera/camera-lifecycle/api/public_plus_experimental_current.txt b/camera/camera-lifecycle/api/public_plus_experimental_current.txt
index 97fd342..c9ff443 100644
--- a/camera/camera-lifecycle/api/public_plus_experimental_current.txt
+++ b/camera/camera-lifecycle/api/public_plus_experimental_current.txt
@@ -4,7 +4,7 @@
@RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalCameraProviderConfiguration {
}
- public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+ @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
method @androidx.camera.lifecycle.ExperimentalCameraProviderConfiguration public static void configureInstance(androidx.camera.core.CameraXConfig);
diff --git a/camera/camera-lifecycle/api/restricted_current.txt b/camera/camera-lifecycle/api/restricted_current.txt
index f4ee4e4..7077f67 100644
--- a/camera/camera-lifecycle/api/restricted_current.txt
+++ b/camera/camera-lifecycle/api/restricted_current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.lifecycle {
- public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
+ @RequiresApi(21) public final class ProcessCameraProvider implements androidx.camera.core.CameraProvider {
method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCase!...);
method @MainThread public androidx.camera.core.Camera bindToLifecycle(androidx.lifecycle.LifecycleOwner, androidx.camera.core.CameraSelector, androidx.camera.core.UseCaseGroup);
method public java.util.List<androidx.camera.core.CameraInfo!> getAvailableCameraInfos();
diff --git a/camera/camera-lifecycle/build.gradle b/camera/camera-lifecycle/build.gradle
index 42d4b73..2b934a8 100644
--- a/camera/camera-lifecycle/build.gradle
+++ b/camera/camera-lifecycle/build.gradle
@@ -33,6 +33,7 @@
annotationProcessor(libs.autoValue)
+ androidTestImplementation(libs.multidex)
androidTestImplementation(libs.testExtJunit)
androidTestImplementation(libs.testCore)
androidTestImplementation(libs.testRunner)
@@ -49,9 +50,8 @@
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
}
-
// Use Robolectric 4.+
testOptions.unitTests.includeAndroidResources = true
}
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java
index d81b9458..2d2eed8 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraRepositoryTest.java
@@ -27,6 +27,7 @@
import androidx.camera.testing.fakes.FakeUseCaseConfigFactory;
import androidx.lifecycle.LifecycleOwner;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -41,6 +42,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public final class LifecycleCameraRepositoryTest {
private FakeLifecycleOwner mLifecycle;
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraTest.java b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraTest.java
index 713ed96..09e6c27 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraTest.java
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/LifecycleCameraTest.java
@@ -27,6 +27,7 @@
import androidx.camera.testing.fakes.FakeUseCase;
import androidx.camera.testing.fakes.FakeUseCaseConfigFactory;
import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import org.junit.Before;
@@ -38,6 +39,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class LifecycleCameraTest {
private LifecycleCamera mLifecycleCamera;
private FakeLifecycleOwner mLifecycleOwner;
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index 1f9bcb8..9e81392 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -21,6 +21,7 @@
import android.content.ContextWrapper
import android.content.pm.PackageManager
import androidx.annotation.OptIn
+import androidx.annotation.RequiresApi
import androidx.camera.core.CameraSelector
import androidx.camera.core.CameraXConfig
import androidx.camera.core.Preview
@@ -34,6 +35,7 @@
import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
import androidx.concurrent.futures.await
import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import androidx.testutils.assertThrows
import com.google.common.truth.Truth.assertThat
@@ -46,6 +48,7 @@
import org.junit.Test
@SmallTest
+@SdkSuppress(minSdkVersion = 21)
public class ProcessCameraProviderTest {
private val context = ApplicationProvider.getApplicationContext() as Context
@@ -589,6 +592,7 @@
}
}
+@RequiresApi(21)
private class TestApplication(val pm: PackageManager) : Application(), CameraXConfig.Provider {
private val used = atomic(false)
val providerUsed: Boolean
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/TestMetaDataConfigProvider.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/TestMetaDataConfigProvider.kt
index cefed0c..9d1e243 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/TestMetaDataConfigProvider.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/TestMetaDataConfigProvider.kt
@@ -18,8 +18,10 @@
import androidx.camera.core.CameraXConfig
import androidx.camera.testing.fakes.FakeAppConfig
+import androidx.test.filters.SdkSuppress
import kotlinx.atomicfu.atomic
+@SdkSuppress(minSdkVersion = 21)
public class TestMetaDataConfigProvider : CameraXConfig.Provider {
public companion object {
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java
index f0acb3e..2bb4313 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCamera.java
@@ -19,6 +19,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraControl;
import androidx.camera.core.CameraInfo;
@@ -42,6 +43,7 @@
* A {@link CameraUseCaseAdapter} whose starting and stopping is controlled by a
* {@link Lifecycle}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class LifecycleCamera implements LifecycleObserver, Camera {
private final Object mLock = new Object();
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProvider.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProvider.java
index f106946..575e308 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProvider.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraProvider.java
@@ -17,6 +17,7 @@
package androidx.camera.lifecycle;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraProvider;
import androidx.camera.core.UseCase;
import androidx.lifecycle.Lifecycle;
@@ -26,6 +27,7 @@
* Provides access to a camera which has has its opening and closing controlled by a
* {@link LifecycleOwner}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
interface LifecycleCameraProvider extends CameraProvider {
/**
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java
index 9257e5f..ed4e47d 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/LifecycleCameraRepository.java
@@ -19,6 +19,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.UseCase;
import androidx.camera.core.ViewPort;
import androidx.camera.core.impl.CameraInternal;
@@ -64,6 +65,7 @@
* When it is released, all UseCases bound to the LifecycleCamera will be unbound and the
* LifecycleCamera will be released.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class LifecycleCameraRepository {
private final Object mLock = new Object();
diff --git a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
index e5994cd..bc15552 100644
--- a/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
+++ b/camera/camera-lifecycle/src/main/java/androidx/camera/lifecycle/ProcessCameraProvider.java
@@ -23,6 +23,7 @@
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.Camera;
@@ -76,6 +77,7 @@
*
* <p>This is the standard provider for applications to use.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ProcessCameraProvider implements LifecycleCameraProvider {
private static final ProcessCameraProvider sAppInstance = new ProcessCameraProvider();
diff --git a/camera/camera-testing/build.gradle b/camera/camera-testing/build.gradle
index 8613c38..da2f9e1 100644
--- a/camera/camera-testing/build.gradle
+++ b/camera/camera-testing/build.gradle
@@ -51,8 +51,6 @@
android {
defaultConfig {
- minSdkVersion 21
-
externalNativeBuild {
cmake {
cppFlags "-std=c++17"
diff --git a/camera/camera-testing/lint.xml b/camera/camera-testing/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-testing/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-testing/src/main/AndroidManifest.xml b/camera/camera-testing/src/main/AndroidManifest.xml
index eb27085..c06343f 100644
--- a/camera/camera-testing/src/main/AndroidManifest.xml
+++ b/camera/camera-testing/src/main/AndroidManifest.xml
@@ -15,7 +15,11 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
package="androidx.camera.testing">
+
+ <uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
+
<uses-permission android:name="android.permission.CAMERA" />
<application>
<activity
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java
index 23fd5c2..72c7f82 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/AndroidUtil.java
@@ -18,9 +18,12 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
+
/**
* Utility methods for testing related to Android OS.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AndroidUtil {
private AndroidUtil() {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/AudioUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/AudioUtil.java
index 487e4fb9..d053ffc 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/AudioUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/AudioUtil.java
@@ -21,9 +21,11 @@
import android.media.AudioRecord;
import android.util.Log;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
/** Utility for audio related functions. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AudioUtil {
private static final String TAG = "AudioUtil";
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CamcorderProfileUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CamcorderProfileUtil.java
index e17eb0c..923a59b 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CamcorderProfileUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CamcorderProfileUtil.java
@@ -21,6 +21,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CamcorderProfileProxy;
/**
@@ -28,6 +29,7 @@
* resolutions, attributes and {@link CamcorderProfileProxy}, which can be used directly on the
* unit tests.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CamcorderProfileUtil {
private CamcorderProfileUtil() {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraAvailabilityUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraAvailabilityUtil.java
index 5fb0ab6..6f37100 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraAvailabilityUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraAvailabilityUtil.java
@@ -17,6 +17,7 @@
package androidx.camera.testing;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.Camera;
import androidx.camera.core.CameraInfoUnavailableException;
@@ -29,6 +30,7 @@
/**
* Utility class to check whether or not specified cameras are available.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraAvailabilityUtil {
/**
* Checks whether this repository supports at least one camera that meets the requirements
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
index b98498d..69745ab 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CameraUtil.java
@@ -76,6 +76,7 @@
import java.util.concurrent.atomic.AtomicReference;
/** Utility functions for obtaining instances of camera2 classes. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CameraUtil {
private CameraUtil() {
}
@@ -150,6 +151,7 @@
* <p>The camera device should always be closed with
* {@link CameraUtil#releaseCameraDevice(CameraDeviceHolder)} once finished with the device.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class CameraDeviceHolder {
final Object mLock = new Object();
@@ -180,71 +182,88 @@
@Nullable CameraDevice.StateCallback extraStateCallback) {
return CallbackToFutureAdapter.getFuture(openCompleter -> {
mCloseFuture = CallbackToFutureAdapter.getFuture(closeCompleter -> {
- cameraManager.openCamera(cameraId, new CameraDevice.StateCallback() {
-
- @Override
- public void onOpened(@NonNull CameraDevice cameraDevice) {
- synchronized (mLock) {
- Preconditions.checkState(mCameraDevice == null, "CameraDevice "
- + "should not have been opened yet.");
- mCameraDevice = cameraDevice;
- }
- if (extraStateCallback != null) {
- extraStateCallback.onOpened(cameraDevice);
- }
- openCompleter.set(null);
- }
-
- @Override
- public void onClosed(@NonNull CameraDevice cameraDevice) {
- if (extraStateCallback != null) {
- extraStateCallback.onClosed(cameraDevice);
- }
- closeCompleter.set(null);
- mHandlerThread.quitSafely();
- }
-
- @Override
- public void onDisconnected(@NonNull CameraDevice cameraDevice) {
- synchronized (mLock) {
- mCameraDevice = null;
- }
- if (extraStateCallback != null) {
- extraStateCallback.onDisconnected(cameraDevice);
- }
- cameraDevice.close();
- }
-
- @Override
- public void onError(@NonNull CameraDevice cameraDevice, int i) {
- boolean notifyOpenFailed = false;
- synchronized (mLock) {
- if (mCameraDevice == null) {
- notifyOpenFailed = true;
- } else {
- mCameraDevice = null;
- }
- }
- if (extraStateCallback != null) {
- extraStateCallback.onError(cameraDevice, i);
- }
-
- if (notifyOpenFailed) {
- openCompleter.setException(new RuntimeException("Failed to "
- + "open camera device due to error code: " + i));
- }
- cameraDevice.close();
-
- }
- }, new Handler(mHandlerThread.getLooper()));
-
+ cameraManager.openCamera(cameraId,
+ new DeviceStateCallbackImpl(openCompleter, closeCompleter,
+ extraStateCallback), new Handler(mHandlerThread.getLooper()));
return "Close[cameraId=" + cameraId + "]";
});
-
return "Open[cameraId=" + cameraId + "]";
});
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info
+ final class DeviceStateCallbackImpl extends CameraDevice.StateCallback {
+
+ private final CallbackToFutureAdapter.Completer<Void> mOpenCompleter;
+ private final CallbackToFutureAdapter.Completer<Void> mCloseCompleter;
+ @Nullable
+ private final CameraDevice.StateCallback mExtraStateCallback;
+
+ DeviceStateCallbackImpl(
+ @NonNull CallbackToFutureAdapter.Completer<Void> openCompleter,
+ @NonNull CallbackToFutureAdapter.Completer<Void> closeCompleter,
+ @Nullable CameraDevice.StateCallback extraStateCallback) {
+ mOpenCompleter = openCompleter;
+ mCloseCompleter = closeCompleter;
+ mExtraStateCallback = extraStateCallback;
+ }
+
+ @Override
+ public void onOpened(@NonNull CameraDevice cameraDevice) {
+ synchronized (mLock) {
+ Preconditions.checkState(mCameraDevice == null, "CameraDevice "
+ + "should not have been opened yet.");
+ mCameraDevice = cameraDevice;
+ }
+ if (mExtraStateCallback != null) {
+ mExtraStateCallback.onOpened(cameraDevice);
+ }
+ mOpenCompleter.set(null);
+ }
+
+ @Override
+ public void onClosed(@NonNull CameraDevice cameraDevice) {
+ if (mExtraStateCallback != null) {
+ mExtraStateCallback.onClosed(cameraDevice);
+ }
+ mCloseCompleter.set(null);
+ mHandlerThread.quitSafely();
+ }
+
+ @Override
+ public void onDisconnected(@NonNull CameraDevice cameraDevice) {
+ synchronized (mLock) {
+ mCameraDevice = null;
+ }
+ if (mExtraStateCallback != null) {
+ mExtraStateCallback.onDisconnected(cameraDevice);
+ }
+ cameraDevice.close();
+ }
+
+ @Override
+ public void onError(@NonNull CameraDevice cameraDevice, int i) {
+ boolean notifyOpenFailed = false;
+ synchronized (mLock) {
+ if (mCameraDevice == null) {
+ notifyOpenFailed = true;
+ } else {
+ mCameraDevice = null;
+ }
+ }
+ if (mExtraStateCallback != null) {
+ mExtraStateCallback.onError(cameraDevice, i);
+ }
+
+ if (notifyOpenFailed) {
+ mOpenCompleter.setException(new RuntimeException("Failed to "
+ + "open camera device due to error code: " + i));
+ }
+ cameraDevice.close();
+
+ }
+ }
+
/**
* Blocks until the camera device has been closed.
*/
@@ -700,6 +719,7 @@
* <p>Passing false into the constructor {@link #PreTestCamera(boolean)}
* will never throw the exception when the camera is unavailable.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class PreTestCamera implements TestRule {
final boolean mThrowOnError;
final AtomicReference<Boolean> mCanOpenCamera = new AtomicReference<>();
@@ -793,6 +813,7 @@
*
* <p>Call {@link #shutdown()} after finish the test.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class RetryCameraOpener {
private static final int RETRY_DELAY_MS = 1000;
private CameraAvailability mCameraAvailability;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/Configs.java b/camera/camera-testing/src/main/java/androidx/camera/testing/Configs.java
index 23cffbc7..a90babe 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/Configs.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/Configs.java
@@ -17,6 +17,7 @@
package androidx.camera.testing;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.CameraInfoInternal;
import androidx.camera.core.impl.UseCaseConfig;
@@ -29,6 +30,7 @@
/**
* Utility functions related to operating on androidx.camera.core.impl.Config instances.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Configs {
/** Return a map that associates UseCases to UseCaseConfigs with default settings. */
@NonNull
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
index 451b33b..22b1973 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/CoreAppTestUtil.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.testing.activity.ForegroundTestActivity;
import androidx.test.espresso.Espresso;
@@ -39,6 +40,7 @@
import java.io.IOException;
/** Utility functions of tests on CoreTestApp. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class CoreAppTestUtil {
/** ADB shell input key code for dismissing keyguard for device with API level <= 22. */
@@ -186,6 +188,7 @@
}
/** The display foreground of the device is occupied that cannot execute UI related test. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class ForegroundOccupiedError extends Exception {
public ForegroundOccupiedError(@NonNull String message) {
super(message);
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/DeferrableSurfacesUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/DeferrableSurfacesUtil.java
index 0ee14f3..a2d3096 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/DeferrableSurfacesUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/DeferrableSurfacesUtil.java
@@ -20,6 +20,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.DeferrableSurface;
import androidx.camera.core.impl.DeferrableSurfaces;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -32,6 +33,7 @@
import java.util.concurrent.ScheduledExecutorService;
/** Utility functions for DeferrableSurfaces. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeferrableSurfacesUtil {
private DeferrableSurfacesUtil() {
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/GLUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/GLUtil.java
index cb58c7a..4c4e2db 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/GLUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/GLUtil.java
@@ -36,6 +36,8 @@
import android.opengl.EGLSurface;
import android.opengl.GLES20;
+import androidx.annotation.RequiresApi;
+
import java.util.Objects;
/**
@@ -43,6 +45,7 @@
*
* <p> These utility methods are meant only for testing purposes.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class GLUtil {
private GLUtil() {
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java
index 8b2797d..ca6d592 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/GarbageCollectionUtil.java
@@ -16,6 +16,8 @@
package androidx.camera.testing;
+import androidx.annotation.RequiresApi;
+
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.util.concurrent.TimeoutException;
@@ -23,6 +25,7 @@
/**
* Utility class for tests containing methods related to garbage collection.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class GarbageCollectionUtil {
private static final long FINALIZE_TIMEOUT_MILLIS = 200L;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/HandlerUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/HandlerUtil.java
index 451d89a..49c27af 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/HandlerUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/HandlerUtil.java
@@ -20,11 +20,13 @@
import android.os.Looper;
import android.os.MessageQueue;
+import androidx.annotation.RequiresApi;
import androidx.camera.testing.compat.LooperCompat;
import java.util.concurrent.Semaphore;
/** Utility functions for {@link Handler} */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class HandlerUtil {
/**
* Wait for the {@link Looper} of the given {@link Handler} to idle.
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/ImageProxyUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/ImageProxyUtil.java
index 3d82c1b..4ab5e9ab 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/ImageProxyUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/ImageProxyUtil.java
@@ -19,6 +19,7 @@
import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageProxy;
import java.nio.ByteBuffer;
@@ -26,6 +27,7 @@
/**
* Utility class to generate image planes and buffer data in image proxy for unit test.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ImageProxyUtil {
private ImageProxyUtil() {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt b/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt
index 28da413..29a894f 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/LabTestRule.kt
@@ -17,6 +17,7 @@
package androidx.camera.testing
import android.util.Log
+import androidx.annotation.RequiresApi
import org.junit.Assume.assumeTrue
import org.junit.rules.TestRule
import org.junit.runner.Description
@@ -43,6 +44,7 @@
` *
* <br></br><br></br>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class LabTestRule : TestRule {
/**
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt b/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt
index 75f3384..aec51e1 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/ObservableExtensions.kt
@@ -15,9 +15,11 @@
*/
@file:OptIn(kotlinx.coroutines.ExperimentalCoroutinesApi::class)
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
package androidx.camera.testing
+import androidx.annotation.RequiresApi
import androidx.camera.core.impl.Observable
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineStart
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceFormatUtil.java b/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceFormatUtil.java
index 207d89803..b58dc04 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceFormatUtil.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceFormatUtil.java
@@ -19,10 +19,12 @@
import android.view.Surface;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* Surface format related utility functions.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class SurfaceFormatUtil {
private SurfaceFormatUtil() {}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceTextureProvider.java b/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceTextureProvider.java
index ecb5d25..d99f20a 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceTextureProvider.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/SurfaceTextureProvider.java
@@ -22,6 +22,7 @@
import android.view.TextureView;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Preview;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -29,6 +30,7 @@
* This class creates implementations of PreviewSurfaceProvider that provide Surfaces that have been
* pre-configured for specific work flows.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SurfaceTextureProvider {
private SurfaceTextureProvider() {
}
@@ -90,6 +92,7 @@
* {@link Preview}. See {@link #createSurfaceTextureProvider(SurfaceTextureCallback)} for
* code example.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface SurfaceTextureCallback {
/**
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/TimestampCaptureProcessor.java b/camera/camera-testing/src/main/java/androidx/camera/testing/TimestampCaptureProcessor.java
index 7f7ff94..72c18fa 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/TimestampCaptureProcessor.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/TimestampCaptureProcessor.java
@@ -21,6 +21,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.ExperimentalGetImage;
import androidx.camera.core.ImageProxy;
@@ -42,6 +43,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.TESTS)
public class TimestampCaptureProcessor implements CaptureProcessor {
private CaptureProcessor mCaptureProcessor;
@@ -62,6 +64,7 @@
* Interface for receiving the timestamps of all {@link ImageProxy} which are processed by the
* wrapped {@link CaptureProcessor}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface TimestampListener {
/**
* Called whenever an {@link ImageProxy} is processed.
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java
index 6377d1cb..3165eec 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/Camera2TestActivity.java
@@ -36,6 +36,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import androidx.annotation.VisibleForTesting;
import androidx.camera.core.Logger;
@@ -48,6 +49,7 @@
import java.util.concurrent.TimeUnit;
/** An activity which opens the camera via Camera2 API for testing. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class Camera2TestActivity extends Activity {
private static final String TAG = "Camera2TestActivity";
@@ -104,36 +106,8 @@
};
- private final CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
-
- @Override
- public void onOpened(@NonNull CameraDevice cameraDevice) {
- Logger.d(TAG, "Camera onOpened: " + cameraDevice);
- // This method is called when the camera is opened. We start camera preview here.
- mCameraOpenCloseLock.release();
- mCameraDevice = cameraDevice;
- createCameraPreviewSession();
- }
-
- @Override
- public void onDisconnected(@NonNull CameraDevice cameraDevice) {
- Logger.d(TAG, "Camera onDisconnected: " + cameraDevice);
- mCameraOpenCloseLock.release();
- cameraDevice.close();
- mCameraDevice = null;
- finish();
- }
-
- @Override
- public void onError(@NonNull CameraDevice cameraDevice, int error) {
- Logger.d(TAG, "Camera onError: " + cameraDevice);
- mCameraOpenCloseLock.release();
- cameraDevice.close();
- mCameraDevice = null;
- finish();
- }
-
- };
+ private final CameraDevice.StateCallback mDeviceStateCallback =
+ new DeviceStateCallbackImpl();
@VisibleForTesting
public final CountingIdlingResource mPreviewReady = new CountingIdlingResource("PreviewReady");
@@ -202,7 +176,7 @@
if (!mCameraOpenCloseLock.tryAcquire(2500, TimeUnit.MILLISECONDS)) {
throw new RuntimeException("Time out waiting to lock camera opening.");
}
- manager.openCamera(mCameraId, mStateCallback, mBackgroundHandler);
+ manager.openCamera(mCameraId, mDeviceStateCallback, mBackgroundHandler);
} catch (CameraAccessException e) {
e.printStackTrace();
} catch (InterruptedException e) {
@@ -256,41 +230,7 @@
// Here, we create a CameraCaptureSession for camera preview.
mCameraDevice.createCaptureSession(Collections.singletonList(surface),
- new CameraCaptureSession.StateCallback() {
-
- @Override
- @SuppressWarnings("CatchAndPrintStackTrace")
- public void onConfigured(
- @NonNull CameraCaptureSession cameraCaptureSession) {
- // The camera is already closed
- if (null == mCameraDevice) {
- return;
- }
-
- // When the session is ready, we start displaying the preview.
- mCaptureSession = cameraCaptureSession;
- try {
- // Auto focus should be continuous for camera preview.
- mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
- CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
-
- // Finally, we start displaying the camera preview.
- mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(),
- new CameraCaptureSession.CaptureCallback() {
-
- },
- mBackgroundHandler);
- } catch (CameraAccessException e) {
- e.printStackTrace();
- }
- }
-
- @Override
- public void onConfigureFailed(
- @NonNull CameraCaptureSession cameraCaptureSession) {
- }
- }, null
- );
+ new SessionStateCallbackImpl(), null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
@@ -321,4 +261,71 @@
e.printStackTrace();
}
}
+
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+ final class DeviceStateCallbackImpl extends CameraDevice.StateCallback {
+
+ @Override
+ public void onOpened(@NonNull CameraDevice cameraDevice) {
+ Logger.d(TAG, "Camera onOpened: " + cameraDevice);
+ // This method is called when the camera is opened. We start camera preview here.
+ mCameraOpenCloseLock.release();
+ mCameraDevice = cameraDevice;
+ createCameraPreviewSession();
+ }
+
+ @Override
+ public void onDisconnected(@NonNull CameraDevice cameraDevice) {
+ Logger.d(TAG, "Camera onDisconnected: " + cameraDevice);
+ mCameraOpenCloseLock.release();
+ cameraDevice.close();
+ mCameraDevice = null;
+ finish();
+ }
+
+ @Override
+ public void onError(@NonNull CameraDevice cameraDevice, int error) {
+ Logger.d(TAG, "Camera onError: " + cameraDevice);
+ mCameraOpenCloseLock.release();
+ cameraDevice.close();
+ mCameraDevice = null;
+ finish();
+ }
+ }
+
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+ final class SessionStateCallbackImpl extends CameraCaptureSession.StateCallback {
+
+ @Override
+ @SuppressWarnings("CatchAndPrintStackTrace")
+ public void onConfigured(
+ @NonNull CameraCaptureSession cameraCaptureSession) {
+ // The camera is already closed
+ if (null == mCameraDevice) {
+ return;
+ }
+
+ // When the session is ready, we start displaying the preview.
+ mCaptureSession = cameraCaptureSession;
+ try {
+ // Auto focus should be continuous for camera preview.
+ mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE,
+ CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
+
+ // Finally, we start displaying the camera preview.
+ mCaptureSession.setRepeatingRequest(mPreviewRequestBuilder.build(),
+ new CameraCaptureSession.CaptureCallback() {
+
+ },
+ mBackgroundHandler);
+ } catch (CameraAccessException e) {
+ e.printStackTrace();
+ }
+ }
+
+ @Override
+ public void onConfigureFailed(
+ @NonNull CameraCaptureSession cameraCaptureSession) {
+ }
+ }
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
index c17385f..0d65e3a 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/CameraXTestActivity.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.appcompat.app.AppCompatActivity;
import androidx.camera.core.CameraSelector;
@@ -45,6 +46,7 @@
import java.util.concurrent.ExecutionException;
/** An activity which starts CameraX preview for testing. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraXTestActivity extends AppCompatActivity {
private static final String TAG = "CameraXTestActivity";
@@ -139,23 +141,8 @@
}
});
- mPreview.setSurfaceProvider(createSurfaceTextureProvider(
- new SurfaceTextureProvider.SurfaceTextureCallback() {
- @Override
- public void onSurfaceTextureReady(@NonNull SurfaceTexture surfaceTexture,
- @NonNull Size resolution) {
- ViewGroup viewGroup = (ViewGroup) textureView.getParent();
- viewGroup.removeView(textureView);
- viewGroup.addView(textureView, resolution.getWidth(),
- resolution.getHeight());
- textureView.setSurfaceTexture(surfaceTexture);
- }
-
- @Override
- public void onSafeToRelease(@NonNull SurfaceTexture surfaceTexture) {
- surfaceTexture.release();
- }
- }));
+ mPreview.setSurfaceProvider(
+ createSurfaceTextureProvider(new SurfaceTextureCallbackImpl(textureView)));
try {
final CameraX cameraX = CameraX.getOrCreateInstance(this).get();
@@ -186,4 +173,29 @@
public CountingIdlingResource getPreviewReady() {
return mPreviewReady;
}
+
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+ private static final class SurfaceTextureCallbackImpl implements
+ SurfaceTextureProvider.SurfaceTextureCallback {
+ private final TextureView mTextureView;
+
+ SurfaceTextureCallbackImpl(@NonNull TextureView textureView) {
+ mTextureView = textureView;
+ }
+
+ @Override
+ public void onSurfaceTextureReady(@NonNull SurfaceTexture surfaceTexture,
+ @NonNull Size resolution) {
+ ViewGroup viewGroup = (ViewGroup) mTextureView.getParent();
+ viewGroup.removeView(mTextureView);
+ viewGroup.addView(mTextureView, resolution.getWidth(),
+ resolution.getHeight());
+ mTextureView.setSurfaceTexture(surfaceTexture);
+ }
+
+ @Override
+ public void onSafeToRelease(@NonNull SurfaceTexture surfaceTexture) {
+ surfaceTexture.release();
+ }
+ }
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/ForegroundTestActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/ForegroundTestActivity.java
index 707cf87..1ab9021 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/activity/ForegroundTestActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/activity/ForegroundTestActivity.java
@@ -21,9 +21,11 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.test.espresso.idling.CountingIdlingResource;
/** An empty activity that checks the activity's <em>main</em> window currently has window focus. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ForegroundTestActivity extends Activity {
final CountingIdlingResource mViewReady = new CountingIdlingResource("ViewReady");
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/compat/LooperCompat.java b/camera/camera-testing/src/main/java/androidx/camera/testing/compat/LooperCompat.java
index c11ca1a..cb9b679 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/compat/LooperCompat.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/compat/LooperCompat.java
@@ -28,6 +28,7 @@
import java.lang.reflect.Method;
/** Compat functions for {@link Looper} */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class LooperCompat {
/** Returns the {@link MessageQueue} for the given {@link Looper}. */
public static MessageQueue getQueue(Looper looper) {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeActivity.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeActivity.java
index 3d873ca..10ed37e 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeActivity.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeActivity.java
@@ -18,6 +18,9 @@
import android.app.Activity;
+import androidx.annotation.RequiresApi;
+
/** A fake {@link Activity} that can be used in tests. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FakeActivity extends Activity {
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
index d9bb429..e62c998 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeAppConfig.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.CameraXConfig;
@@ -29,6 +30,7 @@
*
* <p>This {@link CameraXConfig} contains all fake CameraX implementation components.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FakeAppConfig {
private FakeAppConfig() {
}
@@ -77,6 +79,7 @@
}
/** @hide */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public static final class DefaultProvider implements CameraXConfig.Provider {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java
index e93eea0..f59107f 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamcorderProfileProvider.java
@@ -21,12 +21,14 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CamcorderProfileProvider;
import androidx.camera.core.impl.CamcorderProfileProxy;
/**
* A fake implementation of the {@link CamcorderProfileProvider} and used for test.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FakeCamcorderProfileProvider implements CamcorderProfileProvider {
private final SparseArray<CamcorderProfileProxy> mQualityToProfileMap;
@@ -51,6 +53,7 @@
/**
* The builder to create a FakeCamcorderProfileProvider instance.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class Builder {
private final SparseArray<CamcorderProfileProxy> mQualityToProfileMap = new SparseArray<>();
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java
index 2d1356f..ef664dd 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCamera.java
@@ -22,6 +22,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.CameraControlInternal;
@@ -49,6 +50,7 @@
/**
* A fake camera which will not produce any data, but provides a valid Camera implementation.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FakeCamera implements CameraInternal {
private static final String TAG = "FakeCamera";
private static final String DEFAULT_CAMERA_ID = "0";
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraCaptureResult.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraCaptureResult.java
index 5f2c2e1..e0b97b1 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraCaptureResult.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraCaptureResult.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CameraCaptureMetaData;
@@ -29,6 +30,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class FakeCameraCaptureResult implements CameraCaptureResult {
private CameraCaptureMetaData.AfMode mAfMode = CameraCaptureMetaData.AfMode.UNKNOWN;
@@ -113,6 +115,7 @@
*
* @hide
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public static class Builder {
private CameraCaptureMetaData.AfMode mAfMode = CameraCaptureMetaData.AfMode.UNKNOWN;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java
index b77b720..875f924 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraControl.java
@@ -22,6 +22,7 @@
import android.graphics.Rect;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.FocusMeteringAction;
import androidx.camera.core.FocusMeteringResult;
import androidx.camera.core.ImageCapture;
@@ -45,6 +46,7 @@
* A fake implementation for the CameraControlInternal interface which is capable of notifying
* submitted requests onCaptureCancelled/onCaptureCompleted/onCaptureFailed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FakeCameraControl implements CameraControlInternal {
private static final String TAG = "FakeCameraControl";
private final ControlUpdateCallback mControlUpdateCallback;
@@ -211,6 +213,7 @@
}
/** A listener which are used to notify when there are new submitted capture requests */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface OnNewCaptureRequestListener {
/** Called when there are new submitted capture request */
void onNewCaptureRequests(@NonNull List<CaptureConfig> captureConfigs);
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraDeviceSurfaceManager.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraDeviceSurfaceManager.java
index 49f1c47..10144e0 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraDeviceSurfaceManager.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraDeviceSurfaceManager.java
@@ -19,6 +19,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.CameraDeviceSurfaceManager;
import androidx.camera.core.impl.SurfaceConfig;
import androidx.camera.core.impl.UseCaseConfig;
@@ -28,6 +29,7 @@
import java.util.Map;
/** A CameraDeviceSurfaceManager which has no supported SurfaceConfigs. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FakeCameraDeviceSurfaceManager implements CameraDeviceSurfaceManager {
public static final Size MAX_OUTPUT_SIZE = new Size(4032, 3024); // 12.2 MP
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
index ab7ce10..547ef69 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraFactory.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.CameraSelector;
@@ -42,6 +43,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class FakeCameraFactory implements CameraFactory {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
index 8ddf758..d26fb42 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.CameraState;
import androidx.camera.core.ExposureState;
@@ -49,6 +50,7 @@
*
* <p>This camera info can be constructed with fake values.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FakeCameraInfoInternal implements CameraInfoInternal {
private final String mCameraId;
private final int mSensorRotation;
@@ -139,29 +141,7 @@
@NonNull
@Override
public ExposureState getExposureState() {
- return new ExposureState() {
- @Override
- public int getExposureCompensationIndex() {
- return 0;
- }
-
- @NonNull
- @Override
- public Range<Integer> getExposureCompensationRange() {
- return Range.create(0, 0);
- }
-
- @NonNull
- @Override
- public Rational getExposureCompensationStep() {
- return Rational.ZERO;
- }
-
- @Override
- public boolean isExposureCompensationSupported() {
- return true;
- }
- };
+ return new FakeExposureState();
}
@NonNull
@@ -226,4 +206,29 @@
@NonNull CamcorderProfileProvider camcorderProfileProvider) {
mCamcorderProfileProvider = Preconditions.checkNotNull(camcorderProfileProvider);
}
+
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+ static final class FakeExposureState implements ExposureState {
+ @Override
+ public int getExposureCompensationIndex() {
+ return 0;
+ }
+
+ @NonNull
+ @Override
+ public Range<Integer> getExposureCompensationRange() {
+ return Range.create(0, 0);
+ }
+
+ @NonNull
+ @Override
+ public Rational getExposureCompensationStep() {
+ return Rational.ZERO;
+ }
+
+ @Override
+ public boolean isExposureCompensationSupported() {
+ return true;
+ }
+ }
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCaptureStage.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCaptureStage.java
index 41a920f..05aad09 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCaptureStage.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCaptureStage.java
@@ -16,6 +16,7 @@
package androidx.camera.testing.fakes;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.CaptureConfig;
@@ -26,6 +27,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public class FakeCaptureStage implements CaptureStage {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeConfig.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeConfig.java
index 3723736..c6b1c32 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeConfig.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeConfig.java
@@ -17,6 +17,7 @@
package androidx.camera.testing.fakes;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.ExtendableBuilder;
@@ -31,6 +32,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class FakeConfig implements ReadableConfig {
@@ -47,6 +49,7 @@
}
/** Builder for an empty Config */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements ExtendableBuilder<FakeConfig> {
private final MutableOptionsBundle mOptionsBundle;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java
index df8a0da..6ba8e75 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageInfo.java
@@ -17,6 +17,7 @@
package androidx.camera.testing.fakes;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageInfo;
import androidx.camera.core.impl.MutableTagBundle;
import androidx.camera.core.impl.TagBundle;
@@ -25,6 +26,7 @@
/**
* A fake implementation of {@link ImageInfo} where the values are settable.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FakeImageInfo implements ImageInfo {
private MutableTagBundle mTagBundle = MutableTagBundle.create();
private long mTimestamp;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageProxy.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageProxy.java
index 7d1a33d..2ed5aa2 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageProxy.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageProxy.java
@@ -22,6 +22,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ExperimentalGetImage;
import androidx.camera.core.ImageInfo;
import androidx.camera.core.ImageProxy;
@@ -33,6 +34,7 @@
/**
* A fake implementation of {@link ImageProxy} where the values are settable.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FakeImageProxy implements ImageProxy {
private Rect mCropRect = new Rect();
private int mFormat = 0;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java
index 288878a..da94576 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeImageReaderProxy.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageProxy;
import androidx.camera.core.impl.ImageReaderProxy;
import androidx.camera.core.impl.TagBundle;
@@ -40,6 +41,7 @@
* A fake implementation of ImageReaderProxy where the values are settable and the
* OnImageAvailableListener can be triggered.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FakeImageReaderProxy implements ImageReaderProxy {
private int mWidth = 100;
private int mHeight = 100;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeLifecycleOwner.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeLifecycleOwner.java
index 7c9435a..85cc321 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeLifecycleOwner.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeLifecycleOwner.java
@@ -17,6 +17,7 @@
package androidx.camera.testing.fakes;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.lifecycle.Lifecycle;
@@ -29,6 +30,7 @@
* @hide
* @see <a href="https://developer.android.com/topic/libraries/architecture/lifecycle">lifecycle</a>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class FakeLifecycleOwner implements LifecycleOwner {
private final LifecycleRegistry mLifecycleRegistry;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeMultiValueSet.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeMultiValueSet.java
index 9c8d51a..35089c9 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeMultiValueSet.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeMultiValueSet.java
@@ -17,6 +17,7 @@
package androidx.camera.testing.fakes;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.impl.MultiValueSet;
@@ -26,6 +27,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public class FakeMultiValueSet extends MultiValueSet<FakeMultiValueSet> {
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java
index 65970ed..ff03369 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCase.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.Config;
@@ -29,6 +30,7 @@
/**
* A fake {@link UseCase}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FakeUseCase extends UseCase {
private volatile boolean mIsDetached = false;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java
index 3c0c172..2393076 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfig.java
@@ -20,6 +20,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraSelector;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.CaptureConfig;
@@ -31,13 +32,12 @@
import androidx.camera.core.impl.OptionsBundle;
import androidx.camera.core.impl.SessionConfig;
import androidx.camera.core.impl.UseCaseConfig;
-import androidx.core.util.Consumer;
-import java.util.Collection;
import java.util.List;
import java.util.UUID;
/** A fake configuration for {@link FakeUseCase}. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class FakeUseCaseConfig implements UseCaseConfig<FakeUseCase>, ImageOutputConfig {
private final Config mConfig;
@@ -59,6 +59,7 @@
}
/** Builder for an empty Config */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements
UseCaseConfig.Builder<FakeUseCase, FakeUseCaseConfig, FakeUseCaseConfig.Builder>,
ImageOutputConfig.Builder<FakeUseCaseConfig.Builder> {
@@ -220,14 +221,5 @@
getMutableConfig().insertOption(OPTION_INPUT_FORMAT, imageFormat);
return this;
}
-
- @NonNull
- @Override
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
}
}
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfigFactory.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfigFactory.java
index 40e7c89..609cf8c 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfigFactory.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeUseCaseConfigFactory.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.MutableOptionsBundle;
@@ -31,6 +32,7 @@
* A fake implementation of {@link UseCaseConfigFactory}.
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public final class FakeUseCaseConfigFactory implements UseCaseConfigFactory {
/**
diff --git a/camera/camera-testlib-extensions/build.gradle b/camera/camera-testlib-extensions/build.gradle
index deb9bbd..077c748 100644
--- a/camera/camera-testlib-extensions/build.gradle
+++ b/camera/camera-testlib-extensions/build.gradle
@@ -29,7 +29,6 @@
android {
defaultConfig {
- minSdkVersion 21
versionCode 1
multiDexEnabled true
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
index 6154482..e1f6033 100755
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoImageCaptureExtenderImpl.java
@@ -30,6 +30,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -44,6 +45,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AutoImageCaptureExtenderImpl implements ImageCaptureExtenderImpl {
private static final String TAG = "AutoICExtender";
private static final int DEFAULT_STAGE_ID = 0;
@@ -84,59 +86,11 @@
@Override
public CaptureProcessorImpl getCaptureProcessor() {
- CaptureProcessorImpl captureProcessor =
- new CaptureProcessorImpl() {
- private ImageWriter mImageWriter;
-
- @Override
- public void onOutputSurface(Surface surface, int imageFormat) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mImageWriter = ImageWriter.newInstance(surface, 1);
- }
- }
-
- @Override
- public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
- Log.d(TAG, "Started auto CaptureProcessor");
-
- Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
-
- if (result == null) {
- Log.w(TAG,
- "Unable to process since images does not contain all stages.");
- return;
- } else {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- Image image = mImageWriter.dequeueInputImage();
-
- // Do processing here
- ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
- ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
- ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
-
- // Sample here just simply copy/paste the capture image result
- yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
- uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
- vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
-
- mImageWriter.queueInputImage(image);
- }
- }
-
- Log.d(TAG, "Completed auto CaptureProcessor");
- }
-
- @Override
- public void onResolutionUpdate(Size size) {
-
- }
-
- @Override
- public void onImageFormatUpdate(int imageFormat) {
-
- }
- };
- return captureProcessor;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ return new AutoImageCaptureExtenderCaptureProcessorImpl();
+ } else {
+ return new NoOpCaptureProcessorImpl();
+ }
}
@Override
@@ -201,4 +155,54 @@
public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
return new Range<>(300L, 1000L);
}
+
+ @RequiresApi(23)
+ static final class AutoImageCaptureExtenderCaptureProcessorImpl implements
+ CaptureProcessorImpl {
+ private ImageWriter mImageWriter;
+
+ @Override
+ public void onOutputSurface(Surface surface, int imageFormat) {
+ mImageWriter = ImageWriter.newInstance(surface, 1);
+ }
+
+ @Override
+ public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
+ Log.d(TAG, "Started auto CaptureProcessor");
+
+ Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
+
+ if (result == null) {
+ Log.w(TAG,
+ "Unable to process since images does not contain all stages.");
+ return;
+ } else {
+ Image image = mImageWriter.dequeueInputImage();
+
+ // Do processing here
+ ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
+ ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
+ ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
+
+ // Sample here just simply copy/paste the capture image result
+ yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
+ uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
+ vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
+
+ mImageWriter.queueInputImage(image);
+ }
+
+ Log.d(TAG, "Completed auto CaptureProcessor");
+ }
+
+ @Override
+ public void onResolutionUpdate(Size size) {
+
+ }
+
+ @Override
+ public void onImageFormatUpdate(int imageFormat) {
+
+ }
+ }
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java
index 0814b3d..e2aabfa 100755
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/AutoPreviewExtenderImpl.java
@@ -24,6 +24,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -35,6 +36,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AutoPreviewExtenderImpl implements PreviewExtenderImpl {
private static final int DEFAULT_STAGE_ID = 0;
private static final int SESSION_STAGE_ID = 101;
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
index 8380a7f..89871c8 100755
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyImageCaptureExtenderImpl.java
@@ -32,6 +32,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -46,6 +47,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class BeautyImageCaptureExtenderImpl implements ImageCaptureExtenderImpl {
private static final String TAG = "BeautyICExtender";
private static final int DEFAULT_STAGE_ID = 0;
@@ -89,59 +91,11 @@
@Override
public CaptureProcessorImpl getCaptureProcessor() {
- CaptureProcessorImpl captureProcessor =
- new CaptureProcessorImpl() {
- private ImageWriter mImageWriter;
-
- @Override
- public void onOutputSurface(Surface surface, int imageFormat) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mImageWriter = ImageWriter.newInstance(surface, 1);
- }
- }
-
- @Override
- public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
- Log.d(TAG, "Started beauty CaptureProcessor");
-
- Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
-
- if (result == null) {
- Log.w(TAG,
- "Unable to process since images does not contain all stages.");
- return;
- } else {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- Image image = mImageWriter.dequeueInputImage();
-
- // Do processing here
- ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
- ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
- ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
-
- // Sample here just simply copy/paste the capture image result
- yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
- uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
- vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
-
- mImageWriter.queueInputImage(image);
- }
- }
-
- Log.d(TAG, "Completed beauty CaptureProcessor");
- }
-
- @Override
- public void onResolutionUpdate(Size size) {
-
- }
-
- @Override
- public void onImageFormatUpdate(int imageFormat) {
-
- }
- };
- return captureProcessor;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ return new BeautyImageCaptureExtenderCaptureProcessorImpl();
+ } else {
+ return new NoOpCaptureProcessorImpl();
+ }
}
@Override
@@ -227,4 +181,54 @@
public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
return new Range<>(300L, 1000L);
}
+
+ @RequiresApi(23)
+ static final class BeautyImageCaptureExtenderCaptureProcessorImpl implements
+ CaptureProcessorImpl {
+ private ImageWriter mImageWriter;
+
+ @Override
+ public void onOutputSurface(Surface surface, int imageFormat) {
+ mImageWriter = ImageWriter.newInstance(surface, 1);
+ }
+
+ @Override
+ public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
+ Log.d(TAG, "Started beauty CaptureProcessor");
+
+ Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
+
+ if (result == null) {
+ Log.w(TAG,
+ "Unable to process since images does not contain all stages.");
+ return;
+ } else {
+ Image image = mImageWriter.dequeueInputImage();
+
+ // Do processing here
+ ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
+ ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
+ ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
+
+ // Sample here just simply copy/paste the capture image result
+ yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
+ uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
+ vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
+
+ mImageWriter.queueInputImage(image);
+ }
+
+ Log.d(TAG, "Completed beauty CaptureProcessor");
+ }
+
+ @Override
+ public void onResolutionUpdate(Size size) {
+
+ }
+
+ @Override
+ public void onImageFormatUpdate(int imageFormat) {
+
+ }
+ }
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java
index 4801055..a49c0e6 100755
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BeautyPreviewExtenderImpl.java
@@ -26,6 +26,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.ArrayList;
import java.util.List;
@@ -38,6 +39,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class BeautyPreviewExtenderImpl implements PreviewExtenderImpl {
private static final int DEFAULT_STAGE_ID = 0;
private static final int SESSION_STAGE_ID = 101;
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
index f0f7c59..df88d11 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehImageCaptureExtenderImpl.java
@@ -30,6 +30,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -44,6 +45,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class BokehImageCaptureExtenderImpl implements ImageCaptureExtenderImpl {
private static final String TAG = "BokehICExtender";
private static final int DEFAULT_STAGE_ID = 0;
@@ -84,60 +86,11 @@
@Override
public CaptureProcessorImpl getCaptureProcessor() {
- CaptureProcessorImpl captureProcessor =
- new CaptureProcessorImpl() {
- private ImageWriter mImageWriter;
-
- @Override
- public void onOutputSurface(Surface surface, int imageFormat) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mImageWriter = ImageWriter.newInstance(surface, 1);
- }
- }
-
- @Override
- public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
- Log.d(TAG, "Started bokeh CaptureProcessor");
-
- Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
-
- if (result == null) {
- Log.w(TAG,
- "Unable to process since images does not contain all stages.");
- return;
- } else {
- if (android.os.Build.VERSION.SDK_INT
- >= android.os.Build.VERSION_CODES.M) {
- Image image = mImageWriter.dequeueInputImage();
-
- // Do processing here
- ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
- ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
- ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
-
- // Sample here just simply copy/paste the capture image result
- yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
- uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
- vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
-
- mImageWriter.queueInputImage(image);
- }
- }
-
- Log.d(TAG, "Completed bokeh CaptureProcessor");
- }
-
- @Override
- public void onResolutionUpdate(Size size) {
-
- }
-
- @Override
- public void onImageFormatUpdate(int imageFormat) {
-
- }
- };
- return captureProcessor;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ return new BokehImageCaptureExtenderCaptureProcessorImpl();
+ } else {
+ return new NoOpCaptureProcessorImpl();
+ }
}
@Override
@@ -202,4 +155,54 @@
public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
return new Range<>(300L, 1000L);
}
+
+ @RequiresApi(23)
+ static final class BokehImageCaptureExtenderCaptureProcessorImpl implements
+ CaptureProcessorImpl {
+ private ImageWriter mImageWriter;
+
+ @Override
+ public void onOutputSurface(Surface surface, int imageFormat) {
+ mImageWriter = ImageWriter.newInstance(surface, 1);
+ }
+
+ @Override
+ public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
+ Log.d(TAG, "Started bokeh CaptureProcessor");
+
+ Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
+
+ if (result == null) {
+ Log.w(TAG,
+ "Unable to process since images does not contain all stages.");
+ return;
+ } else {
+ Image image = mImageWriter.dequeueInputImage();
+
+ // Do processing here
+ ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
+ ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
+ ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
+
+ // Sample here just simply copy/paste the capture image result
+ yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
+ uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
+ vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
+
+ mImageWriter.queueInputImage(image);
+ }
+
+ Log.d(TAG, "Completed bokeh CaptureProcessor");
+ }
+
+ @Override
+ public void onResolutionUpdate(Size size) {
+
+ }
+
+ @Override
+ public void onImageFormatUpdate(int imageFormat) {
+
+ }
+ }
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java
index ca6a8da..7d72e9b 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/BokehPreviewExtenderImpl.java
@@ -26,6 +26,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -37,6 +38,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class BokehPreviewExtenderImpl implements PreviewExtenderImpl {
private static final int DEFAULT_STAGE_ID = 0;
private static final int SESSION_STAGE_ID = 101;
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java
index f4d6ddd..277cc61 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CameraCharacteristicAvailability.java
@@ -20,12 +20,14 @@
import android.util.Log;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import java.util.Arrays;
/**
* A utility class to check the availabilities of camera characteristics.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class CameraCharacteristicAvailability {
private static final String TAG = "CharacteristicAbility";
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java
index 564e941..68731c4 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureProcessorImpl.java
@@ -23,6 +23,8 @@
import android.util.Size;
import android.view.Surface;
+import androidx.annotation.RequiresApi;
+
import java.util.Map;
/**
@@ -30,6 +32,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CaptureProcessorImpl {
/**
* This gets called to update where the CaptureProcessor should write the output of {@link
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureStageImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureStageImpl.java
index c4796c2..27adb97a 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureStageImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/CaptureStageImpl.java
@@ -19,6 +19,8 @@
import android.hardware.camera2.CaptureRequest;
import android.util.Pair;
+import androidx.annotation.RequiresApi;
+
import java.util.List;
/**
@@ -26,6 +28,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface CaptureStageImpl {
/** Returns the identifier for the {@link CaptureStageImpl}. */
int getId();
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java
index 010ce68..935673b 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtenderStateListener.java
@@ -22,11 +22,14 @@
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.SessionConfiguration;
+import androidx.annotation.RequiresApi;
+
/**
* Provides interfaces that the OEM needs to implement to handle the state change.
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ExtenderStateListener {
/**
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java
index d3618e48..a524aea 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ExtensionVersionImpl.java
@@ -18,6 +18,8 @@
import android.util.Log;
+import androidx.annotation.RequiresApi;
+
/**
* Implementation for extension version check.
*
@@ -26,6 +28,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExtensionVersionImpl {
private static final String TAG = "ExtenderVersionImpl";
private static final String VERSION = "1.2.0";
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/GLImage2SurfaceRenderer.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/GLImage2SurfaceRenderer.java
index 99a3513..f35a47c 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/GLImage2SurfaceRenderer.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/GLImage2SurfaceRenderer.java
@@ -54,6 +54,8 @@
import android.util.Size;
import android.view.Surface;
+import androidx.annotation.RequiresApi;
+
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
@@ -68,6 +70,7 @@
* take as input a {@link Image} and write to a {@link android.graphics.SurfaceTexture}. It has only
* been tested on a Pixel 2XL.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class GLImage2SurfaceRenderer {
private static final String TAG = "GLImage2SurfaceRenderer";
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
index e41ad73..8469b34 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrImageCaptureExtenderImpl.java
@@ -32,6 +32,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -47,6 +48,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class HdrImageCaptureExtenderImpl implements ImageCaptureExtenderImpl {
private static final String TAG = "HdrImageCaptureExtender";
private static final int UNDER_STAGE_ID = 0;
@@ -128,126 +130,11 @@
@Override
public CaptureProcessorImpl getCaptureProcessor() {
- CaptureProcessorImpl captureProcessor =
- new CaptureProcessorImpl() {
- private ImageWriter mImageWriter;
-
- @Override
- public void onOutputSurface(Surface surface, int imageFormat) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mImageWriter = ImageWriter.newInstance(surface, 1);
- }
- }
-
- @Override
- public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
- Log.d(TAG, "Started HDR CaptureProcessor");
-
- // Check for availability of all requested images
- if (!results.containsKey(UNDER_STAGE_ID)) {
- Log.w(TAG,
- "Unable to process since images does not contain "
- + "underexposed image.");
- return;
- }
-
- if (!results.containsKey(NORMAL_STAGE_ID)) {
- Log.w(TAG,
- "Unable to process since images does not contain normal "
- + "exposed image.");
- return;
- }
-
- if (!results.containsKey(OVER_STAGE_ID)) {
- Log.w(TAG,
- "Unable to process since images does not contain "
- + "overexposed image.");
- return;
- }
-
- // Do processing of images, our placeholder logic just copies the first
- // Image into the output buffer.
- List<Pair<Image, TotalCaptureResult>> imageDataPairs = new ArrayList<>(
- results.values());
- if (android.os.Build.VERSION.SDK_INT
- >= android.os.Build.VERSION_CODES.M) {
- Image outputImage = mImageWriter.dequeueInputImage();
-
- // Do processing here
- // The sample here simply returns the normal image result
- Image normalImage = imageDataPairs.get(NORMAL_STAGE_ID).first;
-
- if (outputImage.getWidth() != normalImage.getWidth()
- || outputImage.getHeight() != normalImage.getHeight()) {
- throw new IllegalStateException(String.format("input image "
- + "resolution [%d, %d] not the same as the "
- + "output image[%d, %d]", normalImage.getWidth(),
- normalImage.getHeight(), outputImage.getWidth(),
- outputImage.getHeight()));
- }
-
- try {
- // copy y plane
- Image.Plane inYPlane = normalImage.getPlanes()[0];
- Image.Plane outYPlane = outputImage.getPlanes()[0];
- ByteBuffer inYBuffer = inYPlane.getBuffer();
- ByteBuffer outYBuffer = outYPlane.getBuffer();
- int inYPixelStride = inYPlane.getPixelStride();
- int inYRowStride = inYPlane.getRowStride();
- int outYPixelStride = outYPlane.getPixelStride();
- int outYRowStride = outYPlane.getRowStride();
- for (int x = 0; x < outputImage.getHeight(); x++) {
- for (int y = 0; y < outputImage.getWidth(); y++) {
- int inIndex = x * inYRowStride + y * inYPixelStride;
- int outIndex = x * outYRowStride + y * outYPixelStride;
- outYBuffer.put(outIndex, inYBuffer.get(inIndex));
- }
- }
-
- // Copy UV
- for (int i = 1; i < 3; i++) {
- Image.Plane inPlane = normalImage.getPlanes()[i];
- Image.Plane outPlane = outputImage.getPlanes()[i];
- ByteBuffer inBuffer = inPlane.getBuffer();
- ByteBuffer outBuffer = outPlane.getBuffer();
- int inPixelStride = inPlane.getPixelStride();
- int inRowStride = inPlane.getRowStride();
- int outPixelStride = outPlane.getPixelStride();
- int outRowStride = outPlane.getRowStride();
- // UV are half width compared to Y
- for (int x = 0; x < outputImage.getHeight() / 2; x++) {
- for (int y = 0; y < outputImage.getWidth() / 2; y++) {
- int inIndex = x * inRowStride + y * inPixelStride;
- int outIndex = x * outRowStride + y * outPixelStride;
- byte b = inBuffer.get(inIndex);
- outBuffer.put(outIndex, b);
- }
- }
- }
- } catch (IllegalStateException e) {
- Log.e(TAG, "Error accessing the Image: " + e);
- // Since something went wrong, don't try to queue up the image.
- // Instead let the Image writing get dropped.
- return;
- }
-
- mImageWriter.queueInputImage(outputImage);
- }
-
- Log.d(TAG, "Completed HDR CaptureProcessor");
- }
-
- @Override
- public void onResolutionUpdate(Size size) {
-
- }
-
- @Override
- public void onImageFormatUpdate(int imageFormat) {
-
- }
- };
- return captureProcessor;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ return new HdrImageCaptureExtenderCaptureProcessorImpl();
+ } else {
+ return new NoOpCaptureProcessorImpl();
+ }
}
@Override
@@ -300,4 +187,119 @@
public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
return new Range<>(300L, 1000L);
}
+
+ @RequiresApi(23)
+ static final class HdrImageCaptureExtenderCaptureProcessorImpl implements CaptureProcessorImpl {
+ private ImageWriter mImageWriter;
+
+ @Override
+ public void onOutputSurface(Surface surface, int imageFormat) {
+ mImageWriter = ImageWriter.newInstance(surface, 1);
+ }
+
+ @Override
+ public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
+ Log.d(TAG, "Started HDR CaptureProcessor");
+
+ // Check for availability of all requested images
+ if (!results.containsKey(UNDER_STAGE_ID)) {
+ Log.w(TAG,
+ "Unable to process since images does not contain "
+ + "underexposed image.");
+ return;
+ }
+
+ if (!results.containsKey(NORMAL_STAGE_ID)) {
+ Log.w(TAG,
+ "Unable to process since images does not contain normal "
+ + "exposed image.");
+ return;
+ }
+
+ if (!results.containsKey(OVER_STAGE_ID)) {
+ Log.w(TAG,
+ "Unable to process since images does not contain "
+ + "overexposed image.");
+ return;
+ }
+
+ // Do processing of images, our placeholder logic just copies the first
+ // Image into the output buffer.
+ List<Pair<Image, TotalCaptureResult>> imageDataPairs = new ArrayList<>(
+ results.values());
+ Image outputImage = mImageWriter.dequeueInputImage();
+
+ // Do processing here
+ // The sample here simply returns the normal image result
+ Image normalImage = imageDataPairs.get(NORMAL_STAGE_ID).first;
+
+ if (outputImage.getWidth() != normalImage.getWidth()
+ || outputImage.getHeight() != normalImage.getHeight()) {
+ throw new IllegalStateException(String.format("input image "
+ + "resolution [%d, %d] not the same as the "
+ + "output image[%d, %d]", normalImage.getWidth(),
+ normalImage.getHeight(), outputImage.getWidth(),
+ outputImage.getHeight()));
+ }
+
+ try {
+ // copy y plane
+ Image.Plane inYPlane = normalImage.getPlanes()[0];
+ Image.Plane outYPlane = outputImage.getPlanes()[0];
+ ByteBuffer inYBuffer = inYPlane.getBuffer();
+ ByteBuffer outYBuffer = outYPlane.getBuffer();
+ int inYPixelStride = inYPlane.getPixelStride();
+ int inYRowStride = inYPlane.getRowStride();
+ int outYPixelStride = outYPlane.getPixelStride();
+ int outYRowStride = outYPlane.getRowStride();
+ for (int x = 0; x < outputImage.getHeight(); x++) {
+ for (int y = 0; y < outputImage.getWidth(); y++) {
+ int inIndex = x * inYRowStride + y * inYPixelStride;
+ int outIndex = x * outYRowStride + y * outYPixelStride;
+ outYBuffer.put(outIndex, inYBuffer.get(inIndex));
+ }
+ }
+
+ // Copy UV
+ for (int i = 1; i < 3; i++) {
+ Image.Plane inPlane = normalImage.getPlanes()[i];
+ Image.Plane outPlane = outputImage.getPlanes()[i];
+ ByteBuffer inBuffer = inPlane.getBuffer();
+ ByteBuffer outBuffer = outPlane.getBuffer();
+ int inPixelStride = inPlane.getPixelStride();
+ int inRowStride = inPlane.getRowStride();
+ int outPixelStride = outPlane.getPixelStride();
+ int outRowStride = outPlane.getRowStride();
+ // UV are half width compared to Y
+ for (int x = 0; x < outputImage.getHeight() / 2; x++) {
+ for (int y = 0; y < outputImage.getWidth() / 2; y++) {
+ int inIndex = x * inRowStride + y * inPixelStride;
+ int outIndex = x * outRowStride + y * outPixelStride;
+ byte b = inBuffer.get(inIndex);
+ outBuffer.put(outIndex, b);
+ }
+ }
+ }
+ } catch (IllegalStateException e) {
+ Log.e(TAG, "Error accessing the Image: " + e);
+ // Since something went wrong, don't try to queue up the image.
+ // Instead let the Image writing get dropped.
+ return;
+ }
+
+ mImageWriter.queueInputImage(outputImage);
+
+ Log.d(TAG, "Completed HDR CaptureProcessor");
+ }
+
+ @Override
+ public void onResolutionUpdate(Size size) {
+
+ }
+
+ @Override
+ public void onImageFormatUpdate(int imageFormat) {
+
+ }
+ }
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java
index 2e44ba9..264dfd5 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/HdrPreviewExtenderImpl.java
@@ -26,6 +26,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -37,6 +38,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class HdrPreviewExtenderImpl implements PreviewExtenderImpl {
private static final int DEFAULT_STAGE_ID = 0;
@@ -79,7 +81,38 @@
return null;
}
- private PreviewImageProcessorImpl mProcessor = new PreviewImageProcessorImpl() {
+ private final PreviewImageProcessorImpl mProcessor =
+ new HdrPreviewExtenderPreviewImageProcessorImpl();
+
+ @Override
+ public void onInit(String cameraId, CameraCharacteristics cameraCharacteristics,
+ Context context) {
+ mRenderer = new GLImage2SurfaceRenderer();
+ }
+
+ @Override
+ public void onDeInit() {
+ mRenderer.close();
+ mRenderer = null;
+ }
+
+ @Override
+ public CaptureStageImpl onPresetSession() {
+ return null;
+ }
+
+ @Override
+ public CaptureStageImpl onEnableSession() {
+ return null;
+ }
+
+ @Override
+ public CaptureStageImpl onDisableSession() {
+ return null;
+ }
+
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+ final class HdrPreviewExtenderPreviewImageProcessorImpl implements PreviewImageProcessorImpl {
Surface mSurface;
Size mSize;
@@ -112,32 +145,5 @@
public void onImageFormatUpdate(int imageFormat) {
}
- };
-
- @Override
- public void onInit(String cameraId, CameraCharacteristics cameraCharacteristics,
- Context context) {
- mRenderer = new GLImage2SurfaceRenderer();
- }
-
- @Override
- public void onDeInit() {
- mRenderer.close();
- mRenderer = null;
- }
-
- @Override
- public CaptureStageImpl onPresetSession() {
- return null;
- }
-
- @Override
- public CaptureStageImpl onEnableSession() {
- return null;
- }
-
- @Override
- public CaptureStageImpl onDisableSession() {
- return null;
}
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
index 884c0dd..f47a1a0 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ImageCaptureExtenderImpl.java
@@ -23,6 +23,7 @@
import android.util.Size;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -31,6 +32,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ImageCaptureExtenderImpl extends ExtenderStateListener {
/**
* Indicates whether the extension is supported on the device.
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/InitializerImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/InitializerImpl.java
index fc245c8..66892da 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/InitializerImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/InitializerImpl.java
@@ -20,6 +20,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
@@ -31,6 +32,7 @@
*
* @since 1.1
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class InitializerImpl {
private InitializerImpl() {
}
@@ -116,6 +118,7 @@
/**
* Callback that gets called when the library has finished initializing and is ready for used.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface OnExtensionsInitializedCallback {
/** Called if the library successfully initializes. */
void onSuccess();
@@ -135,6 +138,7 @@
* {@link #init(String, Context, OnExtensionsInitializedCallback, Executor)} can be called
* again regardless of whether or not the deinitialization has succeeded or failed.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface OnExtensionsDeinitializedCallback {
/** Called if the library successfully deinitializes. */
void onSuccess();
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
index 405da8d..6d84fa0 100755
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightImageCaptureExtenderImpl.java
@@ -30,6 +30,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.nio.ByteBuffer;
import java.util.ArrayList;
@@ -44,6 +45,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class NightImageCaptureExtenderImpl implements ImageCaptureExtenderImpl {
private static final String TAG = "NightICExtender";
private static final int DEFAULT_STAGE_ID = 0;
@@ -84,59 +86,11 @@
@Override
public CaptureProcessorImpl getCaptureProcessor() {
- CaptureProcessorImpl captureProcessor =
- new CaptureProcessorImpl() {
- private ImageWriter mImageWriter;
-
- @Override
- public void onOutputSurface(Surface surface, int imageFormat) {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- mImageWriter = ImageWriter.newInstance(surface, 1);
- }
- }
-
- @Override
- public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
- Log.d(TAG, "Started night CaptureProcessor");
-
- Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
-
- if (result == null) {
- Log.w(TAG,
- "Unable to process since images does not contain all stages.");
- return;
- } else {
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- Image image = mImageWriter.dequeueInputImage();
-
- // Do processing here
- ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
- ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
- ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
-
- // Sample here just simply copy/paste the capture image result
- yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
- uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
- vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
-
- mImageWriter.queueInputImage(image);
- }
- }
-
- Log.d(TAG, "Completed night CaptureProcessor");
- }
-
- @Override
- public void onResolutionUpdate(Size size) {
-
- }
-
- @Override
- public void onImageFormatUpdate(int imageFormat) {
-
- }
- };
- return captureProcessor;
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+ return new NightImageCaptureExtenderCaptureProcessorImpl();
+ } else {
+ return new NoOpCaptureProcessorImpl();
+ }
}
@Override
@@ -201,4 +155,54 @@
public Range<Long> getEstimatedCaptureLatencyRange(@Nullable Size captureOutputSize) {
return new Range<>(300L, 1000L);
}
+
+ @RequiresApi(23)
+ static final class NightImageCaptureExtenderCaptureProcessorImpl implements
+ CaptureProcessorImpl {
+ private ImageWriter mImageWriter;
+
+ @Override
+ public void onOutputSurface(Surface surface, int imageFormat) {
+ mImageWriter = ImageWriter.newInstance(surface, 1);
+ }
+
+ @Override
+ public void process(Map<Integer, Pair<Image, TotalCaptureResult>> results) {
+ Log.d(TAG, "Started night CaptureProcessor");
+
+ Pair<Image, TotalCaptureResult> result = results.get(DEFAULT_STAGE_ID);
+
+ if (result == null) {
+ Log.w(TAG,
+ "Unable to process since images does not contain all stages.");
+ return;
+ } else {
+ Image image = mImageWriter.dequeueInputImage();
+
+ // Do processing here
+ ByteBuffer yByteBuffer = image.getPlanes()[0].getBuffer();
+ ByteBuffer uByteBuffer = image.getPlanes()[2].getBuffer();
+ ByteBuffer vByteBuffer = image.getPlanes()[1].getBuffer();
+
+ // Sample here just simply copy/paste the capture image result
+ yByteBuffer.put(result.first.getPlanes()[0].getBuffer());
+ uByteBuffer.put(result.first.getPlanes()[2].getBuffer());
+ vByteBuffer.put(result.first.getPlanes()[1].getBuffer());
+
+ mImageWriter.queueInputImage(image);
+ }
+
+ Log.d(TAG, "Completed night CaptureProcessor");
+ }
+
+ @Override
+ public void onResolutionUpdate(Size size) {
+
+ }
+
+ @Override
+ public void onImageFormatUpdate(int imageFormat) {
+
+ }
+ }
}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java
index 8bb6074..2df3724 100755
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NightPreviewExtenderImpl.java
@@ -24,6 +24,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -35,6 +36,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class NightPreviewExtenderImpl implements PreviewExtenderImpl {
private static final int DEFAULT_STAGE_ID = 0;
private static final int SESSION_STAGE_ID = 101;
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NoOpCaptureProcessorImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NoOpCaptureProcessorImpl.java
new file mode 100644
index 0000000..9645c43
--- /dev/null
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/NoOpCaptureProcessorImpl.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.extensions.impl;
+
+import android.hardware.camera2.TotalCaptureResult;
+import android.media.Image;
+import android.util.Pair;
+import android.util.Size;
+import android.view.Surface;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+
+import java.util.Map;
+
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+final class NoOpCaptureProcessorImpl implements CaptureProcessorImpl {
+ @Override
+ public void onOutputSurface(@NonNull Surface surface, int imageFormat) {
+
+ }
+
+ @Override
+ public void process(@NonNull Map<Integer, Pair<Image, TotalCaptureResult>> results) {
+
+ }
+
+ @Override
+ public void onResolutionUpdate(@NonNull Size size) {
+
+ }
+
+ @Override
+ public void onImageFormatUpdate(int imageFormat) {
+
+ }
+}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewExtenderImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewExtenderImpl.java
index 4324987..4613f24 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewExtenderImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewExtenderImpl.java
@@ -23,6 +23,7 @@
import android.util.Size;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.util.List;
@@ -31,6 +32,7 @@
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface PreviewExtenderImpl extends ExtenderStateListener {
/** The different types of the preview processing. */
enum ProcessorType {
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java
index 7caad1a..60d3f77 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/PreviewImageProcessorImpl.java
@@ -20,12 +20,15 @@
import android.hardware.camera2.TotalCaptureResult;
import android.media.Image;
+import androidx.annotation.RequiresApi;
+
/**
* Processing a single {@link Image} and {@link TotalCaptureResult} to produce an output to a
* stream.
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface PreviewImageProcessorImpl extends ProcessorImpl {
/**
* Processes the requested image capture.
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ProcessorImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ProcessorImpl.java
index 6be328b..663a16a 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ProcessorImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/ProcessorImpl.java
@@ -19,11 +19,14 @@
import android.util.Size;
import android.view.Surface;
+import androidx.annotation.RequiresApi;
+
/**
* Processes an input image stream and produces an output image stream.
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface ProcessorImpl {
/**
* Updates where the ProcessorImpl should write the output to.
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpl.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpl.java
index 14637d7..d42aa2a 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpl.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpl.java
@@ -18,11 +18,14 @@
import android.hardware.camera2.TotalCaptureResult;
+import androidx.annotation.RequiresApi;
+
/**
* Processes a {@link TotalCaptureResult} to update a CaptureStage.
*
* @since 1.0
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface RequestUpdateProcessorImpl extends ProcessorImpl {
/**
* Process the {@link TotalCaptureResult} to update the {@link CaptureStageImpl}
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpls.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpls.java
index afbad00..45ac4ab 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpls.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/RequestUpdateProcessorImpls.java
@@ -20,6 +20,9 @@
import android.util.Size;
import android.view.Surface;
+import androidx.annotation.RequiresApi;
+
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class RequestUpdateProcessorImpls {
private static final RequestUpdateProcessorImpl sNoUpdateProcessor =
new RequestUpdateProcessorImpl() {
diff --git a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/SettableCaptureStage.java b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/SettableCaptureStage.java
index 66d75b9..8aecf5d 100644
--- a/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/SettableCaptureStage.java
+++ b/camera/camera-testlib-extensions/src/main/java/androidx/camera/extensions/impl/SettableCaptureStage.java
@@ -19,11 +19,14 @@
import android.hardware.camera2.CaptureRequest;
import android.util.Pair;
+import androidx.annotation.RequiresApi;
+
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SettableCaptureStage implements CaptureStageImpl {
private final int mId;
diff --git a/camera/camera-video/api/current.txt b/camera/camera-video/api/current.txt
new file mode 100644
index 0000000..37d78e5
--- /dev/null
+++ b/camera/camera-video/api/current.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+ @RequiresApi(21) public final class ActiveRecording implements java.lang.AutoCloseable {
+ method public void close();
+ method public void pause();
+ method public void resume();
+ method public void stop();
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+ method public abstract int getAudioState();
+ method public abstract Throwable? getErrorCause();
+ method public boolean hasAudio();
+ method public boolean hasError();
+ field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+ field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+ field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+ field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+ }
+
+ @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+ method public long getFileSizeLimit();
+ method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+ }
+
+ @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+ ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+ method public androidx.camera.video.FileDescriptorOutputOptions build();
+ method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+ method public java.io.File getFile();
+ method public long getFileSizeLimit();
+ }
+
+ @RequiresApi(21) public static final class FileOutputOptions.Builder {
+ ctor public FileOutputOptions.Builder(java.io.File);
+ method public androidx.camera.video.FileOutputOptions build();
+ method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+ method public android.net.Uri getCollection();
+ method public android.content.ContentResolver getContentResolver();
+ method public android.content.ContentValues getContentValues();
+ method public long getFileSizeLimit();
+ field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+ }
+
+ @RequiresApi(21) public static final class MediaStoreOutputOptions.Builder {
+ ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+ method public androidx.camera.video.MediaStoreOutputOptions build();
+ method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+ method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public abstract class OutputOptions {
+ method public abstract long getFileSizeLimit();
+ field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+ ctor public OutputResults();
+ method public abstract android.net.Uri getOutputUri();
+ }
+
+ @RequiresApi(21) public final class PendingRecording {
+ method @CheckResult public androidx.camera.video.ActiveRecording start();
+ method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+ method public androidx.camera.video.PendingRecording withEventListener(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+ }
+
+ @RequiresApi(21) public class QualitySelector {
+ method public static androidx.camera.video.QualitySelector.Procedure firstTry(int);
+ method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, int);
+ method public static java.util.List<java.lang.Integer!> getSupportedQualities(androidx.camera.core.CameraInfo);
+ method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, int);
+ method public static androidx.camera.video.QualitySelector of(int);
+ method public static androidx.camera.video.QualitySelector of(int, int);
+ field public static final int FALLBACK_STRATEGY_HIGHER = 1; // 0x1
+ field public static final int FALLBACK_STRATEGY_LOWER = 3; // 0x3
+ field public static final int FALLBACK_STRATEGY_STRICTLY_HIGHER = 2; // 0x2
+ field public static final int FALLBACK_STRATEGY_STRICTLY_LOWER = 4; // 0x4
+ field public static final int QUALITY_FHD = 6; // 0x6
+ field public static final int QUALITY_HD = 5; // 0x5
+ field public static final int QUALITY_HIGHEST = 1; // 0x1
+ field public static final int QUALITY_LOWEST = 0; // 0x0
+ field public static final int QUALITY_SD = 4; // 0x4
+ field public static final int QUALITY_UHD = 8; // 0x8
+ }
+
+ @RequiresApi(21) public static class QualitySelector.Procedure {
+ method public androidx.camera.video.QualitySelector finallyTry(int);
+ method public androidx.camera.video.QualitySelector finallyTry(int, int);
+ method public androidx.camera.video.QualitySelector.Procedure thenTry(int);
+ }
+
+ @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+ method public java.util.concurrent.Executor? getExecutor();
+ method public androidx.camera.video.QualitySelector getQualitySelector();
+ method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+ method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+ method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+ method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+ field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+ }
+
+ @RequiresApi(21) public static final class Recorder.Builder {
+ ctor public Recorder.Builder();
+ method public androidx.camera.video.Recorder build();
+ method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+ method public abstract androidx.camera.video.AudioStats getAudioStats();
+ method public abstract long getNumBytesRecorded();
+ method public abstract long getRecordedDurationNanos();
+ }
+
+ @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+ method public T getOutput();
+ method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+ }
+
+ @RequiresApi(21) public interface VideoOutput {
+ method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+ }
+
+ @RequiresApi(21) public abstract class VideoRecordEvent {
+ method public androidx.camera.video.OutputOptions getOutputOptions();
+ method public androidx.camera.video.RecordingStats getRecordingStats();
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+ method public Throwable? getCause();
+ method public int getError();
+ method public androidx.camera.video.OutputResults getOutputResults();
+ method public boolean hasError();
+ field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+ field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+ field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+ field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+ field public static final int ERROR_NONE = 0; // 0x0
+ field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+ field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+ field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+ field public static final int ERROR_UNKNOWN = 1; // 0x1
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+ }
+
+}
+
diff --git a/camera/camera-video/api/public_plus_experimental_current.txt b/camera/camera-video/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..37d78e5
--- /dev/null
+++ b/camera/camera-video/api/public_plus_experimental_current.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+ @RequiresApi(21) public final class ActiveRecording implements java.lang.AutoCloseable {
+ method public void close();
+ method public void pause();
+ method public void resume();
+ method public void stop();
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+ method public abstract int getAudioState();
+ method public abstract Throwable? getErrorCause();
+ method public boolean hasAudio();
+ method public boolean hasError();
+ field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+ field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+ field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+ field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+ }
+
+ @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+ method public long getFileSizeLimit();
+ method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+ }
+
+ @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+ ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+ method public androidx.camera.video.FileDescriptorOutputOptions build();
+ method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+ method public java.io.File getFile();
+ method public long getFileSizeLimit();
+ }
+
+ @RequiresApi(21) public static final class FileOutputOptions.Builder {
+ ctor public FileOutputOptions.Builder(java.io.File);
+ method public androidx.camera.video.FileOutputOptions build();
+ method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+ method public android.net.Uri getCollection();
+ method public android.content.ContentResolver getContentResolver();
+ method public android.content.ContentValues getContentValues();
+ method public long getFileSizeLimit();
+ field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+ }
+
+ @RequiresApi(21) public static final class MediaStoreOutputOptions.Builder {
+ ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+ method public androidx.camera.video.MediaStoreOutputOptions build();
+ method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+ method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public abstract class OutputOptions {
+ method public abstract long getFileSizeLimit();
+ field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+ ctor public OutputResults();
+ method public abstract android.net.Uri getOutputUri();
+ }
+
+ @RequiresApi(21) public final class PendingRecording {
+ method @CheckResult public androidx.camera.video.ActiveRecording start();
+ method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+ method public androidx.camera.video.PendingRecording withEventListener(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+ }
+
+ @RequiresApi(21) public class QualitySelector {
+ method public static androidx.camera.video.QualitySelector.Procedure firstTry(int);
+ method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, int);
+ method public static java.util.List<java.lang.Integer!> getSupportedQualities(androidx.camera.core.CameraInfo);
+ method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, int);
+ method public static androidx.camera.video.QualitySelector of(int);
+ method public static androidx.camera.video.QualitySelector of(int, int);
+ field public static final int FALLBACK_STRATEGY_HIGHER = 1; // 0x1
+ field public static final int FALLBACK_STRATEGY_LOWER = 3; // 0x3
+ field public static final int FALLBACK_STRATEGY_STRICTLY_HIGHER = 2; // 0x2
+ field public static final int FALLBACK_STRATEGY_STRICTLY_LOWER = 4; // 0x4
+ field public static final int QUALITY_FHD = 6; // 0x6
+ field public static final int QUALITY_HD = 5; // 0x5
+ field public static final int QUALITY_HIGHEST = 1; // 0x1
+ field public static final int QUALITY_LOWEST = 0; // 0x0
+ field public static final int QUALITY_SD = 4; // 0x4
+ field public static final int QUALITY_UHD = 8; // 0x8
+ }
+
+ @RequiresApi(21) public static class QualitySelector.Procedure {
+ method public androidx.camera.video.QualitySelector finallyTry(int);
+ method public androidx.camera.video.QualitySelector finallyTry(int, int);
+ method public androidx.camera.video.QualitySelector.Procedure thenTry(int);
+ }
+
+ @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+ method public java.util.concurrent.Executor? getExecutor();
+ method public androidx.camera.video.QualitySelector getQualitySelector();
+ method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+ method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+ method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+ method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+ field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+ }
+
+ @RequiresApi(21) public static final class Recorder.Builder {
+ ctor public Recorder.Builder();
+ method public androidx.camera.video.Recorder build();
+ method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+ method public abstract androidx.camera.video.AudioStats getAudioStats();
+ method public abstract long getNumBytesRecorded();
+ method public abstract long getRecordedDurationNanos();
+ }
+
+ @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+ method public T getOutput();
+ method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+ }
+
+ @RequiresApi(21) public interface VideoOutput {
+ method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+ }
+
+ @RequiresApi(21) public abstract class VideoRecordEvent {
+ method public androidx.camera.video.OutputOptions getOutputOptions();
+ method public androidx.camera.video.RecordingStats getRecordingStats();
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+ method public Throwable? getCause();
+ method public int getError();
+ method public androidx.camera.video.OutputResults getOutputResults();
+ method public boolean hasError();
+ field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+ field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+ field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+ field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+ field public static final int ERROR_NONE = 0; // 0x0
+ field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+ field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+ field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+ field public static final int ERROR_UNKNOWN = 1; // 0x1
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/camera/camera-video/api/res-current.txt
similarity index 100%
rename from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
rename to camera/camera-video/api/res-current.txt
diff --git a/camera/camera-video/api/restricted_current.txt b/camera/camera-video/api/restricted_current.txt
new file mode 100644
index 0000000..c890208
--- /dev/null
+++ b/camera/camera-video/api/restricted_current.txt
@@ -0,0 +1,169 @@
+// Signature format: 4.0
+package androidx.camera.video {
+
+ @RequiresApi(21) public final class ActiveRecording implements java.lang.AutoCloseable {
+ method public void close();
+ method public void pause();
+ method public void resume();
+ method public void stop();
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class AudioStats {
+ method public abstract int getAudioState();
+ method public abstract Throwable? getErrorCause();
+ method public boolean hasAudio();
+ method public boolean hasError();
+ field public static final int AUDIO_STATE_ACTIVE = 0; // 0x0
+ field public static final int AUDIO_STATE_DISABLED = 1; // 0x1
+ field public static final int AUDIO_STATE_ENCODER_ERROR = 3; // 0x3
+ field public static final int AUDIO_STATE_SOURCE_SILENCED = 2; // 0x2
+ }
+
+ @RequiresApi(21) public final class FileDescriptorOutputOptions extends androidx.camera.video.OutputOptions {
+ method public long getFileSizeLimit();
+ method public android.os.ParcelFileDescriptor getParcelFileDescriptor();
+ }
+
+ @RequiresApi(21) public static final class FileDescriptorOutputOptions.Builder {
+ ctor public FileDescriptorOutputOptions.Builder(android.os.ParcelFileDescriptor);
+ method public androidx.camera.video.FileDescriptorOutputOptions build();
+ method public androidx.camera.video.FileDescriptorOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public final class FileOutputOptions extends androidx.camera.video.OutputOptions {
+ method public java.io.File getFile();
+ method public long getFileSizeLimit();
+ }
+
+ @RequiresApi(21) public static final class FileOutputOptions.Builder {
+ ctor public FileOutputOptions.Builder(java.io.File);
+ method public androidx.camera.video.FileOutputOptions build();
+ method public androidx.camera.video.FileOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public final class MediaStoreOutputOptions extends androidx.camera.video.OutputOptions {
+ method public android.net.Uri getCollection();
+ method public android.content.ContentResolver getContentResolver();
+ method public android.content.ContentValues getContentValues();
+ method public long getFileSizeLimit();
+ field public static final android.content.ContentValues EMPTY_CONTENT_VALUES;
+ }
+
+ @RequiresApi(21) public static final class MediaStoreOutputOptions.Builder {
+ ctor public MediaStoreOutputOptions.Builder(android.content.ContentResolver, android.net.Uri);
+ method public androidx.camera.video.MediaStoreOutputOptions build();
+ method public androidx.camera.video.MediaStoreOutputOptions.Builder setContentValues(android.content.ContentValues);
+ method public androidx.camera.video.MediaStoreOutputOptions.Builder setFileSizeLimit(long);
+ }
+
+ @RequiresApi(21) public abstract class OutputOptions {
+ method public abstract long getFileSizeLimit();
+ field public static final int FILE_SIZE_UNLIMITED = 0; // 0x0
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class OutputResults {
+ ctor public OutputResults();
+ method public abstract android.net.Uri getOutputUri();
+ }
+
+ @RequiresApi(21) public final class PendingRecording {
+ method @CheckResult public androidx.camera.video.ActiveRecording start();
+ method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public androidx.camera.video.PendingRecording withAudioEnabled();
+ method public androidx.camera.video.PendingRecording withEventListener(java.util.concurrent.Executor, androidx.core.util.Consumer<androidx.camera.video.VideoRecordEvent!>);
+ }
+
+ @RequiresApi(21) public class QualitySelector {
+ method public static androidx.camera.video.QualitySelector.Procedure firstTry(int);
+ method public static android.util.Size? getResolution(androidx.camera.core.CameraInfo, int);
+ method public static java.util.List<java.lang.Integer!> getSupportedQualities(androidx.camera.core.CameraInfo);
+ method public static boolean isQualitySupported(androidx.camera.core.CameraInfo, int);
+ method public static androidx.camera.video.QualitySelector of(int);
+ method public static androidx.camera.video.QualitySelector of(int, int);
+ field public static final int FALLBACK_STRATEGY_HIGHER = 1; // 0x1
+ field public static final int FALLBACK_STRATEGY_LOWER = 3; // 0x3
+ field public static final int FALLBACK_STRATEGY_STRICTLY_HIGHER = 2; // 0x2
+ field public static final int FALLBACK_STRATEGY_STRICTLY_LOWER = 4; // 0x4
+ field public static final int QUALITY_FHD = 6; // 0x6
+ field public static final int QUALITY_HD = 5; // 0x5
+ field public static final int QUALITY_HIGHEST = 1; // 0x1
+ field public static final int QUALITY_LOWEST = 0; // 0x0
+ field public static final int QUALITY_SD = 4; // 0x4
+ field public static final int QUALITY_UHD = 8; // 0x8
+ }
+
+ @RequiresApi(21) public static class QualitySelector.Procedure {
+ method public androidx.camera.video.QualitySelector finallyTry(int);
+ method public androidx.camera.video.QualitySelector finallyTry(int, int);
+ method public androidx.camera.video.QualitySelector.Procedure thenTry(int);
+ }
+
+ @RequiresApi(21) public final class Recorder implements androidx.camera.video.VideoOutput {
+ method public java.util.concurrent.Executor? getExecutor();
+ method public androidx.camera.video.QualitySelector getQualitySelector();
+ method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+ method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileOutputOptions);
+ method @RequiresApi(26) public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.FileDescriptorOutputOptions);
+ method public androidx.camera.video.PendingRecording prepareRecording(android.content.Context, androidx.camera.video.MediaStoreOutputOptions);
+ field public static final androidx.camera.video.QualitySelector DEFAULT_QUALITY_SELECTOR;
+ }
+
+ @RequiresApi(21) public static final class Recorder.Builder {
+ ctor public Recorder.Builder();
+ method public androidx.camera.video.Recorder build();
+ method public androidx.camera.video.Recorder.Builder setExecutor(java.util.concurrent.Executor);
+ method public androidx.camera.video.Recorder.Builder setQualitySelector(androidx.camera.video.QualitySelector);
+ }
+
+ @RequiresApi(21) @com.google.auto.value.AutoValue public abstract class RecordingStats {
+ method public abstract androidx.camera.video.AudioStats getAudioStats();
+ method public abstract long getNumBytesRecorded();
+ method public abstract long getRecordedDurationNanos();
+ }
+
+ @RequiresApi(21) public final class VideoCapture<T extends androidx.camera.video.VideoOutput> extends androidx.camera.core.UseCase {
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.impl.UseCaseConfig<?>? getDefaultConfig(boolean, androidx.camera.core.impl.UseCaseConfigFactory);
+ method public T getOutput();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public androidx.camera.core.impl.UseCaseConfig.Builder<?,?,?> getUseCaseConfigBuilder(androidx.camera.core.impl.Config);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) protected android.util.Size onSuggestedResolutionUpdated(android.util.Size);
+ method public static <T extends androidx.camera.video.VideoOutput> androidx.camera.video.VideoCapture<T!> withOutput(T);
+ }
+
+ @RequiresApi(21) public interface VideoOutput {
+ method public void onSurfaceRequested(androidx.camera.core.SurfaceRequest);
+ }
+
+ @RequiresApi(21) public abstract class VideoRecordEvent {
+ method public androidx.camera.video.OutputOptions getOutputOptions();
+ method public androidx.camera.video.RecordingStats getRecordingStats();
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Finalize extends androidx.camera.video.VideoRecordEvent {
+ method public Throwable? getCause();
+ method public int getError();
+ method public androidx.camera.video.OutputResults getOutputResults();
+ method public boolean hasError();
+ field public static final int ERROR_ENCODING_FAILED = 6; // 0x6
+ field public static final int ERROR_FILE_SIZE_LIMIT_REACHED = 2; // 0x2
+ field public static final int ERROR_INSUFFICIENT_STORAGE = 3; // 0x3
+ field public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5; // 0x5
+ field public static final int ERROR_NONE = 0; // 0x0
+ field public static final int ERROR_NO_VALID_DATA = 8; // 0x8
+ field public static final int ERROR_RECORDER_ERROR = 7; // 0x7
+ field public static final int ERROR_SOURCE_INACTIVE = 4; // 0x4
+ field public static final int ERROR_UNKNOWN = 1; // 0x1
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Pause extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Resume extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Start extends androidx.camera.video.VideoRecordEvent {
+ }
+
+ @RequiresApi(21) public static final class VideoRecordEvent.Status extends androidx.camera.video.VideoRecordEvent {
+ }
+
+}
+
diff --git a/camera/camera-video/build.gradle b/camera/camera-video/build.gradle
index 9f7c8cc..51f13dfd 100644
--- a/camera/camera-video/build.gradle
+++ b/camera/camera-video/build.gradle
@@ -18,6 +18,7 @@
import androidx.build.LibraryGroups
import androidx.build.LibraryVersions
import androidx.build.Publish
+import androidx.build.RunApiTasks
plugins {
id("AndroidXPlugin")
@@ -48,6 +49,7 @@
exclude group: "androidx.camera", module: "camera-core"
})
+ androidTestImplementation(libs.multidex)
androidTestImplementation(project(path: ":camera:camera-camera2"))
androidTestImplementation(libs.testExtJunit)
androidTestImplementation(libs.testCore)
@@ -69,7 +71,7 @@
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
}
// Use Robolectric 4.+
@@ -80,8 +82,8 @@
androidx {
name = "Jetpack Camera Video Library"
- publish = Publish.NONE
- mavenVersion = LibraryVersions.CAMERA_VIDEO
+ publish = Publish.SNAPSHOT_AND_RELEASE
+ runApiTasks = new RunApiTasks.Yes("Need to track API surface before moving to publish")
mavenGroup = LibraryGroups.CAMERA
inceptionYear = "2020"
description = "Video components for the Jetpack Camera Library, a library providing a " +
diff --git a/camera/camera-video/lint.xml b/camera/camera-video/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-video/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioSpecTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioSpecTest.kt
index 75cb8a8..9ba2f4a 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioSpecTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/AudioSpecTest.kt
@@ -17,6 +17,7 @@
package androidx.camera.video
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -24,6 +25,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class AudioSpecTest {
@Test
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/MediaSpecTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/MediaSpecTest.kt
index 50f3fd5..b4a979f 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/MediaSpecTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/MediaSpecTest.kt
@@ -18,6 +18,7 @@
import android.util.Range
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -25,6 +26,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class MediaSpecTest {
@Test
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
index bf7508e..c59f157 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
@@ -23,6 +23,7 @@
import android.provider.MediaStore
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -31,6 +32,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class OutputOptionsTest {
companion object {
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
index 5e152b4..0499a61 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/RecorderTest.kt
@@ -83,6 +83,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class RecorderTest {
@get:Rule
@@ -299,7 +300,7 @@
}
@Test
- @SdkSuppress(maxSdkVersion = 25)
+ @SdkSuppress(minSdkVersion = 21, maxSdkVersion = 25)
@SuppressLint("NewApi") // Intentionally testing behavior of calling from invalid API level
fun prepareRecordingWithFileDescriptor_throwsExceptionBeforeApi26() {
val file = File.createTempFile("CameraX", ".tmp").apply { deleteOnExit() }
@@ -307,7 +308,7 @@
file,
ParcelFileDescriptor.MODE_READ_WRITE
).use { pfd ->
- assertThrows(IllegalStateException::class.java) {
+ assertThrows(UnsupportedOperationException::class.java) {
recorder.prepareRecording(context, FileDescriptorOutputOptions.Builder(pfd).build())
}
}
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
index 792cb06..44095f6 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoCaptureDeviceTest.kt
@@ -36,6 +36,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
@@ -56,6 +57,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class VideoCaptureDeviceTest {
@get:Rule
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt
index 2cbdad6..24f0ca8 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoOutputTest.kt
@@ -18,6 +18,7 @@
import androidx.camera.testing.asFlow
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.flow.first
@@ -27,6 +28,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class VideoOutputTest {
@Test
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
index 395dc37..6defc0e 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoRecordingTest.kt
@@ -44,6 +44,7 @@
import androidx.core.util.Consumer
import androidx.test.core.app.ApplicationProvider
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
@@ -67,6 +68,7 @@
@LargeTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
class VideoRecordingTest(
private var cameraSelector: CameraSelector
) {
@@ -275,7 +277,7 @@
latchForVideoRecording = CountDownLatch(5)
instrumentation.runOnMainSync {
- cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, videoCapture)
+ cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, videoCapture)
}
// Act.
@@ -300,7 +302,7 @@
@Suppress("UNCHECKED_CAST")
val mockListener = mock(Consumer::class.java) as Consumer<VideoRecordEvent>
instrumentation.runOnMainSync {
- cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, videoCapture)
+ cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview, videoCapture)
}
lifecycleOwner.pauseAndStop()
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoSpecTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoSpecTest.kt
index e093cf5..bb7583b 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoSpecTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/VideoSpecTest.kt
@@ -17,6 +17,7 @@
package androidx.camera.video
import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Test
@@ -24,6 +25,7 @@
@SmallTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class VideoSpecTest {
@Test
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt
index 52acb2f..cdb46b4 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt
@@ -24,6 +24,7 @@
import androidx.camera.video.internal.encoder.noInvocation
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.rule.GrantPermissionRule
import org.junit.After
import org.junit.Assume.assumeTrue
@@ -38,6 +39,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class AudioSourceTest {
companion object {
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/FakeBufferProvider.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/FakeBufferProvider.kt
index f2d0dd6..91c431c8 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/FakeBufferProvider.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/FakeBufferProvider.kt
@@ -16,14 +16,15 @@
package androidx.camera.video.internal
import androidx.annotation.GuardedBy
+import androidx.annotation.RequiresApi
import androidx.camera.core.impl.Observable
import androidx.camera.core.impl.utils.futures.Futures
import androidx.camera.video.internal.encoder.InputBuffer
import com.google.common.util.concurrent.ListenableFuture
-import java.lang.IllegalStateException
import java.util.concurrent.Callable
import java.util.concurrent.Executor
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class FakeBufferProvider(private val bufferFactory: Callable<InputBuffer>) :
BufferProvider<InputBuffer> {
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt
index 2137136..45ae669 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt
@@ -20,6 +20,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import androidx.testutils.assertThrows
import com.google.common.truth.Truth.assertThat
@@ -39,6 +40,7 @@
@RunWith(AndroidJUnit4::class)
@SmallTest
+@SdkSuppress(minSdkVersion = 21)
class SharedByteBufferTest {
@Test
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/AudioEncoderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/AudioEncoderTest.kt
index 05ec7c1..b9dfe47 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/AudioEncoderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/AudioEncoderTest.kt
@@ -22,6 +22,7 @@
import androidx.concurrent.futures.await
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
@@ -52,6 +53,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class AudioEncoderTest {
companion object {
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/FakeInputBuffer.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/FakeInputBuffer.kt
index 72fc1c4..0c7d516 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/FakeInputBuffer.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/FakeInputBuffer.kt
@@ -15,10 +15,12 @@
*/
package androidx.camera.video.internal.encoder
+import androidx.annotation.RequiresApi
import androidx.concurrent.futures.ResolvableFuture
import com.google.common.util.concurrent.ListenableFuture
import java.nio.ByteBuffer
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class FakeInputBuffer : InputBuffer {
private val byteBuffer = ByteBuffer.allocateDirect(1024)
private val terminationFuture = ResolvableFuture.create<Void>()
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/NoInvocationVerificationMode.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/NoInvocationVerificationMode.kt
index 3ec51ac..da1178b 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/NoInvocationVerificationMode.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/NoInvocationVerificationMode.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+
package androidx.camera.video.internal.encoder
import android.os.SystemClock
+import androidx.annotation.RequiresApi
import org.mockito.exceptions.base.MockitoAssertionError
import org.mockito.exceptions.base.MockitoException
import org.mockito.internal.invocation.InvocationMarker
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt
index 2ade124..f15b4e1 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/encoder/VideoEncoderTest.kt
@@ -46,6 +46,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -78,6 +79,7 @@
@LargeTest
@RunWith(AndroidJUnit4::class)
@Suppress("DEPRECATION")
+@SdkSuppress(minSdkVersion = 21)
class VideoEncoderTest {
@get: Rule
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java b/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java
index 53d7383..579a75c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/ActiveRecording.java
@@ -17,6 +17,7 @@
package androidx.camera.video;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.CloseGuardHelper;
import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
@@ -37,9 +38,12 @@
* listener} to the pending recording before starting.
*
* <p>Either {@link #stop()} or {@link #close()} can be called when it is desired to
- * stop the recording, and must be called before this object and the
- * {@link Recorder} from which this object was created will no longer be referenced.
+ * stop the recording. If {@link #stop()} or {@link #close()} are not called on this object
+ * before it is no longer referenced, it will be automatically stopped at a future point in time
+ * when the object is garbage collected, and no new recordings can be started from the same
+ * {@link Recorder} that generated the object until that occurs.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class ActiveRecording implements AutoCloseable {
// Indicates the recording has been explicitly stopped by users.
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/AudioSpec.java b/camera/camera-video/src/main/java/androidx/camera/video/AudioSpec.java
index 95d2746..c08e2d1 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/AudioSpec.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/AudioSpec.java
@@ -22,6 +22,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -34,6 +35,7 @@
* Audio specification that is options to config audio source and encoding.
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY)
@AutoValue
public abstract class AudioSpec {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java b/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java
index 1443c8b..1ae0ee1 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/AudioStats.java
@@ -19,6 +19,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import com.google.auto.value.AutoValue;
@@ -35,6 +36,7 @@
*
* <p>The audio information will be contained in every {@link RecordingStats}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class AudioStats {
@@ -55,7 +57,7 @@
*/
public static final int AUDIO_STATE_ACTIVE = 0;
/**
- * The recording is disabled.
+ * The recording of audio is disabled.
*
* <p>This audio state results from a {@link PendingRecording} that was
* {@linkplain PendingRecording#start() started} without calling
@@ -65,14 +67,18 @@
/**
* The recording is muted because the audio source is silenced by the system.
*
- * <p>If the audio source is occupied by privilege application, depending on the system
- * version, the system may silence the application that are using the audio source. Use
- * {@link #getErrorCause()} to get the error cause.
+ * <p>If the audio source is occupied by a privilege application, such as the dialer,
+ * depending on the system version, the system may silence the application that are using the
+ * audio source. Use {@link #getErrorCause()} to get the error cause.
*/
public static final int AUDIO_STATE_SOURCE_SILENCED = 2;
/**
* The recording is muted because the audio encoder encountered errors.
*
+ * <p>When the audio encoder encountered errors, the recording will keep being recorded
+ * without audio for the rest of the recording. The audio stats generated after the audio
+ * encoder failed will contain this audio state.
+ *
* <p>Use {@link #getErrorCause()} to get the error cause.
*/
public static final int AUDIO_STATE_ENCODER_ERROR = 3;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
index be6d057..8650ba3 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FileDescriptorOutputOptions.java
@@ -20,19 +20,23 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import com.google.auto.value.AutoValue;
/**
- * A class to store the result to a given file descriptor.
+ * A class providing options for storing the result to a given file descriptor.
*
- * <p>The file descriptor must be seekable and writable. And the caller should be responsible for
- * closing the file descriptor.
+ * <p>The file descriptor must be seekable and writable. The caller is responsible for closing
+ * the file descriptor, which can be safely closed after the recording starts. That is, after
+ * {@link PendingRecording#start()} returns. Application should not use the file referenced by
+ * this file descriptor until the recording is complete.
*
* <p>To use a {@link java.io.File} as an output destination instead of a file descriptor, use
* {@link FileOutputOptions}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FileDescriptorOutputOptions extends OutputOptions {
private final FileDescriptorOutputOptionsInternal mFileDescriptorOutputOptionsInternal;
@@ -87,7 +91,8 @@
return mFileDescriptorOutputOptionsInternal.hashCode();
}
- /** The builder of the {@link FileDescriptorOutputOptions}. */
+ /** The builder of the {@link FileDescriptorOutputOptions} object. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements
OutputOptions.Builder<FileDescriptorOutputOptions, Builder> {
private final FileDescriptorOutputOptionsInternal.Builder mInternalBuilder =
@@ -106,8 +111,7 @@
}
/**
- * Sets the limit for the file length in bytes. Zero or negative values are considered
- * unlimited.
+ * Sets the limit for the file length in bytes.
*
* <p>When used to
* {@link Recorder#prepareRecording(android.content.Context, FileDescriptorOutputOptions)
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
index 5c2a91a..131a458 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/FileOutputOptions.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import com.google.auto.value.AutoValue;
@@ -25,13 +26,14 @@
import java.io.File;
/**
- * A class to store the result to a given file.
+ * A class providing options for storing the result to a given file.
*
- * <p>The file must be in a path where the application has permission to write in.
+ * <p>The file must be in a path where the application has the write permission.
*
- * <p>To use a {@link android.os.ParcelFileDescriptor} as an output desination instead of a
+ * <p>To use a {@link android.os.ParcelFileDescriptor} as an output destination instead of a
* {@link File}, use {@link FileDescriptorOutputOptions}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class FileOutputOptions extends OutputOptions {
private final FileOutputOptionsInternal mFileOutputOptionsInternal;
@@ -81,7 +83,8 @@
return mFileOutputOptionsInternal.hashCode();
}
- /** The builder of the {@link FileOutputOptions}. */
+ /** The builder of the {@link FileOutputOptions} object. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements OutputOptions.Builder<FileOutputOptions, Builder> {
private final FileOutputOptionsInternal.Builder mInternalBuilder =
new AutoValue_FileOutputOptions_FileOutputOptionsInternal.Builder()
@@ -96,14 +99,14 @@
* @param file the file object.
* @see File
*/
+ @SuppressWarnings("StreamFiles") // FileDescriptor API is in FileDescriptorOutputOptions
public Builder(@NonNull File file) {
Preconditions.checkNotNull(file, "File can't be null.");
mInternalBuilder.setFile(file);
}
/**
- * Sets the limit for the file length in bytes. Zero or negative values are considered
- * unlimited.
+ * Sets the limit for the file length in bytes.
*
* <p>When used to
* {@link Recorder#prepareRecording(android.content.Context, FileOutputOptions) generate}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java b/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java
index f0ecd53..43228a4 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/MediaSpec.java
@@ -22,6 +22,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.core.util.Consumer;
@@ -36,6 +37,7 @@
* video and audio inputs to the VideoOutput.
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY)
@AutoValue
public abstract class MediaSpec {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
index 32df6b7f..6f13547 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/MediaStoreOutputOptions.java
@@ -18,21 +18,21 @@
import android.content.ContentResolver;
import android.content.ContentValues;
+import android.content.Context;
import android.net.Uri;
+import android.provider.MediaStore;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import com.google.auto.value.AutoValue;
/**
- * A class provides a option for storing output to MediaStore.
+ * A class providing options for storing output to MediaStore.
*
- * <p> The result could be saved to a shared storage. The results will remain on the device after
- * the app is uninstalled.
- *
- * Example:
+ * <p>Example:
*
* <pre>{@code
*
@@ -47,12 +47,23 @@
* .build();
*
* }</pre>
+ *
+ * <p>The output {@link Uri} can be obtained via {@link OutputResults#getOutputUri()} from
+ * {@link VideoRecordEvent.Finalize#getOutputResults()}.
+ *
+ * <p>For more information about setting collections {@link Uri} and {@link ContentValues}, read
+ * the <a href="https://developer.android.com/training/data-storage/shared/media">
+ * Access media files from shared storage</a> and
+ * <a href="https://developer.android.com/reference/android/provider/MediaStore">MediaStore</a>
+ * developer guide.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class MediaStoreOutputOptions extends OutputOptions {
/**
* An empty {@link ContentValues}.
*/
+ @NonNull
public static final ContentValues EMPTY_CONTENT_VALUES = new ContentValues();
private final MediaStoreOutputOptionsInternal mMediaStoreOutputOptionsInternal;
@@ -65,7 +76,9 @@
}
/**
- * Gets the ContentResolver instance in order to convert URI to a file path.
+ * Gets the ContentResolver instance.
+ *
+ * @see Builder#Builder(ContentResolver, Uri)
*/
@NonNull
public ContentResolver getContentResolver() {
@@ -73,7 +86,9 @@
}
/**
- * Gets the URL of the table to insert into.
+ * Gets the URI of the collection to insert into.
+ *
+ * @see Builder#Builder(ContentResolver, Uri)
*/
@NonNull
public Uri getCollection() {
@@ -81,7 +96,9 @@
}
/**
- * Gets the content values to be included in the created file.
+ * Gets the content values to be included in the created video row.
+ *
+ * @see Builder#setContentValues(ContentValues)
*/
@NonNull
public ContentValues getContentValues() {
@@ -90,6 +107,8 @@
/**
* Gets the limit for the file length in bytes.
+ *
+ * @see Builder#setFileSizeLimit(long)
*/
@Override
public long getFileSizeLimit() {
@@ -121,7 +140,8 @@
return mMediaStoreOutputOptionsInternal.hashCode();
}
- /** The builder of the {@link MediaStoreOutputOptions}. */
+ /** The builder of the {@link MediaStoreOutputOptions} object. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder implements
OutputOptions.Builder<MediaStoreOutputOptions, Builder> {
private final MediaStoreOutputOptionsInternal.Builder mInternalBuilder =
@@ -132,8 +152,24 @@
/**
* Creates a builder of the {@link MediaStoreOutputOptions} with media store options.
*
- * @param contentResolver the content resolver instance.
- * @param collectionUri the URI of the table to insert into.
+ * <p>The ContentResolver can be obtained by app {@link Context#getContentResolver()
+ * context} and is used to access to MediaStore.
+ *
+ * <p>{@link MediaStore} class provides APIs to obtain the collection URI. A collection
+ * URI corresponds to a storage volume on the device shared storage. A common collection
+ * URI used to access the primary external storage is
+ * {@link MediaStore.Video.Media#EXTERNAL_CONTENT_URI}.
+ * {@link MediaStore.Video.Media#getContentUri} can also be used to query different
+ * storage volumes. For more information, read
+ * <a href="https://developer.android.com/training/data-storage/shared/media">
+ * Access media files from shared storage</a> developer guide.
+ *
+ * <p>When recording a video, a corresponding video row will be created in the input
+ * collection, and the content values set by {@link #setContentValues} will also be
+ * written to this row.
+ *
+ * @param contentResolver the ContentResolver instance.
+ * @param collectionUri the URI of the collection to insert into.
*/
public Builder(@NonNull ContentResolver contentResolver, @NonNull Uri collectionUri) {
Preconditions.checkNotNull(contentResolver, "Content resolver can't be null.");
@@ -142,7 +178,14 @@
}
/**
- * Sets the content values to be included in the created file.
+ * Sets the content values to be included in the created video row.
+ *
+ * <p>The content values is a set of key/value paris used to store the metadata of a
+ * video item. The keys are defined in {@link MediaStore.MediaColumns} and
+ * {@link MediaStore.Video.VideoColumns}.
+ * When recording a video, a corresponding video row will be created in the input
+ * collection, and this content values will also be written to this row. If a key is not
+ * defined in the MediaStore, the corresponding value will be ignored.
*
* <p>If not set, defaults to {@link #EMPTY_CONTENT_VALUES}.
*
@@ -156,8 +199,7 @@
}
/**
- * Sets the limit for the file length in bytes. Zero or negative values are considered
- * unlimited.
+ * Sets the limit for the file length in bytes.
*
* <p>When used to
* {@link Recorder#prepareRecording(android.content.Context, MediaStoreOutputOptions)
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java b/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
index f98ca59..c5c113d 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/OutputOptions.java
@@ -17,10 +17,20 @@
package androidx.camera.video;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
- * Options for configuring output destination.
+ * Options for configuring output destination for generating a recording.
+ *
+ * <p>A {@link PendingRecording} can be generated with {@link Recorder#prepareRecording} for
+ * different types of output destination, such as {@link FileOutputOptions},
+ * {@link FileDescriptorOutputOptions} and {@link MediaStoreOutputOptions}.
+ *
+ * @see FileOutputOptions
+ * @see FileDescriptorOutputOptions
+ * @see MediaStoreOutputOptions
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class OutputOptions {
/** Represents an unbound file size. */
@@ -42,8 +52,7 @@
interface Builder<T extends OutputOptions, B> {
/**
- * Sets the limit for the file length in bytes. Zero or negative values are considered
- * unlimited.
+ * Sets the limit for the file length in bytes.
*
* <p>If not set, defaults to {@link #FILE_SIZE_UNLIMITED}.
*/
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java b/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
index a9b278b..6dd6d4e 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/OutputResults.java
@@ -19,6 +19,7 @@
import android.net.Uri;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Preconditions;
import com.google.auto.value.AutoValue;
@@ -26,6 +27,7 @@
/**
* Class to provide the information of the output.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class OutputResults {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java b/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java
index 3fd38f2..5ef67b5 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/PendingRecording.java
@@ -22,8 +22,10 @@
import androidx.annotation.CheckResult;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import androidx.camera.core.impl.utils.ContextUtil;
+import androidx.core.content.PermissionChecker;
import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
@@ -39,7 +41,13 @@
*
* <p>A pending recording can be created using one of the {@link Recorder} methods for starting a
* recording such as {@link Recorder#prepareRecording(Context, MediaStoreOutputOptions)}.
+
+ * <p>There may be more settings that can only be changed per-recorder instead of per-recording,
+ * because it requires expensive operations like reconfiguring the camera. For those settings, use
+ * the {@link Recorder.Builder} methods to configure before creating the {@link Recorder}
+ * instance, then create the pending recording with it.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class PendingRecording {
private final Context mContext;
@@ -105,8 +113,8 @@
*
* <p>This method must be called prior to {@link #start()} to enable audio in the recording. If
* this method is not called, the {@link ActiveRecording} generated by {@link #start()}
- * will not contain audio, and {@link RecordingStats#getAudioState()} will always return
- * {@link RecordingStats#AUDIO_DISABLED} for all {@link RecordingStats} send to the listener
+ * will not contain audio, and {@link AudioStats#getAudioState()} will always return
+ * {@link AudioStats#AUDIO_STATE_DISABLED} for all {@link RecordingStats} send to the listener
* set by {@link #withEventListener(Executor, Consumer)}.
*
* <p>Recording with audio requires the {@link android.Manifest.permission#RECORD_AUDIO}
@@ -116,14 +124,18 @@
* @return this pending recording
* @throws IllegalStateException if the {@link Recorder} this recording is associated to
* doesn't support audio.
- * @throws SecurityException if the {@link Manifest.permission#RECORD_AUDIO} permission is
- * not granted for the current process or calling IPC process.
+ * @throws SecurityException if the current application does not have the
+ * {@link Manifest.permission#RECORD_AUDIO} granted.
*/
@RequiresPermission(Manifest.permission.RECORD_AUDIO)
@NonNull
public PendingRecording withAudioEnabled() {
- // Check permission. Passing a null message will generate a default message in exception.
- mContext.enforceCallingOrSelfPermission(Manifest.permission.RECORD_AUDIO, /*message=*/null);
+ // Check permissions and throw a security exception if RECORD_AUDIO is not granted.
+ if (PermissionChecker.checkSelfPermission(mContext, Manifest.permission.RECORD_AUDIO)
+ == PermissionChecker.PERMISSION_DENIED) {
+ throw new SecurityException("Attempted to enable audio for recording but application "
+ + "does not have RECORD_AUDIO permission granted.");
+ }
Preconditions.checkState(mRecorder.isAudioSupported(), "The Recorder this recording is "
+ "associated to doesn't support audio.");
mAudioEnabled = true;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java b/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java
index d7c6818..4c96c9d 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/QualitySelector.java
@@ -22,6 +22,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.CameraInfo;
@@ -39,7 +40,9 @@
import java.util.Set;
/**
- * QualitySelector defines the desired quality setting.
+ * QualitySelector defines a desired quality setting that can be used to configure components
+ * with quality setting requirements such as creating a
+ * {@link Recorder.Builder#setQualitySelector(QualitySelector) Recorder}.
*
* <p>There are pre-defined quality constants that are universally used for video, such as
* {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD} and {@link #QUALITY_UHD}, but
@@ -49,46 +52,44 @@
* the actual resolution defined in the device. Aside from checking the qualities one by one,
* QualitySelector provides a more convenient way to select a quality. The typical usage of
* selecting a single desired quality is:
- * <pre>
- * <code>
- * QualitySelector qualitySelector = QualitySelector.of(QualitySelector.QUALITY_FHD)
- * </code>
- * </pre>
+ * <pre>{@code
+ * QualitySelector qualitySelector = QualitySelector.of(QualitySelector.QUALITY_FHD)
+ * }</pre>
* Or the usage of selecting a series of qualities by desired order:
- * <pre>
- * <code>
- * QualitySelector qualitySelector = QualitySelector
- * .firstTry(QualitySelector.QUALITY_FHD)
- * .thenTry(QualitySelector.QUALITY_HD)
- * .finallyTry(QualitySelector.QUALITY_SHD)
- * </code>
- * </pre>
+ * <pre>{@code
+ * QualitySelector qualitySelector = QualitySelector
+ * .firstTry(QualitySelector.QUALITY_FHD)
+ * .thenTry(QualitySelector.QUALITY_HD)
+ * .finallyTry(QualitySelector.QUALITY_HIGHEST)
+ * }</pre>
* The recommended way to set the {@link Procedure#finallyTry(int)} is giving guaranteed supported
- * qualities such as {@link #QUALITY_LOWEST} and {@link #QUALITY_HIGHEST}, which ensures the
+ * qualities such as {@link #QUALITY_LOWEST} or {@link #QUALITY_HIGHEST}, which ensures the
* QualitySelector can always choose a supported quality. Another way to ensure a quality will be
* selected when none of the desired qualities are supported is to use
* {@link Procedure#finallyTry(int, int)} with an open-ended fallback strategy such as
* {@link #FALLBACK_STRATEGY_LOWER}:
- * <pre>
- * <code>
- * QualitySelector qualitySelector = QualitySelector
- * .firstTry(QualitySelector.QUALITY_UHD)
- * .finallyTry(QualitySelector.QUALITY_FHD, FALLBACK_STRATEGY_LOWER)
- * </code>
- * </pre>
+ * <pre>{@code
+ * QualitySelector qualitySelector = QualitySelector
+ * .firstTry(QualitySelector.QUALITY_UHD)
+ * .finallyTry(QualitySelector.QUALITY_FHD, QualitySelector.FALLBACK_STRATEGY_LOWER)
+ * }</pre>
* If QUALITY_UHD and QUALITY_FHD are not supported on the device, QualitySelector will select
* the quality that is closest to and lower than QUALITY_FHD. If no lower quality is supported,
* the quality that is closest to and higher than QUALITY_FHD will be selected.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class QualitySelector {
private static final String TAG = "QualitySelector";
/**
* A non-applicable quality.
*
- * <p>Check QUALITY_NONE via {@link #isQualitySupported(CameraInfo, int)} will return
+ * <p>Checking QUALITY_NONE via {@link #isQualitySupported(CameraInfo, int)} will return
* {@code false}.
+ *
+ * @hide
*/
+ @RestrictTo(Scope.LIBRARY)
public static final int QUALITY_NONE = -1;
/**
* The lowest video quality supported by the video frame producer.
@@ -142,7 +143,10 @@
/**
* The strategy that no fallback strategy will be applied.
+ *
+ * @hide
*/
+ @RestrictTo(Scope.LIBRARY)
public static final int FALLBACK_STRATEGY_NONE = 0;
/**
@@ -237,14 +241,12 @@
* {@link #getSupportedQualities} will return {@code true}.
*
* <p>Possible values for {@code quality} include {@link #QUALITY_LOWEST},
- * {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD},
- * {@link #QUALITY_UHD} and {@link #QUALITY_NONE}.
+ * {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD}
+ * and {@link #QUALITY_UHD}.
*
* <p>If this method is called with {@link #QUALITY_LOWEST} or {@link #QUALITY_HIGHEST}, it
* will return {@code true} except the case that none of the qualities can be supported.
*
- * <p>If this method is called with {@link #QUALITY_NONE}, it will always return {@code false}.
- *
* @param cameraInfo the cameraInfo for checking the quality.
* @param quality one of the quality constants.
* @return {@code true} if the quality is supported; {@code false} otherwise.
@@ -259,10 +261,8 @@
* Gets the corresponding resolution from the input quality.
*
* <p>Possible values for {@code quality} include {@link #QUALITY_LOWEST},
- * {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD},
- * {@link #QUALITY_UHD} and {@link #QUALITY_NONE}.
- *
- * <p>If this method is called with {@link #QUALITY_NONE}, it will always return {@code null}.
+ * {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD}
+ * and {@link #QUALITY_UHD}.
*
* @param cameraInfo the cameraInfo for checking the quality.
* @param quality one of the quality constants.
@@ -316,7 +316,7 @@
/**
* Gets an instance of QualitySelector with only one desired quality.
*
- * <p>The returned QualitySelector will adopt {@link #FALLBACK_STRATEGY_NONE}.
+ * <p>If there are more than one desired qualities, use {@link #firstTry} for further settings.
*
* @param quality the quality constant. Possible values include {@link #QUALITY_LOWEST},
* {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD},
@@ -330,18 +330,16 @@
}
/**
- * Gets an instance of QualitySelector with only one desired quality.
+ * Gets an instance of QualitySelector with only one desired quality and a fallback strategy.
*
- * <p>If the desired quality is not supported, the fallback strategy will be applied on
- * this quality.
+ * <p>If there are more than one desired qualities, use {@link #firstTry} for further settings.
*
* @param quality the quality constant. Possible values include {@link #QUALITY_LOWEST},
* {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD}, {@link #QUALITY_FHD},
* or {@link #QUALITY_UHD}.
* @param fallbackStrategy the fallback strategy. Possible values include
- * {@link #FALLBACK_STRATEGY_NONE}, {@link #FALLBACK_STRATEGY_HIGHER},
- * {@link #FALLBACK_STRATEGY_STRICTLY_HIGHER}, {@link #FALLBACK_STRATEGY_LOWER} and
- * {@link #FALLBACK_STRATEGY_STRICTLY_LOWER}.
+ * {@link #FALLBACK_STRATEGY_HIGHER}, {@link #FALLBACK_STRATEGY_STRICTLY_HIGHER},
+ * {@link #FALLBACK_STRATEGY_LOWER} and {@link #FALLBACK_STRATEGY_STRICTLY_LOWER}.
* @return the QualitySelector instance.
* @throws IllegalArgumentException if {@code quality} is not a quality constant or
* {@code fallbackStrategy} is not a fallback strategy constant.
@@ -508,8 +506,29 @@
}
/**
- * The procedure can be used to set desired qualities and fallback strategy.
+ * Procedure can be used to build {@link QualitySelector} with further settings.
+ *
+ * <p>A QualitySelector can be simply created by {@link QualitySelector#of QualitySelector.of}
+ * with a single desired quality. When more quality settings are needed, use
+ * {@link QualitySelector#firstTry} to get a Procedure, chain the desired qualities by
+ * {@link #thenTry} and generate the QualitySelector by {@link #finallyTry} with or without
+ * fallback strategy. For example:
+ *
+ * <pre>{@code
+ * QualitySelector qualitySelector = QualitySelector
+ * .firstTry(QualitySelector.QUALITY_UHD)
+ * .thenTry(QualitySelector.QUALITY_HD)
+ * .finallyTry(QualitySelector.QUALITY_SD)
+ * }</pre>
+ * or
+ <pre>{@code
+ * QualitySelector qualitySelector = QualitySelector
+ * .firstTry(QualitySelector.QUALITY_UHD)
+ * .finallyTry(QualitySelector.QUALITY_HD,
+ * QualitySelector.FALLBACK_STRATEGY_STRICTLY_LOWER)
+ * }</pre>
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static class Procedure {
private final List<Integer> mPreferredQualityList = new ArrayList<>();
@@ -535,8 +554,6 @@
/**
* Sets the final desired quality.
*
- * <p>The returned QualitySelector will adopt {@link #FALLBACK_STRATEGY_NONE}.
- *
* <p>This method finishes the setting procedure and generates a {@link QualitySelector}
* with the requirements set to the procedure.
*
@@ -564,9 +581,8 @@
* {@link #QUALITY_HIGHEST}, {@link #QUALITY_SD}, {@link #QUALITY_HD},
* {@link #QUALITY_FHD} or {@link #QUALITY_UHD}.
* @param fallbackStrategy the fallback strategy. Possible values include
- * {@link #FALLBACK_STRATEGY_NONE}, {@link #FALLBACK_STRATEGY_HIGHER},
- * {@link #FALLBACK_STRATEGY_STRICTLY_HIGHER}, {@link #FALLBACK_STRATEGY_LOWER} and
- * {@link #FALLBACK_STRATEGY_STRICTLY_LOWER}.
+ * {@link #FALLBACK_STRATEGY_HIGHER}, {@link #FALLBACK_STRATEGY_STRICTLY_HIGHER},
+ * {@link #FALLBACK_STRATEGY_LOWER} and {@link #FALLBACK_STRATEGY_STRICTLY_LOWER}.
* @return the {@link QualitySelector}.
* @throws IllegalArgumentException if {@code quality} is not a quality constant or
* {@code fallbackStrategy} is not a fallback strategy constant.
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
index 053c895..fe90ac9 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/Recorder.java
@@ -117,12 +117,13 @@
* cameraProvider.bindToLifecycle(this, cameraSelector, preview, videoCapture);
* </pre>
*
- * <p>Once the recorder is attached to a video source, a new recording can be configured with one of
- * the {@link PendingRecording} methods, such as
+ * <p>Once the recorder is attached to a video source as a {@link VideoOutput}, e.g. using it to
+ * create a {@link VideoCapture} by calling {@link VideoCapture#withOutput(VideoOutput)}, a new
+ * recording can be generated with one of the prepareRecording methods, such as
* {@link #prepareRecording(Context, MediaStoreOutputOptions)}. The {@link PendingRecording} class
- * also allows setting a listener with
- * {@link PendingRecording#withEventListener(Executor, Consumer)} to listen for
- * {@link VideoRecordEvent}s such as {@link VideoRecordEvent.Start},
+ * then can be used to adjust per-recording settings and to start the recording. It also allows
+ * setting a listener with {@link PendingRecording#withEventListener(Executor, Consumer)} to
+ * listen for {@link VideoRecordEvent}s such as {@link VideoRecordEvent.Start},
* {@link VideoRecordEvent.Pause}, {@link VideoRecordEvent.Resume}, and
* {@link VideoRecordEvent.Finalize}. This listener will also receive regular recording status
* updates via the {@link VideoRecordEvent.Status} event.
@@ -133,6 +134,7 @@
* @see VideoCapture#withOutput(VideoOutput)
* @see PendingRecording
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class Recorder implements VideoOutput {
private static final String TAG = "Recorder";
@@ -232,6 +234,8 @@
* .thenTry(QUALITY_SD)
* .finallyTry(QUALITY_FHD, FALLBACK_STRATEGY_HIGHER);
* }</pre>
+ *
+ * @see QualitySelector
*/
public static final QualitySelector DEFAULT_QUALITY_SELECTOR =
QualitySelector.firstTry(QUALITY_FHD)
@@ -484,16 +488,19 @@
*
* <p>The provided {@link FileOutputOptions} specifies the file to use.
*
- * <p>The recording will not begin until {@link PendingRecording#start()} is called on the
- * returned {@link PendingRecording}. Only a single pending recording can be started per
- * {@link Recorder} instance.
+ * <p>Calling this method multiple times will generate multiple {@link PendingRecording}s,
+ * each of the recordings can be used to adjust per-recording settings individually. The
+ * recording will not begin until {@link PendingRecording#start()} is called. Only a single
+ * pending recording can be started per {@link Recorder} instance.
*
* @param context the context used to enforce runtime permissions, interface with the media
* scanner service, and attribute access to permission protected data, such as
- * audio.
+ * audio. If using this context to <a href="{@docRoot}guide
+ * /topics/data/audit-access#audit-by-attribution-tagaudit">audit audio
+ * access</a> on API level 31+, a context created with
+ * {@link Context#createAttributionContext(String)} should be used.
* @param fileOutputOptions the options that configures how the output will be handled.
* @return a {@link PendingRecording} that is associated with this Recorder.
- * @throws IllegalStateException if the Recorder is released.
* @see FileOutputOptions
*/
@NonNull
@@ -511,25 +518,33 @@
* <p>Currently, file descriptors as output destinations are not supported on pre-Android O
* (API 26) devices.
*
- * <p>The recording will not begin until {@link PendingRecording#start()} is called on the
- * returned {@link PendingRecording}. Only a single pending recording can be started per
- * {@link Recorder} instance.
+ * <p>Calling this method multiple times will generate multiple {@link PendingRecording}s,
+ * each of the recordings can be used to adjust per-recording settings individually. The
+ * recording will not begin until {@link PendingRecording#start()} is called. Only a single
+ * pending recording can be started per {@link Recorder} instance.
*
* @param context the context used to enforce runtime permissions, interface with the media
* scanner service, and attribute access to permission protected data, such as
- * audio.
+ * audio. If using this context to <a href="{@docRoot}guide
+ * /topics/data/audit-access#audit-by-attribution-tagaudit">audit audio
+ * access</a> on API level 31+, a context created with
+ * {@link Context#createAttributionContext(String)} should be used.
* @param fileDescriptorOutputOptions the options that configures how the output will be
* handled.
* @return a {@link PendingRecording} that is associated with this Recorder.
- * @throws IllegalStateException if the Recorder is released.
+ * @throws UnsupportedOperationException if this method is called on per-Android O (API 26)
+ * devices.
* @see FileDescriptorOutputOptions
*/
@RequiresApi(26)
@NonNull
public PendingRecording prepareRecording(@NonNull Context context,
@NonNull FileDescriptorOutputOptions fileDescriptorOutputOptions) {
- Preconditions.checkState(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O,
- "MediaMuxer doesn't accept FileDescriptor as output destination.");
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+ throw new UnsupportedOperationException(
+ "File descriptors as output destinations are not supported on pre-Android O "
+ + "(API 26) devices.");
+ }
return prepareRecordingInternal(context, fileDescriptorOutputOptions);
}
@@ -539,16 +554,19 @@
* <p>The provided {@link MediaStoreOutputOptions} specifies the options which will be used
* to save the recording to a {@link MediaStore}.
*
- * <p>The recording will not begin until {@link PendingRecording#start()} is called on the
- * returned {@link PendingRecording}. Only a single pending recording can be started per
- * {@link Recorder} instance.
+ * <p>Calling this method multiple times will generate multiple {@link PendingRecording}s,
+ * each of the recordings can be used to adjust per-recording settings individually. The
+ * recording will not begin until {@link PendingRecording#start()} is called. Only a single
+ * pending recording can be started per {@link Recorder} instance.
*
* @param context the context used to enforce runtime permissions, interface with the media
* scanner service, and attribute access to permission protected data, such as
- * audio.
+ * audio. If using this context to <a href="{@docRoot}guide
+ * /topics/data/audit-access#audit-by-attribution-tagaudit">audit audio
+ * access</a> on API level 31+, a context created with
+ * {@link Context#createAttributionContext(String)} should be used.
* @param mediaStoreOutputOptions the options that configures how the output will be handled.
* @return a {@link PendingRecording} that is associated with this Recorder.
- * @throws IllegalStateException if the Recorder is released.
* @see MediaStoreOutputOptions
*/
@NonNull
@@ -619,10 +637,10 @@
* completes. The recording will be considered active, so before it's finalized, an
* {@link IllegalStateException} will be thrown if this method is called for a second time.
*
- * <p>The recording will be finalized with
- * {@link VideoRecordEvent.Finalize#ERROR_SOURCE_INACTIVE} when the video frame producer
- * stops sending frames to the provided {@link Surface}, for example, when the
- * {@link VideoCapture} this Recorder is associated with is detached from the camera.
+ * <p>If the video producer stops sending frames to the provided surface, the recording will
+ * be automatically finalized with {@link VideoRecordEvent.Finalize#ERROR_SOURCE_INACTIVE}.
+ * This can happen, for example, when the {@link VideoCapture} this Recorder is associated
+ * with is detached from the camera.
*
* @throws IllegalStateException if there's an active recording, or the audio is
* {@link PendingRecording#withAudioEnabled() enabled} for the
@@ -2164,6 +2182,7 @@
mAudioState = audioState;
}
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
abstract static class RecordingRecord {
@@ -2211,6 +2230,7 @@
/**
* Builder class for {@link Recorder} objects.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Builder {
private final MediaSpec.Builder mMediaSpecBuilder;
@@ -2233,6 +2253,8 @@
* encoding. For the best performance, it's recommended to be an {@link Executor} that is
* capable of running at least two tasks concurrently, such as a
* {@link java.util.concurrent.ThreadPoolExecutor} backed by 2 or more threads.
+ *
+ * <p>If not set, the Recorder will be run on the IO executor internally managed by CameraX.
*/
@NonNull
public Builder setExecutor(@NonNull Executor executor) {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java b/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
index 997c57a..68643b2 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/RecordingStats.java
@@ -17,6 +17,7 @@
package androidx.camera.video;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
@@ -34,6 +35,7 @@
* {@link VideoRecordEvent#getRecordingStats()}.
* @see PendingRecording#withEventListener(Executor, Consumer)
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class RecordingStats {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java
index 58d6819..5b9ec7f 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapabilities.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.CameraInfo;
@@ -41,6 +42,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY)
public final class VideoCapabilities {
private static final String TAG = "VideoCapabilities";
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
index f770d75..09c594c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
@@ -21,7 +21,6 @@
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_SUPPORTED_RESOLUTIONS;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
-import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -43,6 +42,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.annotation.UiThread;
@@ -73,7 +73,6 @@
import androidx.camera.core.internal.ThreadConfig;
import androidx.camera.video.VideoOutput.StreamState;
import androidx.camera.video.impl.VideoCaptureConfig;
-import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
@@ -81,7 +80,6 @@
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
@@ -91,8 +89,9 @@
/**
* A use case that provides camera stream suitable for video application.
*
- * <p>VideoCapture is used to create a camera stream suitable for video application. The camera
- * stream is used by the extended classes of {@link VideoOutput}.
+ * <p>VideoCapture is used to create a camera stream suitable for a video application such as
+ * recording a high-quality video to a file. The camera stream is used by the extended classes of
+ * {@link VideoOutput}.
* {@link #withOutput(VideoOutput)} can be used to create a VideoCapture instance associated with
* the given VideoOutput. Take {@link Recorder} as an example,
* <pre>{@code
@@ -103,6 +102,7 @@
*
* @param <T> the type of VideoOutput
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class VideoCapture<T extends VideoOutput> extends UseCase {
private static final String TAG = "VideoCapture";
private static final Defaults DEFAULT_CONFIG = new Defaults();
@@ -577,6 +577,7 @@
* @param <T> the type of VideoOutput
* @hide
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
@SuppressWarnings("ObjectToString")
public static final class Builder<T extends VideoOutput> implements
@@ -892,16 +893,5 @@
getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
return this;
}
-
- /** @hide */
- @RestrictTo(Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder<T> setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
}
}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
index 8360571..adb7c23 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCaptureLegacy.java
@@ -22,7 +22,6 @@
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ASPECT_RATIO;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_RESOLUTION;
import static androidx.camera.core.impl.ImageOutputConfig.OPTION_TARGET_ROTATION;
-import static androidx.camera.core.impl.UseCaseConfig.OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAMERA_SELECTOR;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_CAPTURE_CONFIG_UNPACKER;
import static androidx.camera.core.impl.UseCaseConfig.OPTION_DEFAULT_CAPTURE_CONFIG;
@@ -72,6 +71,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -102,7 +102,6 @@
import androidx.camera.video.internal.compat.Api26Impl;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
-import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
import com.google.common.util.concurrent.ListenableFuture;
@@ -113,7 +112,6 @@
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.nio.ByteBuffer;
-import java.util.Collection;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.Executor;
@@ -129,6 +127,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public final class VideoCaptureLegacy extends UseCase {
@@ -1119,6 +1118,7 @@
*
* @hide
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY_GROUP)
public static final class Defaults
implements ConfigProvider<VideoCaptureLegacyConfig> {
@@ -1658,18 +1658,6 @@
getMutableConfig().insertOption(OPTION_USE_CASE_EVENT_CALLBACK, useCaseEventCallback);
return this;
}
-
- /** @hide */
- @RestrictTo(Scope.LIBRARY_GROUP)
- @Override
- @NonNull
- public Builder setAttachedUseCasesUpdateListener(
- @NonNull Consumer<Collection<UseCase>> attachedUseCasesUpdateListener) {
- getMutableConfig().insertOption(OPTION_ATTACHED_USE_CASES_UPDATE_LISTENER,
- attachedUseCasesUpdateListener);
- return this;
- }
-
}
/**
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoOutput.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoOutput.java
index cf3538c..cc0f7f6 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoOutput.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoOutput.java
@@ -19,6 +19,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
import androidx.camera.core.SurfaceRequest;
@@ -35,8 +36,11 @@
* {@link SurfaceRequest} sent to {@link #onSurfaceRequested(SurfaceRequest)}.
*
* <p>The type of video data produced by a video output and API for saving or communicating that
- * data is left to the implementation.
+ * data is left to the implementation. An implementation commonly used for local video saving is
+ * {@link Recorder}. This interface is usually only needs to be implemented by applications for
+ * advanced use cases.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface VideoOutput {
/**
* A state which represents whether the video frame producer is producing frames to the
@@ -75,12 +79,14 @@
/**
* Called when a new {@link Surface} has been requested by a video frame producer.
*
- * <p>This is called when a video frame producer is ready to receive a surface that it can
- * use to send video frames to the video output.
- * The video frame producer may repeatedly request a surface more than once, but only the
- * latest {@link SurfaceRequest} should be considered active. All previous surface requests
- * will complete by sending a {@link androidx.camera.core.SurfaceRequest.Result} to the
- * consumer passed to {@link SurfaceRequest#provideSurface(Surface, Executor, Consumer)}.
+ * <p>Users of this class should not call this method directly. It will be called by the
+ * video frame producer. Implementors of this class should be aware that this method is
+ * called when a video frame producer is ready to receive a surface that it can use to send
+ * video frames to the video output. The video frame producer may repeatedly request a
+ * surface more than once, but only the latest {@link SurfaceRequest} should be considered
+ * active. All previous surface requests will complete by sending a
+ * {@link androidx.camera.core.SurfaceRequest.Result} to the consumer passed to
+ * {@link SurfaceRequest#provideSurface(Surface, Executor, Consumer)}.
*
* <p>A request is considered active until it is
* {@linkplain SurfaceRequest#provideSurface(Surface, Executor, androidx.core.util.Consumer)
@@ -92,7 +98,8 @@
*
* <p>Once a request is successfully completed, it is guaranteed that if a new request is
* made, the {@link Surface} used to fulfill the previous request will be detached from the
- * video frame producer and {@link SurfaceRequest#provideSurface(Surface, Executor, Consumer)}
+ * video frame producer and the {@code resultListener} provided in
+ * {@link SurfaceRequest#provideSurface(Surface, Executor, Consumer)}
* will be invoked with a {@link androidx.camera.core.SurfaceRequest.Result} containing
* {@link androidx.camera.core.SurfaceRequest.Result#RESULT_SURFACE_USED_SUCCESSFULLY}.
*
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
index 2929766..b984d0c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoRecordEvent.java
@@ -22,6 +22,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.core.util.Consumer;
import androidx.core.util.Preconditions;
@@ -31,7 +32,7 @@
import java.util.concurrent.Executor;
/**
- * VideoRecordEvent is used to report the video recording events and status.
+ * VideoRecordEvent is used to report video recording events and status.
*
* <p>Upon starting a recording by {@link PendingRecording#start()}, recording events will start to
* be sent to the listener set in {@link PendingRecording#withEventListener(Executor, Consumer)}.
@@ -83,12 +84,13 @@
* recorded successfully, and other error code indicate the recording is failed or stopped due to
* a certain reason. Please note that a failed result does not mean that the video file has not been
* generated. In some cases, the file can still be successfully generated. For example, the
- * result {@link Finalize#ERROR_INSUFFICIENT_DISK} will still have video file.
+ * result {@link Finalize#ERROR_FILE_SIZE_LIMIT_REACHED} will still have video file.
*
* <p>The {@link Status} event will be triggered continuously during the recording process,
* {@link #getRecordingStats} can be used to get the recording state such as total recorded bytes
* and total duration when the event is triggered.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class VideoRecordEvent {
private final OutputOptions mOutputOptions;
@@ -103,7 +105,7 @@
}
/**
- * Gets the recording status of current event.
+ * Gets the recording statistics of current event.
*/
@NonNull
public RecordingStats getRecordingStats() {
@@ -130,6 +132,7 @@
* <p>When a video recording is successfully requested by {@link PendingRecording#start()},
* a {@code Start} event will be the first event.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Start extends VideoRecordEvent {
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -162,15 +165,70 @@
* fails. Use {@link Finalize#getError()} to obtain the error type and
* {@link Finalize#getCause()} to get the error cause. If there is no error,
* {@link #ERROR_NONE} will be returned. Other error types indicate the recording is failed or
- * stopped due to a certain reasons. Please note that receiving a finalize event with error
+ * stopped due to a certain reason. Please note that receiving a finalize event with error
* does not necessarily mean that the video file has not been generated. In some cases, the
* file can still be successfully generated depending on the error type. For example, a file
* will still be generated when the recording is finalized with
- * {@link #ERROR_INSUFFICIENT_DISK}.
+ * {@link #ERROR_FILE_SIZE_LIMIT_REACHED}. A file may or may not be generated when the
+ * recording is finalized with {@link #ERROR_INSUFFICIENT_STORAGE}. Example to detect if an
+ * output file is generated:
+ * <pre>{@code
+ * if (videoRecordEvent instanceof VideoRecordEvent.Finalize) {
+ * VideoRecordEvent.Finalize finalizeEvent =
+ * (VideoRecordEvent.Finalize) videoRecordEvent;
+ * OutputOptions options = finalizeEvent.getOutputOptions();
+ * switch (finalizeEvent.getError()) {
+ * case ERROR_INSUFFICIENT_STORAGE:
+ * if (options instanceof FileOutputOptions) {
+ * if (((FileOutputOptions) options).getFile().exists()) {
+ * // file exists
+ * }
+ * } else if (options instanceof MediaStoreOutputOptions) {
+ * Uri uri = finalizeEvent.getOutputResults().getOutputUri();
+ * if (uri != Uri.EMPTY) {
+ * // file exists
+ * }
+ * } else if (options instanceof FileDescriptorOutputOptions) {
+ * // User has to check the referenced target of the file descriptor.
+ * }
+ * break;
+ * }
+ * }
+ * }</pre>
+ *
+ * <p>For certain types of errors, the output file will not be constructed correctly, and it
+ * will be the user's responsibility to deal with the incomplete file, such as deleting it.
+ * Example to delete the file:
+ *
+ * <pre>{@code
+ * if (videoRecordEvent instanceof VideoRecordEvent.Finalize) {
+ * VideoRecordEvent.Finalize finalizeEvent =
+ * (VideoRecordEvent.Finalize) videoRecordEvent;
+ * OutputOptions options = finalizeEvent.getOutputOptions();
+ * switch (finalizeEvent.getError()) {
+ * case ERROR_UNKNOWN:
+ * case ERROR_RECORDER_ERROR:
+ * case ERROR_ENCODING_FAILED:
+ * case ERROR_NO_VALID_DATA:
+ * if (options instanceof FileOutputOptions) {
+ * ((FileOutputOptions) options).getFile().delete();
+ * } else if (options instanceof MediaStoreOutputOptions) {
+ * Uri uri = finalizeEvent.getOutputResults().getOutputUri();
+ * if (uri != Uri.EMPTY) {
+ * context.getContentResolver().delete(uri, null, null);
+ * }
+ * } else if (options instanceof FileDescriptorOutputOptions) {
+ * // User has to clean up the referenced target of the file descriptor.
+ * }
+ * break;
+ * }
+ * }
+ * }</pre>
*
* <p>If there's no error that prevents the file to be generated, the file can be accessed
* safely after receiving the finalize event.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Finalize extends VideoRecordEvent {
/**
* The recording succeeded with no error.
@@ -179,6 +237,9 @@
/**
* An unknown error occurred.
+ *
+ * <p>The output file may or moy not be generated. Since the error is not determined,
+ * application should clean up the output file, such as deleting it.
*/
public static final int ERROR_UNKNOWN = 1;
@@ -186,6 +247,7 @@
* The recording failed due to file size limitation.
*
* <p>The file size limitation will refer to {@link OutputOptions#getFileSizeLimit()}.
+ * The output file will still be generated with this error.
*/
// TODO(b/167481981): add more descriptions about the restrictions after getting into more
// details.
@@ -193,10 +255,18 @@
/**
* The recording failed due to insufficient storage space.
+ *
+ * <p>There are two possible cases that will cause this error.
+ * <ul>
+ * <li>The storage is already full before the recording starts, so no output file
+ * will be generated.</li>
+ * <li>The storage becomes full during recording, so the output file will be
+ * generated. </li>
+ * </ul>
*/
// TODO(b/167484136): add more descriptions about the restrictions after getting into more
// details.
- public static final int ERROR_INSUFFICIENT_DISK = 3;
+ public static final int ERROR_INSUFFICIENT_STORAGE = 3;
/**
* The recording failed because the source becomes inactive and stops sending frames.
@@ -204,7 +274,7 @@
* <p>One case is that if camera is closed due to lifecycle stopped, the active recording
* will be finalized with this error, and the output will be generated, containing the
* frames produced before camera closing. Attempting to start a new recording will be
- * finalized immediately if the source remains inactive.
+ * finalized immediately if the source remains inactive and no output will be generated.
*/
public static final int ERROR_SOURCE_INACTIVE = 4;
@@ -214,8 +284,9 @@
* <p>This error is generated when invalid output options have been used while preparing a
* recording, such as with the
* {@link Recorder#prepareRecording(android.content.Context, MediaStoreOutputOptions)}
- * method. The error will depend on the subclass of {@link OutputOptions} used, and more
- * information about the error can be retrieved from {@link Finalize#getCause()}.
+ * method. The error will depend on the subclass of {@link OutputOptions} used.
+ *
+ * <p>No output file will be generated with this error.
*/
public static final int ERROR_INVALID_OUTPUT_OPTIONS = 5;
@@ -223,17 +294,19 @@
* The recording failed while encoding.
*
* <p>This error may be generated when the video or audio codec encounters an error during
- * encoding. See {@link Finalize#getCause()} for more information about the error
- * encountered by the codec.
+ * encoding. When this happens and the output file is generated, the output file is not
+ * properly constructed. The application will need to clean up the output file, such as
+ * deleting the file.
*/
public static final int ERROR_ENCODING_FAILED = 6;
/**
* The recording failed because the {@link Recorder} is in an unrecoverable error state.
*
- * <p>More information about the error can be retrieved from {@link Finalize#getCause()}.
- * Such an error will usually require creating a new {@link Recorder} object to start a
- * new recording.
+ * <p>When this happens and the output file is generated, the output file is not properly
+ * constructed. The application will need to clean up the output file, such as deleting
+ * the file. Such an error will usually require creating a new {@link Recorder} object to
+ * start a new recording.
*/
public static final int ERROR_RECORDER_ERROR = 7;
@@ -241,8 +314,8 @@
* The recording failed because no valid data was produced to be recorded.
*
* <p>This error is generated when the essential data for a recording to be played correctly
- * is missing, for example, a recording must contain at least one key frame. See
- * {@link Finalize#getCause()} for more information.
+ * is missing, for example, a recording must contain at least one key frame. The
+ * application will need to clean up the output file, such as deleting the file.
*/
public static final int ERROR_NO_VALID_DATA = 8;
@@ -256,7 +329,7 @@
@RestrictTo(RestrictTo.Scope.LIBRARY)
@Retention(RetentionPolicy.SOURCE)
@IntDef(value = {ERROR_NONE, ERROR_UNKNOWN, ERROR_FILE_SIZE_LIMIT_REACHED,
- ERROR_INSUFFICIENT_DISK, ERROR_INVALID_OUTPUT_OPTIONS, ERROR_ENCODING_FAILED,
+ ERROR_INSUFFICIENT_STORAGE, ERROR_INVALID_OUTPUT_OPTIONS, ERROR_ENCODING_FAILED,
ERROR_RECORDER_ERROR, ERROR_NO_VALID_DATA, ERROR_SOURCE_INACTIVE})
public @interface VideoRecordError {
}
@@ -300,7 +373,7 @@
* Gets the error type for a video recording.
*
* <p>Possible values are {@link #ERROR_NONE}, {@link #ERROR_UNKNOWN},
- * {@link #ERROR_FILE_SIZE_LIMIT_REACHED}, {@link #ERROR_INSUFFICIENT_DISK},
+ * {@link #ERROR_FILE_SIZE_LIMIT_REACHED}, {@link #ERROR_INSUFFICIENT_STORAGE},
* {@link #ERROR_INVALID_OUTPUT_OPTIONS}, {@link #ERROR_ENCODING_FAILED},
* {@link #ERROR_RECORDER_ERROR}, {@link #ERROR_NO_VALID_DATA} and
* {@link #ERROR_SOURCE_INACTIVE}.
@@ -330,6 +403,7 @@
/**
* The status report of the recording in progress.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Status extends VideoRecordEvent {
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -349,6 +423,7 @@
*
* <p>A {@code Pause} event will be triggered after calling {@link ActiveRecording#pause()}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Pause extends VideoRecordEvent {
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
@@ -368,6 +443,7 @@
*
* <p>A {@code Resume} event will be triggered after calling {@link ActiveRecording#resume()}.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class Resume extends VideoRecordEvent {
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoSpec.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoSpec.java
index e286cbd..a1efbe28 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoSpec.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoSpec.java
@@ -25,6 +25,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.RestrictTo.Scope;
@@ -37,6 +38,7 @@
* Video specification that is options to config video encoding.
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(Scope.LIBRARY)
@AutoValue
public abstract class VideoSpec {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureConfig.java
index f5a628a..dac4381 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureConfig.java
@@ -17,6 +17,7 @@
package androidx.camera.video.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.ImageFormatConstants;
import androidx.camera.core.impl.ImageOutputConfig;
@@ -33,6 +34,7 @@
*
* @param <T> the type of VideoOutput
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class VideoCaptureConfig<T extends VideoOutput>
implements UseCaseConfig<VideoCapture<T>>,
ImageOutputConfig,
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureLegacyConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureLegacyConfig.java
index 9f67287..76df0b2 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureLegacyConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/impl/VideoCaptureLegacyConfig.java
@@ -17,6 +17,7 @@
package androidx.camera.video.impl;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Config;
import androidx.camera.core.impl.ImageFormatConstants;
import androidx.camera.core.impl.ImageOutputConfig;
@@ -30,6 +31,7 @@
*
* <p>In the earlier stage, the VideoCaptureLegacy is deprioritized.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class VideoCaptureLegacyConfig
implements UseCaseConfig<VideoCaptureLegacy>,
ImageOutputConfig,
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSource.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSource.java
index 39269cd..6a6dd23 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSource.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSource.java
@@ -30,6 +30,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.Observable;
@@ -65,6 +66,7 @@
* @see BufferProvider
* @see AudioRecord
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class AudioSource {
private static final String TAG = "AudioSource";
// Common sample rate options to choose from in descending order.
@@ -146,25 +148,7 @@
}
if (Build.VERSION.SDK_INT >= 29) {
- mAudioRecordingCallback = new AudioManager.AudioRecordingCallback() {
- @Override
- public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
- super.onRecordingConfigChanged(configs);
- if (mCallbackExecutor != null && mAudioSourceCallback != null) {
- for (AudioRecordingConfiguration config : configs) {
- if (Api24Impl.getClientAudioSessionId(config)
- == mAudioRecord.getAudioSessionId()) {
- boolean isSilenced = Api29Impl.isClientSilenced(config);
- if (mSourceSilence.getAndSet(isSilenced) != isSilenced) {
- mCallbackExecutor.execute(
- () -> mAudioSourceCallback.onSilenced(isSilenced));
- }
- break;
- }
- }
- }
- }
- };
+ mAudioRecordingCallback = new AudioRecordingApi29Callback();
Api29Impl.registerAudioRecordingCallback(mAudioRecord, mExecutor,
mAudioRecordingCallback);
}
@@ -172,6 +156,28 @@
mBufferProvider.addObserver(mExecutor, mStateObserver);
}
+ @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+ @RequiresApi(29)
+ class AudioRecordingApi29Callback extends AudioManager.AudioRecordingCallback {
+ @Override
+ public void onRecordingConfigChanged(List<AudioRecordingConfiguration> configs) {
+ super.onRecordingConfigChanged(configs);
+ if (mCallbackExecutor != null && mAudioSourceCallback != null) {
+ for (AudioRecordingConfiguration config : configs) {
+ if (Api24Impl.getClientAudioSessionId(config)
+ == mAudioRecord.getAudioSessionId()) {
+ boolean isSilenced = Api29Impl.isClientSilenced(config);
+ if (mSourceSilence.getAndSet(isSilenced) != isSilenced) {
+ mCallbackExecutor.execute(
+ () -> mAudioSourceCallback.onSilenced(isSilenced));
+ }
+ break;
+ }
+ }
+ }
+ }
+ }
+
/**
* Starts the AudioSource.
*
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSourceAccessException.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSourceAccessException.java
index 204ba20..da7210e 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSourceAccessException.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/AudioSourceAccessException.java
@@ -17,8 +17,10 @@
package androidx.camera.video.internal;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/** An exception thrown to indicate an error has occurred during configuring an audio source. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class AudioSourceAccessException extends Exception {
public AudioSourceAccessException(@Nullable String message) {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/BufferProvider.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/BufferProvider.java
index 1dfd4c1..d8cf19f 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/BufferProvider.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/BufferProvider.java
@@ -17,6 +17,7 @@
package androidx.camera.video.internal;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Observable;
import com.google.common.util.concurrent.ListenableFuture;
@@ -38,6 +39,7 @@
*
* @param <T> the buffer data type
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface BufferProvider<T> extends Observable<BufferProvider.State> {
/**
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/DebugUtils.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/DebugUtils.java
index de49e75..14cdf02 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/DebugUtils.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/DebugUtils.java
@@ -25,6 +25,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.video.internal.compat.Api28Impl;
import androidx.camera.video.internal.compat.Api31Impl;
@@ -39,6 +40,7 @@
/**
* Utility class for debugging.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class DebugUtils {
private static final String TAG = "DebugUtils";
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/SharedByteBuffer.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/SharedByteBuffer.java
index 5345092..69d5e52 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/SharedByteBuffer.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/SharedByteBuffer.java
@@ -18,6 +18,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.core.util.Pair;
import androidx.core.util.Preconditions;
@@ -41,6 +42,7 @@
* {@link #close()} has not been called. Once {@link #close()} has been called, it should be
* assumed the {@link ByteBuffer} contains invalid data.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class SharedByteBuffer implements Closeable {
private static final String TAG = "SharedByteBuffer";
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java
index d94cc1c..8053d55 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/CameraUseInconsistentTimebaseQuirk.java
@@ -19,6 +19,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.video.internal.workaround.CorrectVideoTimeByTimebase;
@@ -33,10 +34,12 @@
*
* @see CorrectVideoTimeByTimebase
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CameraUseInconsistentTimebaseQuirk implements Quirk {
private static final Set<String> BUILD_HARDWARE_SET = new HashSet<>(Arrays.asList(
"samsungexynos7570",
- "samsungexynos7870"
+ "samsungexynos7870",
+ "qcom"
));
static boolean load() {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeactivateEncoderSurfaceBeforeStopEncoderQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeactivateEncoderSurfaceBeforeStopEncoderQuirk.java
index b2350d8..ad27127 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeactivateEncoderSurfaceBeforeStopEncoderQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeactivateEncoderSurfaceBeforeStopEncoderQuirk.java
@@ -19,6 +19,7 @@
import android.media.MediaCodec;
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.video.Recorder;
import androidx.camera.video.VideoCapture;
@@ -38,6 +39,7 @@
* So making the {@link Recorder} inactive in stopping state will stop the camera from producing
* frames to the {@link MediaCodec} before actually stopping it.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeactivateEncoderSurfaceBeforeStopEncoderQuirk implements Quirk {
static boolean load() {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirks.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirks.java
index 8ea2b97..02a2ce6 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirks.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirks.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.impl.Quirks;
@@ -28,6 +29,7 @@
* ({@link android.os.Build.VERSION#SDK_INT}) or specific devices.
* <p>Video specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirks {
@NonNull
private static final Quirks QUIRKS;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
index aa16934..09543f98 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
@@ -17,6 +17,7 @@
package androidx.camera.video.internal.compat.quirk;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.ArrayList;
@@ -25,6 +26,7 @@
/**
* Loads all video specific quirks required for the current device.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirksLoader {
private DeviceQuirksLoader() {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ExcludeKeyFrameRateInFindEncoderQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ExcludeKeyFrameRateInFindEncoderQuirk.java
index ae4c469..c9d008b 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ExcludeKeyFrameRateInFindEncoderQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ExcludeKeyFrameRateInFindEncoderQuirk.java
@@ -19,6 +19,7 @@
import android.media.MediaFormat;
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -31,6 +32,7 @@
* @see <a href="https://developer.android
* .com/reference/android/media/MediaCodec#creation">MediaCodec's creation</a>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class ExcludeKeyFrameRateInFindEncoderQuirk implements Quirk {
static boolean load() {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java
index ea803d9..699b3e5 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/MediaCodecInfoReportIncorrectInfoQuirk.java
@@ -23,6 +23,7 @@
import android.os.Build;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -41,6 +42,7 @@
* resolution 174x174 is probably incorrect for "video/mp4v-es" and doesn't make sense.
* See b/192431846#comment3.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class MediaCodecInfoReportIncorrectInfoQuirk implements Quirk {
private static final String BUILD_BRAND = "Nokia";
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/AudioEncoderConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/AudioEncoderConfig.java
index f615076..418678a 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/AudioEncoderConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/AudioEncoderConfig.java
@@ -20,10 +20,12 @@
import android.media.MediaFormat;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
/** {@inheritDoc} */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class AudioEncoderConfig implements EncoderConfig {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodeException.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodeException.java
index 4183749..a47b8ae 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodeException.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodeException.java
@@ -18,11 +18,13 @@
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
/** An exception thrown to indicate an error has occurred during encoding. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class EncodeException extends Exception {
/** Unknown error. */
public static final int ERROR_UNKNOWN = 0;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedData.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedData.java
index 37666c9..d4b5f02 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedData.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedData.java
@@ -19,6 +19,7 @@
import android.media.MediaCodec;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.common.util.concurrent.ListenableFuture;
@@ -32,6 +33,7 @@
*
* @see EncoderCallback#onEncodedData
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface EncodedData extends AutoCloseable {
/**
* Gets the {@link ByteBuffer} of the encoded data.
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedDataImpl.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedDataImpl.java
index 5624dce..7f24897 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedDataImpl.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncodedDataImpl.java
@@ -19,6 +19,7 @@
import android.media.MediaCodec;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.core.util.Preconditions;
@@ -30,6 +31,7 @@
import java.util.concurrent.atomic.AtomicReference;
/** {@inheritDoc} */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class EncodedDataImpl implements EncodedData {
private final MediaCodec mMediaCodec;
private final MediaCodec.BufferInfo mBufferInfo;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/Encoder.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/Encoder.java
index a5b5490..8f96f0d 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/Encoder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/Encoder.java
@@ -19,6 +19,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.video.internal.BufferProvider;
import java.util.concurrent.Executor;
@@ -29,6 +30,7 @@
* <p>An encoder could be either a video encoder or an audio encoder. The interface defines the
* common APIs to communicate with an encoder.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface Encoder {
/** Returns the encoder's input instance. */
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderCallback.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderCallback.java
index 630ce68..a5dbd26 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderCallback.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderCallback.java
@@ -17,10 +17,12 @@
package androidx.camera.video.internal.encoder;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* The encoder callback event.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface EncoderCallback {
/** The method called before the first encoded data. */
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java
index 20e5387..8c7436c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderConfig.java
@@ -19,12 +19,14 @@
import android.media.MediaFormat;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
/**
* The configuration represents the required parameters to configure an encoder.
*
* <p>An {@code EncoderConfig} is used to configure an {@link Encoder}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface EncoderConfig {
/**
* The mime type of the encoder.
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java
index fb873a7..f4307c4 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/EncoderImpl.java
@@ -74,6 +74,7 @@
*
* <p>An encoder could be either a video encoder or an audio encoder.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class EncoderImpl implements Encoder {
enum InternalState {
@@ -765,6 +766,7 @@
}
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class MediaCodecCallback extends MediaCodec.Callback {
@Nullable
private final CorrectVideoTimeByTimebase mCorrectVideoTimestamp;
@@ -1101,6 +1103,7 @@
}
@SuppressWarnings("WeakerAccess") /* synthetic accessor */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class SurfaceInput implements Encoder.SurfaceInput {
private final Object mLock = new Object();
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBuffer.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBuffer.java
index fba76c7..c78cc22 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBuffer.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBuffer.java
@@ -17,6 +17,7 @@
package androidx.camera.video.internal.encoder;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.common.util.concurrent.ListenableFuture;
@@ -29,6 +30,7 @@
* {@link #cancel} must be called to return the request to the encoder, otherwise, it will cause
* leakage or failure.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface InputBuffer {
/**
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBufferImpl.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBufferImpl.java
index 3f88d73..13b2c83 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBufferImpl.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InputBufferImpl.java
@@ -20,6 +20,7 @@
import androidx.annotation.IntRange;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.utils.futures.Futures;
import androidx.concurrent.futures.CallbackToFutureAdapter;
import androidx.concurrent.futures.CallbackToFutureAdapter.Completer;
@@ -31,6 +32,7 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class InputBufferImpl implements InputBuffer {
private final MediaCodec mMediaCodec;
private final int mBufferIndex;
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InvalidConfigException.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InvalidConfigException.java
index 2264d71..88b0cd0 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InvalidConfigException.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/InvalidConfigException.java
@@ -17,8 +17,10 @@
package androidx.camera.video.internal.encoder;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/** An exception thrown to indicate an error has occurred during configuring an encoder. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class InvalidConfigException extends Exception {
public InvalidConfigException(@Nullable String message) {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/OutputConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/OutputConfig.java
index c931eb0..ca241c8 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/OutputConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/OutputConfig.java
@@ -19,6 +19,7 @@
import android.media.MediaFormat;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
/**
* The output config of an encoder.
@@ -26,6 +27,7 @@
* <p>The output config will be the final configuration of an {@link Encoder} relative to the
* input config {@link EncoderConfig}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public interface OutputConfig {
/** Gets the media format. */
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/VideoEncoderConfig.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/VideoEncoderConfig.java
index ed838ca..cdcb3ba 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/VideoEncoderConfig.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/encoder/VideoEncoderConfig.java
@@ -20,10 +20,12 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
/** {@inheritDoc} */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@AutoValue
public abstract class VideoEncoderConfig implements EncoderConfig {
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/utils/OutputUtil.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/utils/OutputUtil.java
index 51cb127..f39e8ea 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/utils/OutputUtil.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/utils/OutputUtil.java
@@ -22,6 +22,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import java.io.File;
@@ -29,6 +30,7 @@
/**
* Utility class for output related operations.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class OutputUtil {
private static final String TAG = "OutputUtil";
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java
index 600506e..7578dd9 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/CorrectVideoTimeByTimebase.java
@@ -21,6 +21,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.video.internal.compat.quirk.CameraUseInconsistentTimebaseQuirk;
@@ -36,6 +37,7 @@
*
* @see CameraUseInconsistentTimebaseQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class CorrectVideoTimeByTimebase {
private static final String TAG = "CorrectVideoTimeByTimebase";
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java
index 2389542..a4cd073 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/workaround/EncoderFinder.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.video.internal.DebugUtils;
import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
import androidx.camera.video.internal.compat.quirk.ExcludeKeyFrameRateInFindEncoderQuirk;
@@ -39,6 +40,7 @@
* @see ExcludeKeyFrameRateInFindEncoderQuirk
* @see MediaCodecInfoReportIncorrectInfoQuirk
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class EncoderFinder {
private final boolean mShouldRemoveKeyFrameRate;
diff --git a/camera/camera-view/api/current.txt b/camera/camera-view/api/current.txt
index 4205f5b..847583ea 100644
--- a/camera/camera-view/api/current.txt
+++ b/camera/camera-view/api/current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.view {
- public abstract class CameraController {
+ @RequiresApi(21) public abstract class CameraController {
method @MainThread public void clearImageAnalysisAnalyzer();
method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
@@ -52,7 +52,7 @@
field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
}
- public static final class CameraController.OutputSize {
+ @RequiresApi(21) public static final class CameraController.OutputSize {
ctor public CameraController.OutputSize(int);
ctor public CameraController.OutputSize(android.util.Size);
method public int getAspectRatio();
@@ -60,13 +60,13 @@
field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
}
- public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+ @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
ctor public LifecycleCameraController(android.content.Context);
method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
method @MainThread public void unbind();
}
- public final class PreviewView extends android.widget.FrameLayout {
+ @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
ctor @UiThread public PreviewView(android.content.Context);
ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
@@ -85,12 +85,12 @@
method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
}
- public enum PreviewView.ImplementationMode {
+ @RequiresApi(21) public enum PreviewView.ImplementationMode {
enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
}
- public enum PreviewView.ScaleType {
+ @RequiresApi(21) public enum PreviewView.ScaleType {
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
@@ -104,7 +104,7 @@
enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
}
- public final class RotationProvider {
+ @RequiresApi(21) public final class RotationProvider {
ctor public RotationProvider(android.content.Context);
method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
method public void removeListener(androidx.camera.view.RotationProvider.Listener);
diff --git a/camera/camera-view/api/public_plus_experimental_current.txt b/camera/camera-view/api/public_plus_experimental_current.txt
index f741896..51c1a93 100644
--- a/camera/camera-view/api/public_plus_experimental_current.txt
+++ b/camera/camera-view/api/public_plus_experimental_current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.view {
- public abstract class CameraController {
+ @RequiresApi(21) public abstract class CameraController {
method @MainThread public void clearImageAnalysisAnalyzer();
method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
@@ -59,7 +59,7 @@
field @androidx.camera.view.video.ExperimentalVideo public static final int VIDEO_CAPTURE = 4; // 0x4
}
- public static final class CameraController.OutputSize {
+ @RequiresApi(21) public static final class CameraController.OutputSize {
ctor public CameraController.OutputSize(int);
ctor public CameraController.OutputSize(android.util.Size);
method public int getAspectRatio();
@@ -67,13 +67,13 @@
field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
}
- public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+ @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
ctor public LifecycleCameraController(android.content.Context);
method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
method @MainThread public void unbind();
}
- public final class PreviewView extends android.widget.FrameLayout {
+ @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
ctor @UiThread public PreviewView(android.content.Context);
ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
@@ -93,12 +93,12 @@
method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
}
- public enum PreviewView.ImplementationMode {
+ @RequiresApi(21) public enum PreviewView.ImplementationMode {
enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
}
- public enum PreviewView.ScaleType {
+ @RequiresApi(21) public enum PreviewView.ScaleType {
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
@@ -112,7 +112,7 @@
enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
}
- public final class RotationProvider {
+ @RequiresApi(21) public final class RotationProvider {
ctor public RotationProvider(android.content.Context);
method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
method public void removeListener(androidx.camera.view.RotationProvider.Listener);
@@ -126,7 +126,7 @@
package androidx.camera.view.transform {
- public final class CoordinateTransform {
+ @RequiresApi(21) public final class CoordinateTransform {
ctor public CoordinateTransform(androidx.camera.view.transform.OutputTransform, androidx.camera.view.transform.OutputTransform);
method public void mapPoint(android.graphics.PointF);
method public void mapPoints(float[]);
@@ -134,7 +134,7 @@
method public void transform(android.graphics.Matrix);
}
- public final class FileTransformFactory {
+ @RequiresApi(21) public final class FileTransformFactory {
ctor public FileTransformFactory();
method public androidx.camera.view.transform.OutputTransform getOutputTransform(android.content.ContentResolver, android.net.Uri) throws java.io.IOException;
method public androidx.camera.view.transform.OutputTransform getOutputTransform(java.io.File) throws java.io.IOException;
@@ -143,7 +143,7 @@
method public void setUsingExifOrientation(boolean);
}
- public final class ImageProxyTransformFactory {
+ @RequiresApi(21) public final class ImageProxyTransformFactory {
ctor public ImageProxyTransformFactory();
method public androidx.camera.view.transform.OutputTransform getOutputTransform(androidx.camera.core.ImageProxy);
method public boolean isUsingCropRect();
@@ -152,7 +152,7 @@
method public void setUsingRotationDegrees(boolean);
}
- public final class OutputTransform {
+ @RequiresApi(21) public final class OutputTransform {
}
}
@@ -162,7 +162,7 @@
@RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalVideo {
}
- @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class Metadata {
+ @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class Metadata {
method public static androidx.camera.view.video.Metadata.Builder builder();
method public abstract android.location.Location? getLocation();
}
@@ -172,7 +172,7 @@
method public abstract androidx.camera.view.video.Metadata.Builder setLocation(android.location.Location?);
}
- @androidx.camera.view.video.ExperimentalVideo public interface OnVideoSavedCallback {
+ @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo public interface OnVideoSavedCallback {
method public void onError(int, String, Throwable?);
method public void onVideoSaved(androidx.camera.view.video.OutputFileResults);
field public static final int ERROR_ENCODER = 1; // 0x1
@@ -183,7 +183,7 @@
field public static final int ERROR_UNKNOWN = 0; // 0x0
}
- @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileOptions {
+ @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileOptions {
method public static androidx.camera.view.video.OutputFileOptions.Builder builder(java.io.File);
method public static androidx.camera.view.video.OutputFileOptions.Builder builder(android.os.ParcelFileDescriptor);
method public static androidx.camera.view.video.OutputFileOptions.Builder builder(android.content.ContentResolver, android.net.Uri, android.content.ContentValues);
@@ -195,7 +195,7 @@
method public abstract androidx.camera.view.video.OutputFileOptions.Builder setMetadata(androidx.camera.view.video.Metadata);
}
- @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileResults {
+ @RequiresApi(21) @androidx.camera.view.video.ExperimentalVideo @com.google.auto.value.AutoValue public abstract class OutputFileResults {
method public abstract android.net.Uri? getSavedUri();
}
diff --git a/camera/camera-view/api/restricted_current.txt b/camera/camera-view/api/restricted_current.txt
index de3dc58..8a2fa5e 100644
--- a/camera/camera-view/api/restricted_current.txt
+++ b/camera/camera-view/api/restricted_current.txt
@@ -1,7 +1,7 @@
// Signature format: 4.0
package androidx.camera.view {
- public abstract class CameraController {
+ @RequiresApi(21) public abstract class CameraController {
method @MainThread public void clearImageAnalysisAnalyzer();
method @MainThread public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enableTorch(boolean);
method @MainThread public androidx.camera.core.CameraControl? getCameraControl();
@@ -52,7 +52,7 @@
field public static final int TAP_TO_FOCUS_STARTED = 1; // 0x1
}
- public static final class CameraController.OutputSize {
+ @RequiresApi(21) public static final class CameraController.OutputSize {
ctor public CameraController.OutputSize(@androidx.camera.core.AspectRatio.Ratio int);
ctor public CameraController.OutputSize(android.util.Size);
method public int getAspectRatio();
@@ -60,13 +60,13 @@
field public static final int UNASSIGNED_ASPECT_RATIO = -1; // 0xffffffff
}
- public final class LifecycleCameraController extends androidx.camera.view.CameraController {
+ @RequiresApi(21) public final class LifecycleCameraController extends androidx.camera.view.CameraController {
ctor public LifecycleCameraController(android.content.Context);
method @MainThread public void bindToLifecycle(androidx.lifecycle.LifecycleOwner);
method @MainThread public void unbind();
}
- public final class PreviewView extends android.widget.FrameLayout {
+ @RequiresApi(21) public final class PreviewView extends android.widget.FrameLayout {
ctor @UiThread public PreviewView(android.content.Context);
ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?);
ctor @UiThread public PreviewView(android.content.Context, android.util.AttributeSet?, int);
@@ -85,12 +85,12 @@
method @UiThread public void setScaleType(androidx.camera.view.PreviewView.ScaleType);
}
- public enum PreviewView.ImplementationMode {
+ @RequiresApi(21) public enum PreviewView.ImplementationMode {
enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode COMPATIBLE;
enum_constant public static final androidx.camera.view.PreviewView.ImplementationMode PERFORMANCE;
}
- public enum PreviewView.ScaleType {
+ @RequiresApi(21) public enum PreviewView.ScaleType {
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_CENTER;
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_END;
enum_constant public static final androidx.camera.view.PreviewView.ScaleType FILL_START;
@@ -104,7 +104,7 @@
enum_constant public static final androidx.camera.view.PreviewView.StreamState STREAMING;
}
- public final class RotationProvider {
+ @RequiresApi(21) public final class RotationProvider {
ctor public RotationProvider(android.content.Context);
method @CheckResult public boolean addListener(java.util.concurrent.Executor, androidx.camera.view.RotationProvider.Listener);
method public void removeListener(androidx.camera.view.RotationProvider.Listener);
diff --git a/camera/camera-view/build.gradle b/camera/camera-view/build.gradle
index 43e55a9..c229b66 100644
--- a/camera/camera-view/build.gradle
+++ b/camera/camera-view/build.gradle
@@ -61,6 +61,7 @@
// override pinned dependency.
exclude(group:"androidx.camera", module:"camera-core")
}
+ androidTestImplementation(libs.multidex)
androidTestImplementation(libs.mockitoCore)
androidTestImplementation(libs.espressoCore)
androidTestImplementation(libs.testExtJunit)
@@ -76,8 +77,9 @@
}
android {
defaultConfig {
- minSdkVersion 21
+ multiDexEnabled = true
}
+
testOptions.unitTests.includeAndroidResources = true
}
androidx {
diff --git a/camera/camera-view/lint.xml b/camera/camera-view/lint.xml
new file mode 100644
index 0000000..0843ecf
--- /dev/null
+++ b/camera/camera-view/lint.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<lint>
+ <!-- Disable NewApi lint check temporarily for unit tests.
+ This file can be removed once b/200599470 is resolved. -->
+ <issue id="NewApi">
+ <ignore path="src/test/**" />
+ </issue>
+</lint>
\ No newline at end of file
diff --git a/camera/camera-view/src/androidTest/AndroidManifest.xml b/camera/camera-view/src/androidTest/AndroidManifest.xml
index 2dd2c7c..fdee0d6 100644
--- a/camera/camera-view/src/androidTest/AndroidManifest.xml
+++ b/camera/camera-view/src/androidTest/AndroidManifest.xml
@@ -14,7 +14,9 @@
limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
package="androidx.camera.camera2.view">
+ <uses-sdk tools:overrideLibrary="android_libs.ub_uiautomator" />
<application>
<activity
android:name="androidx.camera.testing.fakes.FakeActivity"
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
index 92ad85c..94d3653 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
@@ -29,6 +29,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -45,6 +46,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
class CameraControllerDeviceTest {
@get:Rule
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
index 1d086ff..2d2c8b8 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewBitmapTest.java
@@ -38,6 +38,7 @@
import androidx.test.ext.junit.rules.ActivityScenarioRule;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.After;
@@ -56,6 +57,7 @@
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class PreviewViewBitmapTest {
@Rule
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
index 20b613f..d11f8ac 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewDeviceTest.java
@@ -72,6 +72,7 @@
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.platform.app.InstrumentationRegistry;
import androidx.test.uiautomator.UiDevice;
import androidx.test.uiautomator.UiObjectNotFoundException;
@@ -101,6 +102,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class PreviewViewDeviceTest {
private static final Size DEFAULT_SURFACE_SIZE = new Size(640, 480);
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt
index ef4277f..15c5592 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewMeteringPointFactoryDeviceTest.kt
@@ -21,6 +21,7 @@
import android.util.LayoutDirection
import android.util.Size
import androidx.camera.core.SurfaceRequest
+import androidx.test.filters.SdkSuppress
import androidx.test.filters.SmallTest
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
@@ -33,6 +34,7 @@
*/
@SmallTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
public class PreviewViewMeteringPointFactoryDeviceTest(
private val cropRect: Rect,
private val rotationDegrees: Int,
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
index 62990f0..32aa646 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/PreviewViewStreamStateTest.kt
@@ -32,6 +32,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.rules.ActivityScenarioRule
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -48,6 +49,7 @@
@LargeTest
@RunWith(Parameterized::class)
+@SdkSuppress(minSdkVersion = 21)
public class PreviewViewStreamStateTest(private val implMode: PreviewView.ImplementationMode) {
public companion object {
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt
index cc960aa..dae087f 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/SurfaceViewImplementationTest.kt
@@ -28,6 +28,7 @@
import androidx.test.core.app.ApplicationProvider
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import org.junit.After
@@ -39,6 +40,7 @@
@MediumTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class SurfaceViewImplementationTest {
public companion object {
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
index 961cab6..b570347 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/TextureViewImplementationTest.java
@@ -33,6 +33,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import androidx.test.filters.MediumTest;
+import androidx.test.filters.SdkSuppress;
import androidx.test.filters.SmallTest;
import androidx.test.platform.app.InstrumentationRegistry;
@@ -49,6 +50,7 @@
@SmallTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class TextureViewImplementationTest {
private static final int ANY_WIDTH = 1600;
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java b/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java
index 4b327c1..6c226c8 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/TransformUtilsDeviceTest.java
@@ -24,6 +24,7 @@
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
+import androidx.test.filters.SdkSuppress;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -33,6 +34,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4.class)
+@SdkSuppress(minSdkVersion = 21)
public class TransformUtilsDeviceTest {
@Test
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt
index 419cc54..5e77dcf 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/transform/FileTransformFactoryDeviceTest.kt
@@ -27,6 +27,7 @@
import androidx.test.core.app.ApplicationProvider.getApplicationContext
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
import androidx.test.rule.GrantPermissionRule
import com.google.common.truth.Truth.assertThat
import org.junit.Before
@@ -45,6 +46,7 @@
*/
@LargeTest
@RunWith(AndroidJUnit4::class)
+@SdkSuppress(minSdkVersion = 21)
public class FileTransformFactoryDeviceTest {
private lateinit var factory: FileTransformFactory
diff --git a/camera/camera-view/src/main/AndroidManifest.xml b/camera/camera-view/src/main/AndroidManifest.xml
index f99ccda..1438da56 100644
--- a/camera/camera-view/src/main/AndroidManifest.xml
+++ b/camera/camera-view/src/main/AndroidManifest.xml
@@ -13,4 +13,13 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest package="androidx.camera.view"/>
+<manifest package="androidx.camera.view"
+ xmlns:tools="http://schemas.android.com/tools">
+
+ <!-- TODO(b/201134896): Remove once camera-view joins same-version group -->
+ <uses-sdk
+ tools:overrideLibrary="
+ androidx.camera.camera2,
+ androidx.camera.core,
+ androidx.camera.lifecycle" />
+</manifest>
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
index 7525f8a..9f8dcdc 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/CameraController.java
@@ -104,6 +104,7 @@
* {@link UseCase}s freezes the preview for a short period of time. To avoid the glitch, the
* {@link UseCase}s need to be enabled/disabled before the controller is set on {@link PreviewView}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public abstract class CameraController {
private static final String TAG = "CameraController";
@@ -1747,6 +1748,7 @@
* @see #setImageCaptureTargetSize(OutputSize)
* @see #setVideoCaptureTargetSize(OutputSize)
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public static final class OutputSize {
/**
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/FlashModeConverter.java b/camera/camera-view/src/main/java/androidx/camera/view/FlashModeConverter.java
index 22f6f9c..c272505 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/FlashModeConverter.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/FlashModeConverter.java
@@ -22,11 +22,13 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageCapture.FlashMode;
/**
* Helper class that defines certain enum-like methods for {@link FlashMode}
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class FlashModeConverter {
private FlashModeConverter() {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/ForwardingLiveData.java b/camera/camera-view/src/main/java/androidx/camera/view/ForwardingLiveData.java
index 7e029a7..a25a84b 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/ForwardingLiveData.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/ForwardingLiveData.java
@@ -17,6 +17,7 @@
package androidx.camera.view;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MediatorLiveData;
@@ -28,6 +29,7 @@
*
* <p> Setting a new source will remove the previous source.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class ForwardingLiveData<T> extends MediatorLiveData<T> {
private LiveData<T> mLiveDataSource;
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java b/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java
index eb35844..5e1673e 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/LifecycleCameraController.java
@@ -26,6 +26,7 @@
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RequiresPermission;
import androidx.annotation.RestrictTo;
import androidx.camera.core.Camera;
@@ -58,6 +59,7 @@
* controller.setZoomRatio(.5F);
* </code></pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class LifecycleCameraController extends CameraController {
private static final String TAG = "CamLifecycleController";
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewStreamStateObserver.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewStreamStateObserver.java
index 10c9bf8..87ac49f 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewStreamStateObserver.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewStreamStateObserver.java
@@ -20,6 +20,7 @@
import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.CameraInfo;
import androidx.camera.core.Logger;
import androidx.camera.core.impl.CameraCaptureCallback;
@@ -53,6 +54,7 @@
* {@link CameraInternal#getCameraState()} and the observer should be registered to run on main
* thread.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class PreviewStreamStateObserver implements Observable.Observer<CameraInternal.State> {
private static final String TAG = "StreamStateObserver";
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java
index 80dcf5c..e587fd9 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewTransformation.java
@@ -46,6 +46,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.core.Logger;
import androidx.camera.core.SurfaceRequest;
@@ -93,6 +94,7 @@
* <p> The transformed Surface is how the PreviewView's inner view should behave, to make the
* crop rect matches the PreviewView.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class PreviewTransformation {
private static final String TAG = "PreviewTransform";
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index f0a06f1..a207732 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -44,6 +44,7 @@
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.UiThread;
import androidx.annotation.VisibleForTesting;
import androidx.camera.core.CameraControl;
@@ -94,6 +95,7 @@
* {@link View} visible, or initially hiding the {@link View} by setting its
* {@linkplain View#setAlpha(float) opacity} to 0, then setting it to 1.0F to show it.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class PreviewView extends FrameLayout {
private static final String TAG = "PreviewView";
@@ -625,6 +627,7 @@
* {@link PreviewView} to decide what is the best internal implementation given the device
* capabilities and user configurations.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public enum ImplementationMode {
/**
@@ -680,6 +683,7 @@
}
/** Options for scaling the preview vis-à-vis its container {@link PreviewView}. */
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public enum ScaleType {
/**
* Scale the preview, maintaining the source aspect ratio, so it fills the entire
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewImplementation.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewImplementation.java
index 1100c4d..6820e33 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewImplementation.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewImplementation.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.SurfaceRequest;
import com.google.common.util.concurrent.ListenableFuture;
@@ -32,6 +33,7 @@
* done using either a {@link android.view.TextureView} (see {@link TextureViewImplementation})
* or a {@link android.view.SurfaceView} (see {@link SurfaceViewImplementation}).
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
abstract class PreviewViewImplementation {
@Nullable
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewMeteringPointFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewMeteringPointFactory.java
index 80fe4e4..7bd4c06 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewMeteringPointFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewViewMeteringPointFactory.java
@@ -24,6 +24,7 @@
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.UiThread;
import androidx.camera.core.MeteringPointFactory;
@@ -34,6 +35,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
class PreviewViewMeteringPointFactory extends MeteringPointFactory {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/RotationProvider.java b/camera/camera-view/src/main/java/androidx/camera/view/RotationProvider.java
index 94f5464..d0a7b95 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/RotationProvider.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/RotationProvider.java
@@ -25,6 +25,7 @@
import androidx.annotation.CheckResult;
import androidx.annotation.GuardedBy;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.VisibleForTesting;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.ImageOutputConfig;
@@ -58,6 +59,7 @@
* mRotationProvider.clearListener();
* </code></pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public final class RotationProvider {
final Object mLock = new Object();
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/SurfaceViewImplementation.java b/camera/camera-view/src/main/java/androidx/camera/view/SurfaceViewImplementation.java
index a69aa22..bd424ef 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/SurfaceViewImplementation.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/SurfaceViewImplementation.java
@@ -42,6 +42,7 @@
/**
* The SurfaceView implementation for {@link PreviewView}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class SurfaceViewImplementation extends PreviewViewImplementation {
private static final String TAG = "SurfaceViewImpl";
@@ -147,6 +148,7 @@
* <p> SurfaceView creates Surface on its own before we can do anything. This class makes
* sure only the Surface with correct size will be returned to Preview.
*/
+ @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
class SurfaceRequestCallback implements SurfaceHolder.Callback {
// Target Surface size. Only complete the SurfaceRequest when the size of the Surface
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/TextureViewImplementation.java b/camera/camera-view/src/main/java/androidx/camera/view/TextureViewImplementation.java
index 6d19e49..be200e2 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/TextureViewImplementation.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/TextureViewImplementation.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.Logger;
import androidx.camera.core.SurfaceRequest;
import androidx.camera.core.impl.utils.executor.CameraXExecutors;
@@ -43,6 +44,7 @@
/**
* The {@link TextureView} implementation for {@link PreviewView}
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
final class TextureViewImplementation extends PreviewViewImplementation {
private static final String TAG = "TextureViewImpl";
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java b/camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java
index 0849415..1552825 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/TransformUtils.java
@@ -24,6 +24,7 @@
import android.view.Surface;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
/**
@@ -38,6 +39,7 @@
*
* @hide
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class TransformUtils {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirks.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirks.java
index 3ae984d..5f36e8a 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirks.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirks.java
@@ -18,6 +18,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import androidx.camera.core.impl.Quirks;
@@ -31,6 +32,7 @@
* <p>
* Device specific quirks are lazily loaded, i.e. They are loaded the first time they're needed.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirks {
@NonNull
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirksLoader.java
index 00641c7..f4cfba3 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/DeviceQuirksLoader.java
@@ -17,6 +17,7 @@
package androidx.camera.view.internal.compat.quirk;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
import java.util.ArrayList;
@@ -25,6 +26,7 @@
/**
* Loads all device specific quirks required for the current device
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class DeviceQuirksLoader {
private DeviceQuirksLoader() {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/PreviewOneThirdWiderQuirk.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/PreviewOneThirdWiderQuirk.java
index 316e4db..fb8efa1d 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/PreviewOneThirdWiderQuirk.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/PreviewOneThirdWiderQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -27,6 +28,7 @@
* preview Surface is 800x600, it's actually has a FOV of 1066x600 with the same center point,
* but squeezed to fit the 800x600 buffer.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class PreviewOneThirdWiderQuirk implements Quirk {
private static final String SAMSUNG_A3_2017 = "A3Y17LTE"; // b/180121821
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/SurfaceViewStretchedQuirk.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/SurfaceViewStretchedQuirk.java
index 46b49f5..3716c7c 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/SurfaceViewStretchedQuirk.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/SurfaceViewStretchedQuirk.java
@@ -18,6 +18,7 @@
import android.os.Build;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -26,6 +27,7 @@
* <p> On Samsung Galaxy Z Fold2, transform APIs (e.g. View#setScaleX) do not work as intended.
* b/129403806
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class SurfaceViewStretchedQuirk implements Quirk {
// Samsung Galaxy Z Fold2 b/129403806
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/TextureViewRotationQuirk.java b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/TextureViewRotationQuirk.java
index d7e1880..67f8de4 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/TextureViewRotationQuirk.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/internal/compat/quirk/TextureViewRotationQuirk.java
@@ -19,6 +19,7 @@
import android.os.Build;
import android.view.TextureView;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.impl.Quirk;
/**
@@ -27,6 +28,7 @@
* <p> On certain devices, the rotation of the output is incorrect. One example is b/177561470.
* In which case, the extra rotation is needed to correct the output on {@link TextureView}.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
public class TextureViewRotationQuirk implements Quirk {
private static final String FAIRPHONE = "Fairphone";
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
index 2410885..0cb9663 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/CoordinateTransform.java
@@ -23,6 +23,7 @@
import android.graphics.RectF;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.Logger;
import androidx.camera.core.UseCase;
@@ -56,6 +57,7 @@
*
* </code></pre>
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@TransformExperimental
public final class CoordinateTransform {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
index 5f6a5d7..2ddacc7 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/FileTransformFactory.java
@@ -29,6 +29,7 @@
import android.net.Uri;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.UseCase;
import androidx.camera.core.impl.utils.Exif;
@@ -50,6 +51,7 @@
* @see OutputTransform
* @see CoordinateTransform
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@TransformExperimental
public final class FileTransformFactory {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
index ae331ae..70fd950 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/ImageProxyTransformFactory.java
@@ -25,6 +25,7 @@
import android.graphics.RectF;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.camera.core.ImageAnalysis;
import androidx.camera.core.ImageCapture;
import androidx.camera.core.ImageInfo;
@@ -43,6 +44,7 @@
* @see OutputTransform
* @see CoordinateTransform
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@TransformExperimental
public final class ImageProxyTransformFactory {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java b/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java
index 5df172e..9b14a49 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/transform/OutputTransform.java
@@ -20,6 +20,7 @@
import android.util.Size;
import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.UseCase;
import androidx.camera.core.UseCaseGroup;
@@ -31,6 +32,7 @@
* <p> Represents the rotation, cropping and/or mirroring applied to the raw buffer of a
* {@link UseCase} output.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@TransformExperimental
public final class OutputTransform {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/video/Metadata.java b/camera/camera-view/src/main/java/androidx/camera/view/video/Metadata.java
index d637266..121a020 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/video/Metadata.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/video/Metadata.java
@@ -20,10 +20,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import com.google.auto.value.AutoValue;
/** Holder class for metadata that should be saved alongside captured video. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@ExperimentalVideo
@AutoValue
public abstract class Metadata {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/video/OnVideoSavedCallback.java b/camera/camera-view/src/main/java/androidx/camera/view/video/OnVideoSavedCallback.java
index 5403c08..7e8e729 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/video/OnVideoSavedCallback.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/video/OnVideoSavedCallback.java
@@ -19,6 +19,7 @@
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.VideoCapture;
@@ -26,6 +27,7 @@
import java.lang.annotation.RetentionPolicy;
/** Listener containing callbacks for video file I/O events. */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@ExperimentalVideo
public interface OnVideoSavedCallback {
/**
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileOptions.java b/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileOptions.java
index 2bb9669..1b30cf8 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileOptions.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileOptions.java
@@ -27,6 +27,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.camera.core.VideoCapture;
import androidx.core.util.Preconditions;
@@ -42,6 +43,7 @@
* either a {@link File}, {@link MediaStore}. The metadata will be
* stored with the saved video.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@ExperimentalVideo
@AutoValue
public abstract class OutputFileOptions {
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileResults.java b/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileResults.java
index a18dfc6..d9a64a0 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileResults.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/video/OutputFileResults.java
@@ -23,6 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
+import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import com.google.auto.value.AutoValue;
@@ -30,6 +31,7 @@
/**
* Info about the saved video file.
*/
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
@ExperimentalVideo
@AutoValue
public abstract class OutputFileResults {
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 e29d4a5..c29d31d 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
@@ -25,7 +25,7 @@
import static androidx.camera.video.QualitySelector.QUALITY_SD;
import static androidx.camera.video.QualitySelector.QUALITY_UHD;
import static androidx.camera.video.VideoRecordEvent.Finalize.ERROR_FILE_SIZE_LIMIT_REACHED;
-import static androidx.camera.video.VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_DISK;
+import static androidx.camera.video.VideoRecordEvent.Finalize.ERROR_INSUFFICIENT_STORAGE;
import static androidx.camera.video.VideoRecordEvent.Finalize.ERROR_NONE;
import static androidx.camera.video.VideoRecordEvent.Finalize.ERROR_SOURCE_INACTIVE;
@@ -483,7 +483,7 @@
switch (finalize.getError()) {
case ERROR_NONE:
case ERROR_FILE_SIZE_LIMIT_REACHED:
- case ERROR_INSUFFICIENT_DISK:
+ case ERROR_INSUFFICIENT_STORAGE:
case ERROR_SOURCE_INACTIVE:
Uri uri = finalize.getOutputResults().getOutputUri();
OutputOptions outputOptions = finalize.getOutputOptions();
diff --git a/camera/integration-tests/extensionstestapp/build.gradle b/camera/integration-tests/extensionstestapp/build.gradle
index a379c83..5ee99c03 100644
--- a/camera/integration-tests/extensionstestapp/build.gradle
+++ b/camera/integration-tests/extensionstestapp/build.gradle
@@ -27,6 +27,13 @@
versionCode 1
multiDexEnabled true
}
+
+ buildTypes.all {
+ minifyEnabled true
+ shrinkResources true
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ testProguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+ }
}
dependencies {
diff --git a/camera/integration-tests/extensionstestapp/proguard-rules.pro b/camera/integration-tests/extensionstestapp/proguard-rules.pro
new file mode 100644
index 0000000..8f6c13c
--- /dev/null
+++ b/camera/integration-tests/extensionstestapp/proguard-rules.pro
@@ -0,0 +1,14 @@
+-keep class androidx.test.** {*;}
+-keep class androidx.camera.testing.** {*;}
+-keep class androidx.camera.integration.extensions.CameraExtensionsActivity {*;}
+
+-keepclassmembers class androidx.camera.lifecycle.ProcessCameraProvider {
+ ** shutdown();
+}
+
+-keepclassmembers class androidx.camera.extensions.ExtensionsManager {
+ ** shutdown();
+}
+
+-keep class org.junit.** {*;}
+-keep class org.hamcrest.** {*;}
diff --git a/camera/integration-tests/uiwidgetstestapp/build.gradle b/camera/integration-tests/uiwidgetstestapp/build.gradle
index 87e0f3a..68b28a6 100644
--- a/camera/integration-tests/uiwidgetstestapp/build.gradle
+++ b/camera/integration-tests/uiwidgetstestapp/build.gradle
@@ -58,6 +58,10 @@
implementation("androidx.appcompat:appcompat:1.2.0")
implementation("androidx.activity:activity-ktx:1.2.0")
implementation("androidx.viewpager2:viewpager2:1.1.0-alpha01")
+ implementation("androidx.concurrent:concurrent-futures-ktx:1.1.0")
+ implementation "androidx.window:window:1.0.0-beta02"
+ implementation "androidx.window:window-java:1.0.0-beta02"
+ implementation(libs.constraintLayout)
// Guava
implementation(libs.guavaAndroid)
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml b/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml
index d0ccb19..17bb354 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/AndroidManifest.xml
@@ -56,6 +56,10 @@
android:configChanges="orientation|screenSize"
android:label="Rotation - ConfigChanges overridden" />
+ <activity
+ android:exported="false"
+ android:name=".foldable.FoldableCameraActivity"
+ android:label="Foldable Test" />
</application>
<uses-permission android:name="android.permission.CAMERA" />
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/MainActivity.kt b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/MainActivity.kt
index 04b07ad..d933958 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/MainActivity.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/MainActivity.kt
@@ -20,6 +20,7 @@
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.camera.integration.uiwidgets.databinding.ActivityMainBinding
+import androidx.camera.integration.uiwidgets.foldable.FoldableCameraActivity
import androidx.camera.integration.uiwidgets.rotations.LockedOrientationActivity
import androidx.camera.integration.uiwidgets.rotations.OrientationConfigChangesOverriddenActivity
import androidx.camera.integration.uiwidgets.rotations.UnlockedOrientationActivity
@@ -49,6 +50,9 @@
binding.viewpager2.setOnClickListener {
launch(ViewPager2Activity::class.java)
}
+ binding.foldable.setOnClickListener {
+ launch(FoldableCameraActivity::class.java)
+ }
}
private fun <A : AppCompatActivity> launch(activityClass: Class<A>) {
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/foldable/FoldableCameraActivity.kt b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/foldable/FoldableCameraActivity.kt
new file mode 100644
index 0000000..65b7f42
--- /dev/null
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/java/androidx/camera/integration/uiwidgets/foldable/FoldableCameraActivity.kt
@@ -0,0 +1,511 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.camera.integration.uiwidgets.foldable
+
+import android.Manifest
+import android.content.ContentValues
+import android.content.Context
+import android.content.pm.PackageManager
+import android.graphics.Point
+import android.graphics.Rect
+import android.hardware.camera2.CameraCharacteristics
+import android.hardware.camera2.CameraManager
+import android.hardware.display.DisplayManager
+import android.os.Build
+import android.os.Bundle
+import android.provider.MediaStore
+import android.util.Log
+import android.view.Display
+import android.view.GestureDetector
+import android.view.GestureDetector.SimpleOnGestureListener
+import android.view.Menu
+import android.view.MenuItem
+import android.view.MotionEvent
+import android.view.ScaleGestureDetector
+import android.view.ScaleGestureDetector.SimpleOnScaleGestureListener
+import android.view.Surface
+import android.view.View
+import android.view.ViewGroup.LayoutParams.MATCH_PARENT
+import android.widget.Toast
+import androidx.annotation.OptIn
+import androidx.appcompat.app.AppCompatActivity
+import androidx.appcompat.widget.PopupMenu
+import androidx.camera.camera2.interop.Camera2CameraInfo
+import androidx.camera.camera2.interop.ExperimentalCamera2Interop
+import androidx.camera.core.Camera
+import androidx.camera.core.CameraInfo
+import androidx.camera.core.CameraSelector
+import androidx.camera.core.FocusMeteringAction
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCaptureException
+import androidx.camera.core.MeteringPointFactory
+import androidx.camera.core.Preview
+import androidx.camera.integration.uiwidgets.R
+import androidx.camera.integration.uiwidgets.databinding.ActivityFoldableCameraBinding
+import androidx.camera.integration.uiwidgets.rotations.CameraActivity
+import androidx.camera.lifecycle.ProcessCameraProvider
+import androidx.camera.view.PreviewView
+import androidx.concurrent.futures.await
+import androidx.core.app.ActivityCompat
+import androidx.core.content.ContextCompat
+import androidx.lifecycle.lifecycleScope
+import androidx.window.layout.DisplayFeature
+import androidx.window.layout.FoldingFeature
+import androidx.window.layout.WindowInfoRepository
+import androidx.window.layout.WindowInfoRepository.Companion.windowInfoRepository
+import androidx.window.layout.WindowLayoutInfo
+import androidx.window.layout.WindowMetrics
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+
+class FoldableCameraActivity : AppCompatActivity() {
+ companion object {
+ private const val TAG = "FoldableCameraActivity"
+ private const val REQUEST_CODE_PERMISSIONS = 20
+ private const val KEY_CAMERA_SELECTOR = "CameraSelectorStr"
+ private const val KEY_SCALETYPE = "ScaleType"
+ private const val BACK_CAMERA_STR = "Back camera"
+ private const val FRONT_CAMERA_STR = "Front camera"
+ val PERMISSIONS =
+ arrayOf(Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ }
+
+ private lateinit var binding: ActivityFoldableCameraBinding
+ private lateinit var windowInfoRepository: WindowInfoRepository
+ private lateinit var imageCapture: ImageCapture
+ private lateinit var camera: Camera
+ private lateinit var cameraProvider: ProcessCameraProvider
+ private var currentCameraSelectorString = BACK_CAMERA_STR
+ private var currentCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
+ private var isPreviewInLeftTop = true
+ private var activeWindowLayoutInfo: WindowLayoutInfo? = null
+ private var lastWindowMetrics: WindowMetrics? = null
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ binding = ActivityFoldableCameraBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ savedInstanceState?.let {
+ currentCameraSelectorString = it.getString(KEY_CAMERA_SELECTOR) ?: BACK_CAMERA_STR
+ currentCameraSelector = getCameraSelectorFromString(currentCameraSelectorString)
+ binding.previewView.scaleType =
+ PreviewView.ScaleType.valueOf(it.getString(KEY_SCALETYPE)!!)
+ }
+ windowInfoRepository = windowInfoRepository()
+
+ if (shouldRequestPermissionsAtRuntime() && !hasPermissions()) {
+ ActivityCompat.requestPermissions(this, PERMISSIONS, REQUEST_CODE_PERMISSIONS)
+ } else {
+ startCamera()
+ }
+ }
+
+ override fun onSaveInstanceState(outState: Bundle) {
+ super.onSaveInstanceState(outState)
+ outState.putString(KEY_CAMERA_SELECTOR, currentCameraSelectorString)
+ outState.putString(KEY_SCALETYPE, binding.previewView.scaleType.toString())
+ }
+
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array<out String>,
+ grantResults: IntArray
+ ) {
+ super.onRequestPermissionsResult(requestCode, permissions, grantResults)
+ if (requestCode == REQUEST_CODE_PERMISSIONS) {
+ if (hasPermissions()) {
+ startCamera()
+ } else {
+ Log.d(TAG, "Camera permission is required")
+ finish()
+ }
+ }
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ menuInflater.inflate(R.menu.foldable_menu, menu)
+ return super.onCreateOptionsMenu(menu)
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ when (item.itemId) {
+ R.id.fitCenter -> binding.previewView.scaleType = PreviewView.ScaleType.FIT_CENTER
+ R.id.fillCenter -> binding.previewView.scaleType = PreviewView.ScaleType.FILL_CENTER
+ R.id.fitStart -> binding.previewView.scaleType = PreviewView.ScaleType.FIT_START
+ R.id.fitEnd -> binding.previewView.scaleType = PreviewView.ScaleType.FIT_END
+ }
+ return super.onOptionsItemSelected(item)
+ }
+
+ private fun startCamera() {
+ lifecycleScope.launch {
+ showCamerasAndDisplayInfo()
+ cameraProvider =
+ ProcessCameraProvider.getInstance(this@FoldableCameraActivity).await()
+ bindUseCases(cameraProvider)
+ setupUI()
+ }
+
+ // Runs Flow.collect in separate coroutine because it will block the coroutine.
+ lifecycleScope.launch {
+ windowInfoRepository.currentWindowMetrics.collect {
+ Log.d(TAG, "currentWindowMetrics: ${it.bounds}")
+ lastWindowMetrics = it
+ showCamerasAndDisplayInfo()
+ }
+ }
+
+ // Runs Flow.collect in separate coroutine because it will block the coroutine.
+ lifecycleScope.launch {
+ windowInfoRepository.windowLayoutInfo.collect { newLayoutInfo ->
+ Log.d(TAG, "newLayoutInfo: $newLayoutInfo")
+ activeWindowLayoutInfo = newLayoutInfo
+ adjustPreviewByFoldingState()
+ }
+ }
+ }
+
+ @OptIn(ExperimentalCamera2Interop::class)
+ private fun bindUseCases(cameraProvider: ProcessCameraProvider) {
+ val preview = Preview.Builder()
+ .build()
+ .apply {
+ setSurfaceProvider(binding.previewView.surfaceProvider)
+ }
+
+ imageCapture = ImageCapture.Builder()
+ .build()
+
+ camera = cameraProvider.bindToLifecycle(
+ this,
+ currentCameraSelector,
+ preview,
+ imageCapture
+ )
+
+ binding.txtCameraId.text = "cameraId=${Camera2CameraInfo.from(camera.cameraInfo).cameraId}"
+ }
+
+ private fun setupUI() {
+ binding.btnTakePicture.setOnClickListener {
+ val contentValues = ContentValues()
+ contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
+ val outputFileOptions = ImageCapture.OutputFileOptions.Builder(
+ contentResolver,
+ MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
+ contentValues
+ ).build()
+
+ imageCapture.takePicture(
+ outputFileOptions,
+ ContextCompat.getMainExecutor(this),
+ object : ImageCapture.OnImageSavedCallback {
+ override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
+ Toast.makeText(
+ this@FoldableCameraActivity,
+ "Image captured successfully",
+ Toast.LENGTH_SHORT
+ ).show()
+ }
+
+ override fun onError(exception: ImageCaptureException) {
+ Toast.makeText(
+ this@FoldableCameraActivity, "Failed to capture", Toast.LENGTH_SHORT
+ ).show()
+ }
+ }
+ )
+ }
+
+ binding.btnSwitchCamera.setOnClickListener {
+ showSwitchCameraMenu()
+ }
+
+ val tapGestureDetector = GestureDetector(this, onTapGestureListener)
+ val scaleDetector = ScaleGestureDetector(this, mScaleGestureListener)
+ binding.previewView.setOnTouchListener { _, event ->
+ val tapEventProcessed = tapGestureDetector.onTouchEvent(event)
+ val scaleEventProcessed = scaleDetector.onTouchEvent(event)
+ tapEventProcessed || scaleEventProcessed
+ }
+
+ binding.btnSwitchArea.setOnClickListener {
+ isPreviewInLeftTop = !isPreviewInLeftTop
+ adjustPreviewByFoldingState()
+ }
+ }
+
+ private val mScaleGestureListener: SimpleOnScaleGestureListener =
+ object : SimpleOnScaleGestureListener() {
+ override fun onScale(detector: ScaleGestureDetector): Boolean {
+ val cameraInfo = camera.cameraInfo
+ val newZoom =
+ cameraInfo.zoomState.value!!.zoomRatio * detector.scaleFactor
+ camera.cameraControl.setZoomRatio(newZoom)
+ return true
+ }
+ }
+ private val onTapGestureListener: GestureDetector.OnGestureListener =
+ object : SimpleOnGestureListener() {
+ override fun onSingleTapUp(e: MotionEvent): Boolean {
+ val factory: MeteringPointFactory = binding.previewView.meteringPointFactory
+ val action = FocusMeteringAction.Builder(
+ factory.createPoint(e.x, e.y)
+ ).build()
+
+ val future = camera.cameraControl.startFocusAndMetering(action)
+ future.addListener({}, { v -> v.run() })
+ return true
+ }
+ }
+
+ private fun adjustPreviewByFoldingState() {
+ val previewView = binding.previewView
+ val btnSwitchArea = binding.btnSwitchArea
+ activeWindowLayoutInfo?.displayFeatures?.firstOrNull { it is FoldingFeature }
+ ?.let {
+ val rect = getFeaturePositionInViewRect(
+ it,
+ previewView.parent as View
+ ) ?: return@let
+ val foldingFeature = it as FoldingFeature
+ if (foldingFeature.state == FoldingFeature.State.HALF_OPENED) {
+ btnSwitchArea.visibility = View.VISIBLE
+ when (foldingFeature.orientation) {
+ FoldingFeature.Orientation.VERTICAL -> {
+ if (isPreviewInLeftTop) {
+ previewView.moveToLeftOf(rect)
+ val blankAreaWidth =
+ (btnSwitchArea.parent as View).width - rect.right
+ btnSwitchArea.x = rect.right +
+ (blankAreaWidth - btnSwitchArea.width) / 2f
+ btnSwitchArea.y = (previewView.height - btnSwitchArea.height) / 2f
+ } else {
+ previewView.moveToRightOf(rect)
+ btnSwitchArea.x =
+ (rect.left - btnSwitchArea.width) / 2f
+ btnSwitchArea.y = (previewView.height - btnSwitchArea.height) / 2f
+ }
+ }
+ FoldingFeature.Orientation.HORIZONTAL -> {
+ if (isPreviewInLeftTop) {
+ previewView.moveToTopOf(rect)
+ val blankAreaHeight =
+ (btnSwitchArea.parent as View).height - rect.bottom
+ btnSwitchArea.x = (previewView.width - btnSwitchArea.width) / 2f
+ btnSwitchArea.y = rect.bottom +
+ (blankAreaHeight - btnSwitchArea.height) / 2f
+ } else {
+ previewView.moveToBottomOf(rect)
+ btnSwitchArea.x = (previewView.width - btnSwitchArea.width) / 2f
+ btnSwitchArea.y =
+ (rect.top - btnSwitchArea.height) / 2f
+ }
+ }
+ }
+ } else {
+ previewView.restore()
+ btnSwitchArea.x = 0f
+ btnSwitchArea.y = 0f
+ btnSwitchArea.visibility = View.INVISIBLE
+ }
+ showCamerasAndDisplayInfo()
+ }
+ }
+
+ private fun View.moveToLeftOf(foldingFeatureRect: Rect) {
+ x = 0f
+ layoutParams = layoutParams.apply {
+ width = foldingFeatureRect.left
+ }
+ }
+
+ private fun View.moveToRightOf(foldingFeatureRect: Rect) {
+ x = foldingFeatureRect.left.toFloat()
+ layoutParams = layoutParams.apply {
+ width = (parent as View).width - foldingFeatureRect.left
+ }
+ }
+
+ private fun View.moveToTopOf(foldingFeatureRect: Rect) {
+ y = 0f
+ layoutParams = layoutParams.apply {
+ height = foldingFeatureRect.top
+ }
+ }
+
+ private fun View.moveToBottomOf(foldingFeatureRect: Rect) {
+ y = foldingFeatureRect.top.toFloat()
+ layoutParams = layoutParams.apply {
+ height = (parent as View).height - foldingFeatureRect.top
+ }
+ }
+
+ private fun View.restore() {
+ // Restore to full view
+ layoutParams = layoutParams.apply {
+ width = MATCH_PARENT
+ height = MATCH_PARENT
+ }
+ y = 0f
+ x = 0f
+ }
+
+ private fun shouldRequestPermissionsAtRuntime(): Boolean {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
+ }
+
+ private fun hasPermissions(): Boolean {
+ return CameraActivity.PERMISSIONS.all {
+ ContextCompat.checkSelfPermission(this, it) == PackageManager.PERMISSION_GRANTED
+ }
+ }
+
+ private val Display.rotationString: String
+ get() {
+ return when (rotation) {
+ Surface.ROTATION_0 -> "0"
+ Surface.ROTATION_90 -> "90"
+ Surface.ROTATION_180 -> "180"
+ Surface.ROTATION_270 -> "270"
+ else -> "unknown:$rotation"
+ }
+ }
+
+ @Suppress("DEPRECATION")
+ private fun showCamerasAndDisplayInfo() {
+ var totalMsg = ""
+ val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
+ val displayManager = getSystemService(Context.DISPLAY_SERVICE) as DisplayManager
+ for (display in displayManager.displays) {
+ val realPt = Point()
+ display?.getRealSize(realPt)
+ totalMsg += "Display(${display.displayId}) size=(${realPt.x},${realPt.y}) " +
+ "rot=${display.rotationString}\n"
+ }
+
+ totalMsg += "WindowMetrics=${lastWindowMetrics?.bounds}\n"
+
+ for (id in cameraManager.cameraIdList) {
+ val characteristics = cameraManager.getCameraCharacteristics(id)
+ val msg = "[$id] ${characteristics.lensFacing} " +
+ "${characteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)} degrees\n" +
+ " array = " +
+ "${characteristics.get(CameraCharacteristics.SENSOR_INFO_ACTIVE_ARRAY_SIZE)}\n" +
+ " focal length = [${characteristics.focalLength}]\n"
+ totalMsg += msg
+ }
+
+ binding.cameraInfo.text = totalMsg
+ }
+
+ private fun showSwitchCameraMenu() {
+ val popup = PopupMenu(this, binding.btnSwitchCamera)
+ popup.menu.add(0, 0, 0, BACK_CAMERA_STR)
+ popup.menu.add(0, 0, 0, FRONT_CAMERA_STR)
+ val cameraManager = getSystemService(Context.CAMERA_SERVICE) as CameraManager
+ for (id in cameraManager.cameraIdList) {
+ popup.menu.add(0, 0, 0, "$id")
+ }
+ popup.show()
+
+ popup.setOnMenuItemClickListener { menuItem ->
+ currentCameraSelectorString = menuItem.title as String
+ currentCameraSelector = getCameraSelectorFromString(currentCameraSelectorString)
+ cameraProvider.unbindAll()
+ bindUseCases(cameraProvider)
+ true
+ }
+ }
+
+ @OptIn(ExperimentalCamera2Interop::class)
+ private fun getCameraSelectorFromString(cameraSelectorStr: String): CameraSelector =
+ when (cameraSelectorStr) {
+ BACK_CAMERA_STR -> CameraSelector.DEFAULT_BACK_CAMERA
+ FRONT_CAMERA_STR -> CameraSelector.DEFAULT_FRONT_CAMERA
+ else -> CameraSelector.Builder().addCameraFilter {
+ for (cameraInfo in it) {
+ if (Camera2CameraInfo.from(cameraInfo).cameraId == cameraSelectorStr) {
+ return@addCameraFilter listOf(cameraInfo)
+ }
+ }
+ return@addCameraFilter emptyList<CameraInfo>()
+ }.build()
+ }
+
+ private val CameraCharacteristics.lensFacing: String
+ get() = when (this.get(CameraCharacteristics.LENS_FACING)) {
+ CameraCharacteristics.LENS_FACING_BACK -> "BACK"
+ CameraCharacteristics.LENS_FACING_FRONT -> "FRONT"
+ CameraCharacteristics.LENS_FACING_EXTERNAL -> "EXTERNAL"
+ else -> "UNKNOWN"
+ }
+
+ private val CameraCharacteristics.focalLength: String
+ get() {
+ val focalLengths = this.get(CameraCharacteristics.LENS_INFO_AVAILABLE_FOCAL_LENGTHS)
+ if (focalLengths == null || focalLengths.isEmpty()) {
+ return "NONE"
+ }
+ return focalLengths.joinToString(",")
+ }
+
+ /**
+ * Gets the bounds of the display feature translated to the View's coordinate space and current
+ * position in the window. This will also include view padding in the calculations.
+ *
+ * Copied from windowManager Jetpack library sample codes.
+ * https://github.com/android/user-interface-samples/tree/main/WindowManager
+ *
+ */
+ fun getFeaturePositionInViewRect(
+ displayFeature: DisplayFeature,
+ view: View,
+ includePadding: Boolean = true
+ ): Rect? {
+ // The location of the view in window to be in the same coordinate space as the feature.
+ val viewLocationInWindow = IntArray(2)
+ view.getLocationInWindow(viewLocationInWindow)
+
+ // Intersect the feature rectangle in window with view rectangle to clip the bounds.
+ val viewRect = Rect(
+ viewLocationInWindow[0], viewLocationInWindow[1],
+ viewLocationInWindow[0] + view.width, viewLocationInWindow[1] + view.height
+ )
+
+ // Include padding if needed
+ if (includePadding) {
+ viewRect.left += view.paddingLeft
+ viewRect.top += view.paddingTop
+ viewRect.right -= view.paddingRight
+ viewRect.bottom -= view.paddingBottom
+ }
+
+ val featureRectInView = Rect(displayFeature.bounds)
+ val intersects = featureRectInView.intersect(viewRect)
+ if ((featureRectInView.width() == 0 && featureRectInView.height() == 0) ||
+ !intersects
+ ) {
+ return null
+ }
+
+ // Offset the feature coordinates to view coordinate space start point
+ featureRectInView.offset(-viewLocationInWindow[0], -viewLocationInWindow[1])
+
+ return featureRectInView
+ }
+}
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_foldable_camera.xml b/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_foldable_camera.xml
new file mode 100644
index 0000000..68cf75f
--- /dev/null
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_foldable_camera.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <Button
+ android:id="@+id/btnSwitchArea"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Switch Area"
+ android:visibility="invisible"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <androidx.camera.view.PreviewView
+ android:id="@+id/previewView"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:layout_editor_absoluteX="62dp"
+ tools:layout_editor_absoluteY="0dp">
+
+ </androidx.camera.view.PreviewView>
+
+ <TextView
+ android:id="@+id/cameraInfo"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text=""
+ android:textColor="#FFFFFFFF"
+ android:shadowColor="#FF000000"
+ android:shadowRadius="8"
+ android:shadowDx="5"
+ android:shadowDy="5"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <Button
+ android:id="@+id/btnTakePicture"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Shot"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+
+ <Button
+ android:id="@+id/btnSwitchCamera"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="Switch"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toEndOf="@+id/btnTakePicture" />
+
+ <TextView
+ android:id="@+id/txtCameraId"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView"
+ android:textSize="20sp"
+ android:textColor="#FFFFFFFF"
+ android:shadowColor="#FF000000"
+ android:shadowRadius="8"
+ android:shadowDx="5"
+ android:shadowDy="5"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toStartOf="@+id/btnTakePicture"
+ app:layout_constraintBaseline_toBaselineOf="@+id/btnTakePicture"
+ app:layout_constraintStart_toStartOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout >
\ No newline at end of file
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_main.xml b/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_main.xml
index d5010e9..9067da8 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_main.xml
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/res/layout/activity_main.xml
@@ -13,42 +13,51 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
- android:orientation="vertical"
tools:context=".MainActivity">
- <Button
- android:id="@+id/rotationUnlocked"
+ <LinearLayout
android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/rotation_unlocked_orientation" />
+ android:layout_height="match_parent"
+ android:orientation="vertical">
- <Button
- android:id="@+id/rotationLocked"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/rotation_locked_orientation" />
+ <Button
+ android:id="@+id/rotationUnlocked"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/rotation_unlocked_orientation" />
- <Button
- android:id="@+id/rotationConfigChanges"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/rotation_config_changes_overridden" />
+ <Button
+ android:id="@+id/rotationLocked"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/rotation_locked_orientation" />
- <Button
- android:id="@+id/viewpager"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/viewpager" />
+ <Button
+ android:id="@+id/rotationConfigChanges"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/rotation_config_changes_overridden" />
- <Button
- android:id="@+id/viewpager2"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="@string/viewpager2" />
+ <Button
+ android:id="@+id/viewpager"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/viewpager" />
-</LinearLayout>
\ No newline at end of file
+ <Button
+ android:id="@+id/viewpager2"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/viewpager2" />
+
+ <Button
+ android:id="@+id/foldable"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:text="@string/foldable" />
+ </LinearLayout>
+</ScrollView>
\ No newline at end of file
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/res/menu/foldable_menu.xml b/camera/integration-tests/uiwidgetstestapp/src/main/res/menu/foldable_menu.xml
new file mode 100644
index 0000000..487bff8
--- /dev/null
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/res/menu/foldable_menu.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+ <group >
+ <item
+ android:id="@+id/fillCenter"
+ android:title="Fill Center" />
+ <item
+ android:id="@+id/fitCenter"
+ android:title="Fit Center" />
+
+ <item
+ android:id="@+id/fitStart"
+ android:title="Fit Start" />
+ <item
+ android:id="@+id/fitEnd"
+ android:title="Fit End" />
+ </group>
+</menu>
\ No newline at end of file
diff --git a/camera/integration-tests/uiwidgetstestapp/src/main/res/values/donottranslate-strings.xml b/camera/integration-tests/uiwidgetstestapp/src/main/res/values/donottranslate-strings.xml
index d0f15ab..991afd8 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/main/res/values/donottranslate-strings.xml
+++ b/camera/integration-tests/uiwidgetstestapp/src/main/res/values/donottranslate-strings.xml
@@ -21,4 +21,6 @@
<string name="rotation_config_changes_overridden">Rotation - ConfigChanges overridden</string>
<string name="viewpager">ViewPager</string>
<string name="viewpager2">ViewPager2</string>
+ <string name="foldable">Foldable</string>
+
</resources>
\ No newline at end of file
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java
index 3e2db72..7712336c 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/hardware/info/AutomotiveCarInfo.java
@@ -287,8 +287,8 @@
yearValue = getCarValue(value, (Integer) value.getValue());
}
}
- Model model = new Model.Builder().setName(makeValue)
- .setManufacturer(modelValue)
+ Model model = new Model.Builder().setName(modelValue)
+ .setManufacturer(makeValue)
.setYear(yearValue)
.build();
listener.onCarDataAvailable(model);
diff --git a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java
index 9919320..56be908 100644
--- a/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java
+++ b/car/app/app-automotive/src/test/java/androidx/car/app/hardware/info/AutomotiveCarInfoTest.java
@@ -87,7 +87,7 @@
public class AutomotiveCarInfoTest {
private List<CarPropertyResponse<?>> mResponse;
private CountDownLatch mCountDownLatch;
- private Executor mExecutor = directExecutor();
+ private final Executor mExecutor = directExecutor();
private AutomotiveCarInfo mAutomotiveCarInfo;
@Mock
private Car mCarMock;
@@ -110,11 +110,9 @@
public void getModel_verifyResponse() throws InterruptedException {
// Add "make", "model", "year" values to the response.
mResponse.add(CarPropertyResponse.create(INFO_MAKE,
- STATUS_SUCCESS, 1, "Speedy "
- + "Model"));
+ STATUS_SUCCESS, 1, "Toy Vehicle"));
mResponse.add(CarPropertyResponse.create(INFO_MODEL,
- STATUS_SUCCESS, 2, "Toy "
- + "Vehicle"));
+ STATUS_SUCCESS, 2, "Speedy Model"));
mResponse.add(CarPropertyResponse.create(INFO_MODEL_YEAR,
STATUS_SUCCESS, 3, 2020));
ListenableFuture<List<CarPropertyResponse<?>>> listenableCarPropertyResponse =
@@ -133,8 +131,8 @@
assertThat(mModel.getName().getValue()).isEqualTo("Speedy Model");
assertThat(mModel.getManufacturer().getValue()).isEqualTo("Toy Vehicle");
assertThat(mModel.getYear().getValue()).isEqualTo(2020);
- assertThat(mModel.getName().getTimestampMillis()).isEqualTo(1);
- assertThat(mModel.getManufacturer().getTimestampMillis()).isEqualTo(2);
+ assertThat(mModel.getManufacturer().getTimestampMillis()).isEqualTo(1);
+ assertThat(mModel.getName().getTimestampMillis()).isEqualTo(2);
assertThat(mModel.getYear().getTimestampMillis()).isEqualTo(3);
}
diff --git a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java
index 38df75b..22cb497 100644
--- a/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java
+++ b/car/app/app-samples/navigation/common/src/main/java/androidx/car/app/sample/navigation/common/car/SurfaceRenderer.java
@@ -26,9 +26,13 @@
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.RectF;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
import android.util.Log;
import android.view.Surface;
+import androidx.annotation.MainThread;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.car.app.AppManager;
@@ -53,6 +57,9 @@
/** The scale factor to apply when initializing the background map. */
private static final float MAP_ENLARGE_FACTOR = 5f;
+ /** Looper msg to trigger a frame rendering */
+ private static final int MSG_RENDER_FRAME = 1;
+
@Nullable
Surface mSurface;
@Nullable
@@ -107,6 +114,9 @@
public void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer) {
synchronized (SurfaceRenderer.this) {
Log.i(TAG, "Surface available " + surfaceContainer);
+ if (mSurface != null) {
+ mSurface.release();
+ }
mSurface = surfaceContainer.getSurface();
renderFrame();
}
@@ -136,7 +146,10 @@
public void onSurfaceDestroyed(@NonNull SurfaceContainer surfaceContainer) {
synchronized (SurfaceRenderer.this) {
Log.i(TAG, "Surface destroyed");
- mSurface = null;
+ if (mSurface != null) {
+ mSurface.release();
+ mSurface = null;
+ }
}
}
@@ -163,6 +176,16 @@
}
};
+ private Handler mHandler = new Handler(Looper.getMainLooper()) {
+ @Override
+ public void handleMessage(Message msg) {
+ switch (msg.what) {
+ case MSG_RENDER_FRAME:
+ doRenderFrame();
+ }
+ }
+ };
+
public SurfaceRenderer(@NonNull CarContext carContext, @NonNull Lifecycle lifecycle) {
mCarContext = carContext;
@@ -250,6 +273,11 @@
}
void renderFrame() {
+ mHandler.sendEmptyMessage(MSG_RENDER_FRAME);
+ }
+
+ @MainThread
+ void doRenderFrame() {
if (mSurface == null || !mSurface.isValid()) {
// Surface is not available, or has been destroyed, skip this frame.
return;
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceInfo.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceInfo.java
index 7f971f7..0089e2d 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceInfo.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/PlaceInfo.java
@@ -26,7 +26,6 @@
public final CharSequence title;
public final CharSequence address;
public final CharSequence description;
- public final CharSequence locationCode;
public final CharSequence phoneNumber;
public final Location location;
public final PlaceMarker marker;
@@ -35,14 +34,12 @@
@NonNull CharSequence title,
@NonNull CharSequence address,
@NonNull CharSequence description,
- @NonNull CharSequence locationCode,
@NonNull CharSequence phoneNumber,
@NonNull Location location,
@NonNull PlaceMarker marker) {
this.title = title;
this.address = address;
this.description = description;
- this.locationCode = locationCode;
this.phoneNumber = phoneNumber;
this.location = location;
this.marker = marker;
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java
index 57aa981..8e25e79 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/common/SamplePlaces.java
@@ -143,7 +143,6 @@
"Google Kirkland",
"747 6th St South, Kirkland, WA 98033",
"Tinted resource vector",
- "KIR",
"+14257395600",
location1,
new PlaceMarker.Builder()
@@ -165,7 +164,6 @@
"Google Bellevue",
"1120 112th Ave NE, Bellevue, WA 98004",
"Image resource bitmap",
- "BVE",
"+14252301301",
location2,
new PlaceMarker.Builder()
@@ -185,7 +183,6 @@
"Google South Lake Union",
"1021 Valley St, Seattle, WA 98109",
"Colored text marker",
- "SLU",
"+12065311800",
location3,
new PlaceMarker.Builder().setLabel("SLU").setColor(CarColor.RED).build()));
@@ -198,7 +195,6 @@
"Google Seattle",
"601 N 34th St, Seattle, WA 98103",
"Image bitmap",
- "SEA",
"+12068761800",
location4,
new PlaceMarker.Builder()
@@ -220,10 +216,9 @@
"Google Bothell",
"11831 North Creek Pkwy, Bothell, WA 98011",
"Text label",
- "BOT",
"n/a",
location5,
- new PlaceMarker.Builder().setLabel("BOT").build()));
+ new PlaceMarker.Builder().build()));
return places;
}
diff --git a/car/app/app/build.gradle b/car/app/app/build.gradle
index 0379226..3daf72b 100644
--- a/car/app/app/build.gradle
+++ b/car/app/app/build.gradle
@@ -112,6 +112,26 @@
class ProtocolApiTask extends DefaultTask {
private final WorkerExecutor workerExecutor
+ @Input
+ public Provider<List<File> > classpath = project.provider({
+ FileCollection dependencyClasspath = getLibraryVariant().getCompileClasspath(null)
+
+ def resolvedClasspath = new ArrayList<File>()
+ resolvedClasspath.addAll(getLibraryExtension().bootClasspath)
+ resolvedClasspath.addAll(dependencyClasspath)
+ resolvedClasspath
+ })
+
+ @Input
+ public Provider<List<File> > sourceDirs = project.provider({
+ List<File> resolvedSourceDirs = new ArrayList<File>()
+ for (ConfigurableFileTree fileTree : getLibraryVariant().getSourceFolders(SourceKind
+ .JAVA)) {
+ resolvedSourceDirs.add(fileTree.getDir())
+ }
+ resolvedSourceDirs
+ })
+
@Inject
ProtocolApiTask(WorkerExecutor workerExecutor) {
this.workerExecutor = workerExecutor
@@ -119,7 +139,7 @@
@Internal
def getLibraryVariant() {
- LibraryExtension extension = project.extensions.getByType(LibraryExtension.class)
+ LibraryExtension extension = getLibraryExtension()
LibraryApiTaskConfig config = new LibraryApiTaskConfig(extension)
return config.library.libraryVariants.find({
it.name == Release.DEFAULT_PUBLISH_CONFIG
@@ -128,32 +148,15 @@
@Internal
def getLibraryExtension() {
- return project.extensions.getByType(LibraryExtension.class)
- }
-
- @Internal
- def getSourceDirs() {
- List<File> sourceDirs = new ArrayList<File>()
- for (ConfigurableFileTree fileTree : getLibraryVariant().getSourceFolders(SourceKind
- .JAVA)) {
- if (fileTree.getDir().exists()) {
- sourceDirs.add(fileTree.getDir())
- }
- }
- return sourceDirs
+ return project.extensions.findByType(LibraryExtension.class)
}
@Internal
def runMetalava(List<String> additionalArgs) {
FileCollection metalavaClasspath = MetalavaRunnerKt.getMetalavaClasspath(project)
- FileCollection dependencyClasspath = getLibraryVariant().getCompileClasspath(null).filter {
- it.exists()
- }
- List<File> classpath = new ArrayList<File>()
- classpath.addAll(getLibraryExtension().bootClasspath)
- classpath.addAll(dependencyClasspath)
-
+ List<File> classpath = classpath.get()
+ List<File> sourceDirs = sourceDirs.get().findAll{ it -> it.exists() }
List<String> standardArgs = [
"--classpath",
classpath.join(File.pathSeparator),
@@ -184,7 +187,7 @@
@InputFiles
@PathSensitive(PathSensitivity.RELATIVE)
def getInputSource() {
- return sourceDirs // Re-run on source changes
+ return sourceDirs.get() // Re-run on source changes
}
@OutputFile
diff --git a/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java b/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
index 0043b61..9f6adc7 100644
--- a/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
+++ b/car/app/app/src/main/java/androidx/car/app/SurfaceCallback.java
@@ -17,6 +17,7 @@
package androidx.car.app;
import android.graphics.Rect;
+import android.view.Surface;
import androidx.annotation.NonNull;
import androidx.car.app.annotations.RequiresCarApi;
@@ -31,6 +32,9 @@
*
* <p>This method is guaranteed to be called before any other methods on this listener.
*
+ * <p><b>Important:</b> every instance of {@link android.view.Surface} received through this
+ * method must be released by calling {@link Surface#release()}.
+ *
* @param surfaceContainer the {@link SurfaceContainer} that is ready for drawing
*/
default void onSurfaceAvailable(@NonNull SurfaceContainer surfaceContainer) {
diff --git a/collection/collection-ktx/api/1.2.0-beta01.txt b/collection/collection-ktx/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..bca313f
--- /dev/null
+++ b/collection/collection-ktx/api/1.2.0-beta01.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.collection {
+
+ public final class ArrayMapKt {
+ method public static inline <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf();
+ method public static <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+ }
+
+ public final class ArraySetKt {
+ method public static inline <T> androidx.collection.ArraySet<T> arraySetOf();
+ method public static <T> androidx.collection.ArraySet<T> arraySetOf(T?... values);
+ }
+
+ public final class LongSparseArrayKt {
+ method public static inline operator <T> boolean contains(androidx.collection.LongSparseArray<T>, long key);
+ method public static inline <T> void forEach(androidx.collection.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.LongSparseArray<T>, long key, T? defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.LongSparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
+ method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
+ method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+ method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ method public static inline <K, V> androidx.collection.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+ }
+
+ public final class SparseArrayKt {
+ method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
+ method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.SparseArrayCompat<T>, int key, T? defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.SparseArrayCompat<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.SparseArrayCompat<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
+ method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+ method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
+ }
+
+}
+
diff --git a/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta01.txt b/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..bca313f
--- /dev/null
+++ b/collection/collection-ktx/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.collection {
+
+ public final class ArrayMapKt {
+ method public static inline <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf();
+ method public static <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+ }
+
+ public final class ArraySetKt {
+ method public static inline <T> androidx.collection.ArraySet<T> arraySetOf();
+ method public static <T> androidx.collection.ArraySet<T> arraySetOf(T?... values);
+ }
+
+ public final class LongSparseArrayKt {
+ method public static inline operator <T> boolean contains(androidx.collection.LongSparseArray<T>, long key);
+ method public static inline <T> void forEach(androidx.collection.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.LongSparseArray<T>, long key, T? defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.LongSparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
+ method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
+ method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+ method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ method public static inline <K, V> androidx.collection.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+ }
+
+ public final class SparseArrayKt {
+ method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
+ method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.SparseArrayCompat<T>, int key, T? defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.SparseArrayCompat<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.SparseArrayCompat<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
+ method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+ method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
+ }
+
+}
+
diff --git a/collection/collection-ktx/api/restricted_1.2.0-beta01.txt b/collection/collection-ktx/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..bca313f
--- /dev/null
+++ b/collection/collection-ktx/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,45 @@
+// Signature format: 4.0
+package androidx.collection {
+
+ public final class ArrayMapKt {
+ method public static inline <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf();
+ method public static <K, V> androidx.collection.ArrayMap<K,V> arrayMapOf(kotlin.Pair<? extends K,? extends V>... pairs);
+ }
+
+ public final class ArraySetKt {
+ method public static inline <T> androidx.collection.ArraySet<T> arraySetOf();
+ method public static <T> androidx.collection.ArraySet<T> arraySetOf(T?... values);
+ }
+
+ public final class LongSparseArrayKt {
+ method public static inline operator <T> boolean contains(androidx.collection.LongSparseArray<T>, long key);
+ method public static inline <T> void forEach(androidx.collection.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.LongSparseArray<T>, long key, T? defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.LongSparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.LongSparseArray<T>);
+ method public static <T> kotlin.collections.LongIterator keyIterator(androidx.collection.LongSparseArray<T>);
+ method public static operator <T> androidx.collection.LongSparseArray<T> plus(androidx.collection.LongSparseArray<T>, androidx.collection.LongSparseArray<T> other);
+ method public static inline operator <T> void set(androidx.collection.LongSparseArray<T>, long key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ method public static inline <K, V> androidx.collection.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+ }
+
+ public final class SparseArrayKt {
+ method public static inline operator <T> boolean contains(androidx.collection.SparseArrayCompat<T>, int key);
+ method public static inline <T> void forEach(androidx.collection.SparseArrayCompat<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(androidx.collection.SparseArrayCompat<T>, int key, T? defaultValue);
+ method public static inline <T> T! getOrElse(androidx.collection.SparseArrayCompat<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(androidx.collection.SparseArrayCompat<T>);
+ method public static inline <T> boolean isNotEmpty(androidx.collection.SparseArrayCompat<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(androidx.collection.SparseArrayCompat<T>);
+ method public static operator <T> androidx.collection.SparseArrayCompat<T> plus(androidx.collection.SparseArrayCompat<T>, androidx.collection.SparseArrayCompat<T> other);
+ method public static inline operator <T> void set(androidx.collection.SparseArrayCompat<T>, int key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(androidx.collection.SparseArrayCompat<T>);
+ }
+
+}
+
diff --git a/collection/collection/api/1.2.0-beta01.txt b/collection/collection/api/1.2.0-beta01.txt
new file mode 100644
index 0000000..fec5af1
--- /dev/null
+++ b/collection/collection/api/1.2.0-beta01.txt
@@ -0,0 +1,184 @@
+// Signature format: 4.0
+package androidx.collection {
+
+ public class ArrayMap<K, V> extends androidx.collection.SimpleArrayMap<K,V> implements java.util.Map<K,V> {
+ ctor public ArrayMap();
+ ctor public ArrayMap(int);
+ ctor public ArrayMap(androidx.collection.SimpleArrayMap!);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public java.util.Set<java.util.Map.Entry<K!,V!>!> entrySet();
+ method public java.util.Set<K!> keySet();
+ method public void putAll(java.util.Map<? extends K,? extends V>);
+ method public boolean removeAll(java.util.Collection<?>);
+ method public boolean retainAll(java.util.Collection<?>);
+ method public java.util.Collection<V!> values();
+ }
+
+ public final class ArraySet<E> implements java.util.Collection<E> java.util.Set<E> {
+ ctor public ArraySet();
+ ctor public ArraySet(int);
+ ctor public ArraySet(androidx.collection.ArraySet<E!>?);
+ ctor public ArraySet(java.util.Collection<E!>?);
+ ctor public ArraySet(E![]?);
+ method public boolean add(E?);
+ method public void addAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean addAll(java.util.Collection<? extends E>);
+ method public void clear();
+ method public boolean contains(Object?);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public void ensureCapacity(int);
+ method public int indexOf(Object?);
+ method public boolean isEmpty();
+ method public java.util.Iterator<E!> iterator();
+ method public boolean remove(Object?);
+ method public boolean removeAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean removeAll(java.util.Collection<?>);
+ method public E! removeAt(int);
+ method public boolean retainAll(java.util.Collection<?>);
+ method public int size();
+ method public Object![] toArray();
+ method public <T> T![] toArray(T![]);
+ method public E! valueAt(int);
+ }
+
+ public final class CircularArray<E> {
+ ctor public CircularArray();
+ ctor public CircularArray(int);
+ method public void addFirst(E!);
+ method public void addLast(E!);
+ method public void clear();
+ method public E! get(int);
+ method public E! getFirst();
+ method public E! getLast();
+ method public boolean isEmpty();
+ method public E! popFirst();
+ method public E! popLast();
+ method public void removeFromEnd(int);
+ method public void removeFromStart(int);
+ method public int size();
+ }
+
+ public final class CircularIntArray {
+ ctor public CircularIntArray();
+ ctor public CircularIntArray(int);
+ method public void addFirst(int);
+ method public void addLast(int);
+ method public void clear();
+ method public int get(int);
+ method public int getFirst();
+ method public int getLast();
+ method public boolean isEmpty();
+ method public int popFirst();
+ method public int popLast();
+ method public void removeFromEnd(int);
+ method public void removeFromStart(int);
+ method public int size();
+ }
+
+ public class LongSparseArray<E> implements java.lang.Cloneable {
+ ctor public LongSparseArray();
+ ctor public LongSparseArray(int);
+ method public void append(long, E!);
+ method public void clear();
+ method public androidx.collection.LongSparseArray<E!>! clone();
+ method public boolean containsKey(long);
+ method public boolean containsValue(E!);
+ method @Deprecated public void delete(long);
+ method public E? get(long);
+ method public E! get(long, E!);
+ method public int indexOfKey(long);
+ method public int indexOfValue(E!);
+ method public boolean isEmpty();
+ method public long keyAt(int);
+ method public void put(long, E!);
+ method public void putAll(androidx.collection.LongSparseArray<? extends E>);
+ method public E? putIfAbsent(long, E!);
+ method public void remove(long);
+ method public boolean remove(long, Object!);
+ method public void removeAt(int);
+ method public E? replace(long, E!);
+ method public boolean replace(long, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+ public class LruCache<K, V> {
+ ctor public LruCache(int);
+ method protected V? create(K);
+ method public final int createCount();
+ method protected void entryRemoved(boolean, K, V, V?);
+ method public final void evictAll();
+ method public final int evictionCount();
+ method public final V? get(K);
+ method public final int hitCount();
+ method public final int maxSize();
+ method public final int missCount();
+ method public final V? put(K, V);
+ method public final int putCount();
+ method public final V? remove(K);
+ method public void resize(int);
+ method public final int size();
+ method protected int sizeOf(K, V);
+ method public final java.util.Map<K!,V!>! snapshot();
+ method public final String toString();
+ method public void trimToSize(int);
+ }
+
+ public class SimpleArrayMap<K, V> {
+ ctor public SimpleArrayMap();
+ ctor public SimpleArrayMap(int);
+ ctor public SimpleArrayMap(androidx.collection.SimpleArrayMap<K!,V!>!);
+ method public void clear();
+ method public boolean containsKey(Object?);
+ method public boolean containsValue(Object!);
+ method public void ensureCapacity(int);
+ method public V? get(Object!);
+ method public V! getOrDefault(Object!, V!);
+ method public int indexOfKey(Object?);
+ method public boolean isEmpty();
+ method public K! keyAt(int);
+ method public V? put(K!, V!);
+ method public void putAll(androidx.collection.SimpleArrayMap<? extends K,? extends V>);
+ method public V? putIfAbsent(K!, V!);
+ method public V? remove(Object!);
+ method public boolean remove(Object!, Object!);
+ method public V! removeAt(int);
+ method public V? replace(K!, V!);
+ method public boolean replace(K!, V!, V!);
+ method public V! setValueAt(int, V!);
+ method public int size();
+ method public V! valueAt(int);
+ }
+
+ public class SparseArrayCompat<E> implements java.lang.Cloneable {
+ ctor public SparseArrayCompat();
+ ctor public SparseArrayCompat(int);
+ method public void append(int, E!);
+ method public void clear();
+ method public androidx.collection.SparseArrayCompat<E!>! clone();
+ method public boolean containsKey(int);
+ method public boolean containsValue(E!);
+ method @Deprecated public void delete(int);
+ method public E? get(int);
+ method public E! get(int, E!);
+ method public int indexOfKey(int);
+ method public int indexOfValue(E!);
+ method public boolean isEmpty();
+ method public int keyAt(int);
+ method public void put(int, E!);
+ method public void putAll(androidx.collection.SparseArrayCompat<? extends E>);
+ method public E? putIfAbsent(int, E!);
+ method public void remove(int);
+ method public boolean remove(int, Object!);
+ method public void removeAt(int);
+ method public void removeAtRange(int, int);
+ method public E? replace(int, E!);
+ method public boolean replace(int, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+}
+
diff --git a/collection/collection/api/public_plus_experimental_1.2.0-beta01.txt b/collection/collection/api/public_plus_experimental_1.2.0-beta01.txt
new file mode 100644
index 0000000..fec5af1
--- /dev/null
+++ b/collection/collection/api/public_plus_experimental_1.2.0-beta01.txt
@@ -0,0 +1,184 @@
+// Signature format: 4.0
+package androidx.collection {
+
+ public class ArrayMap<K, V> extends androidx.collection.SimpleArrayMap<K,V> implements java.util.Map<K,V> {
+ ctor public ArrayMap();
+ ctor public ArrayMap(int);
+ ctor public ArrayMap(androidx.collection.SimpleArrayMap!);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public java.util.Set<java.util.Map.Entry<K!,V!>!> entrySet();
+ method public java.util.Set<K!> keySet();
+ method public void putAll(java.util.Map<? extends K,? extends V>);
+ method public boolean removeAll(java.util.Collection<?>);
+ method public boolean retainAll(java.util.Collection<?>);
+ method public java.util.Collection<V!> values();
+ }
+
+ public final class ArraySet<E> implements java.util.Collection<E> java.util.Set<E> {
+ ctor public ArraySet();
+ ctor public ArraySet(int);
+ ctor public ArraySet(androidx.collection.ArraySet<E!>?);
+ ctor public ArraySet(java.util.Collection<E!>?);
+ ctor public ArraySet(E![]?);
+ method public boolean add(E?);
+ method public void addAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean addAll(java.util.Collection<? extends E>);
+ method public void clear();
+ method public boolean contains(Object?);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public void ensureCapacity(int);
+ method public int indexOf(Object?);
+ method public boolean isEmpty();
+ method public java.util.Iterator<E!> iterator();
+ method public boolean remove(Object?);
+ method public boolean removeAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean removeAll(java.util.Collection<?>);
+ method public E! removeAt(int);
+ method public boolean retainAll(java.util.Collection<?>);
+ method public int size();
+ method public Object![] toArray();
+ method public <T> T![] toArray(T![]);
+ method public E! valueAt(int);
+ }
+
+ public final class CircularArray<E> {
+ ctor public CircularArray();
+ ctor public CircularArray(int);
+ method public void addFirst(E!);
+ method public void addLast(E!);
+ method public void clear();
+ method public E! get(int);
+ method public E! getFirst();
+ method public E! getLast();
+ method public boolean isEmpty();
+ method public E! popFirst();
+ method public E! popLast();
+ method public void removeFromEnd(int);
+ method public void removeFromStart(int);
+ method public int size();
+ }
+
+ public final class CircularIntArray {
+ ctor public CircularIntArray();
+ ctor public CircularIntArray(int);
+ method public void addFirst(int);
+ method public void addLast(int);
+ method public void clear();
+ method public int get(int);
+ method public int getFirst();
+ method public int getLast();
+ method public boolean isEmpty();
+ method public int popFirst();
+ method public int popLast();
+ method public void removeFromEnd(int);
+ method public void removeFromStart(int);
+ method public int size();
+ }
+
+ public class LongSparseArray<E> implements java.lang.Cloneable {
+ ctor public LongSparseArray();
+ ctor public LongSparseArray(int);
+ method public void append(long, E!);
+ method public void clear();
+ method public androidx.collection.LongSparseArray<E!>! clone();
+ method public boolean containsKey(long);
+ method public boolean containsValue(E!);
+ method @Deprecated public void delete(long);
+ method public E? get(long);
+ method public E! get(long, E!);
+ method public int indexOfKey(long);
+ method public int indexOfValue(E!);
+ method public boolean isEmpty();
+ method public long keyAt(int);
+ method public void put(long, E!);
+ method public void putAll(androidx.collection.LongSparseArray<? extends E>);
+ method public E? putIfAbsent(long, E!);
+ method public void remove(long);
+ method public boolean remove(long, Object!);
+ method public void removeAt(int);
+ method public E? replace(long, E!);
+ method public boolean replace(long, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+ public class LruCache<K, V> {
+ ctor public LruCache(int);
+ method protected V? create(K);
+ method public final int createCount();
+ method protected void entryRemoved(boolean, K, V, V?);
+ method public final void evictAll();
+ method public final int evictionCount();
+ method public final V? get(K);
+ method public final int hitCount();
+ method public final int maxSize();
+ method public final int missCount();
+ method public final V? put(K, V);
+ method public final int putCount();
+ method public final V? remove(K);
+ method public void resize(int);
+ method public final int size();
+ method protected int sizeOf(K, V);
+ method public final java.util.Map<K!,V!>! snapshot();
+ method public final String toString();
+ method public void trimToSize(int);
+ }
+
+ public class SimpleArrayMap<K, V> {
+ ctor public SimpleArrayMap();
+ ctor public SimpleArrayMap(int);
+ ctor public SimpleArrayMap(androidx.collection.SimpleArrayMap<K!,V!>!);
+ method public void clear();
+ method public boolean containsKey(Object?);
+ method public boolean containsValue(Object!);
+ method public void ensureCapacity(int);
+ method public V? get(Object!);
+ method public V! getOrDefault(Object!, V!);
+ method public int indexOfKey(Object?);
+ method public boolean isEmpty();
+ method public K! keyAt(int);
+ method public V? put(K!, V!);
+ method public void putAll(androidx.collection.SimpleArrayMap<? extends K,? extends V>);
+ method public V? putIfAbsent(K!, V!);
+ method public V? remove(Object!);
+ method public boolean remove(Object!, Object!);
+ method public V! removeAt(int);
+ method public V? replace(K!, V!);
+ method public boolean replace(K!, V!, V!);
+ method public V! setValueAt(int, V!);
+ method public int size();
+ method public V! valueAt(int);
+ }
+
+ public class SparseArrayCompat<E> implements java.lang.Cloneable {
+ ctor public SparseArrayCompat();
+ ctor public SparseArrayCompat(int);
+ method public void append(int, E!);
+ method public void clear();
+ method public androidx.collection.SparseArrayCompat<E!>! clone();
+ method public boolean containsKey(int);
+ method public boolean containsValue(E!);
+ method @Deprecated public void delete(int);
+ method public E? get(int);
+ method public E! get(int, E!);
+ method public int indexOfKey(int);
+ method public int indexOfValue(E!);
+ method public boolean isEmpty();
+ method public int keyAt(int);
+ method public void put(int, E!);
+ method public void putAll(androidx.collection.SparseArrayCompat<? extends E>);
+ method public E? putIfAbsent(int, E!);
+ method public void remove(int);
+ method public boolean remove(int, Object!);
+ method public void removeAt(int);
+ method public void removeAtRange(int, int);
+ method public E? replace(int, E!);
+ method public boolean replace(int, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+}
+
diff --git a/collection/collection/api/restricted_1.2.0-beta01.txt b/collection/collection/api/restricted_1.2.0-beta01.txt
new file mode 100644
index 0000000..fec5af1
--- /dev/null
+++ b/collection/collection/api/restricted_1.2.0-beta01.txt
@@ -0,0 +1,184 @@
+// Signature format: 4.0
+package androidx.collection {
+
+ public class ArrayMap<K, V> extends androidx.collection.SimpleArrayMap<K,V> implements java.util.Map<K,V> {
+ ctor public ArrayMap();
+ ctor public ArrayMap(int);
+ ctor public ArrayMap(androidx.collection.SimpleArrayMap!);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public java.util.Set<java.util.Map.Entry<K!,V!>!> entrySet();
+ method public java.util.Set<K!> keySet();
+ method public void putAll(java.util.Map<? extends K,? extends V>);
+ method public boolean removeAll(java.util.Collection<?>);
+ method public boolean retainAll(java.util.Collection<?>);
+ method public java.util.Collection<V!> values();
+ }
+
+ public final class ArraySet<E> implements java.util.Collection<E> java.util.Set<E> {
+ ctor public ArraySet();
+ ctor public ArraySet(int);
+ ctor public ArraySet(androidx.collection.ArraySet<E!>?);
+ ctor public ArraySet(java.util.Collection<E!>?);
+ ctor public ArraySet(E![]?);
+ method public boolean add(E?);
+ method public void addAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean addAll(java.util.Collection<? extends E>);
+ method public void clear();
+ method public boolean contains(Object?);
+ method public boolean containsAll(java.util.Collection<?>);
+ method public void ensureCapacity(int);
+ method public int indexOf(Object?);
+ method public boolean isEmpty();
+ method public java.util.Iterator<E!> iterator();
+ method public boolean remove(Object?);
+ method public boolean removeAll(androidx.collection.ArraySet<? extends E>);
+ method public boolean removeAll(java.util.Collection<?>);
+ method public E! removeAt(int);
+ method public boolean retainAll(java.util.Collection<?>);
+ method public int size();
+ method public Object![] toArray();
+ method public <T> T![] toArray(T![]);
+ method public E! valueAt(int);
+ }
+
+ public final class CircularArray<E> {
+ ctor public CircularArray();
+ ctor public CircularArray(int);
+ method public void addFirst(E!);
+ method public void addLast(E!);
+ method public void clear();
+ method public E! get(int);
+ method public E! getFirst();
+ method public E! getLast();
+ method public boolean isEmpty();
+ method public E! popFirst();
+ method public E! popLast();
+ method public void removeFromEnd(int);
+ method public void removeFromStart(int);
+ method public int size();
+ }
+
+ public final class CircularIntArray {
+ ctor public CircularIntArray();
+ ctor public CircularIntArray(int);
+ method public void addFirst(int);
+ method public void addLast(int);
+ method public void clear();
+ method public int get(int);
+ method public int getFirst();
+ method public int getLast();
+ method public boolean isEmpty();
+ method public int popFirst();
+ method public int popLast();
+ method public void removeFromEnd(int);
+ method public void removeFromStart(int);
+ method public int size();
+ }
+
+ public class LongSparseArray<E> implements java.lang.Cloneable {
+ ctor public LongSparseArray();
+ ctor public LongSparseArray(int);
+ method public void append(long, E!);
+ method public void clear();
+ method public androidx.collection.LongSparseArray<E!>! clone();
+ method public boolean containsKey(long);
+ method public boolean containsValue(E!);
+ method @Deprecated public void delete(long);
+ method public E? get(long);
+ method public E! get(long, E!);
+ method public int indexOfKey(long);
+ method public int indexOfValue(E!);
+ method public boolean isEmpty();
+ method public long keyAt(int);
+ method public void put(long, E!);
+ method public void putAll(androidx.collection.LongSparseArray<? extends E>);
+ method public E? putIfAbsent(long, E!);
+ method public void remove(long);
+ method public boolean remove(long, Object!);
+ method public void removeAt(int);
+ method public E? replace(long, E!);
+ method public boolean replace(long, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+ public class LruCache<K, V> {
+ ctor public LruCache(int);
+ method protected V? create(K);
+ method public final int createCount();
+ method protected void entryRemoved(boolean, K, V, V?);
+ method public final void evictAll();
+ method public final int evictionCount();
+ method public final V? get(K);
+ method public final int hitCount();
+ method public final int maxSize();
+ method public final int missCount();
+ method public final V? put(K, V);
+ method public final int putCount();
+ method public final V? remove(K);
+ method public void resize(int);
+ method public final int size();
+ method protected int sizeOf(K, V);
+ method public final java.util.Map<K!,V!>! snapshot();
+ method public final String toString();
+ method public void trimToSize(int);
+ }
+
+ public class SimpleArrayMap<K, V> {
+ ctor public SimpleArrayMap();
+ ctor public SimpleArrayMap(int);
+ ctor public SimpleArrayMap(androidx.collection.SimpleArrayMap<K!,V!>!);
+ method public void clear();
+ method public boolean containsKey(Object?);
+ method public boolean containsValue(Object!);
+ method public void ensureCapacity(int);
+ method public V? get(Object!);
+ method public V! getOrDefault(Object!, V!);
+ method public int indexOfKey(Object?);
+ method public boolean isEmpty();
+ method public K! keyAt(int);
+ method public V? put(K!, V!);
+ method public void putAll(androidx.collection.SimpleArrayMap<? extends K,? extends V>);
+ method public V? putIfAbsent(K!, V!);
+ method public V? remove(Object!);
+ method public boolean remove(Object!, Object!);
+ method public V! removeAt(int);
+ method public V? replace(K!, V!);
+ method public boolean replace(K!, V!, V!);
+ method public V! setValueAt(int, V!);
+ method public int size();
+ method public V! valueAt(int);
+ }
+
+ public class SparseArrayCompat<E> implements java.lang.Cloneable {
+ ctor public SparseArrayCompat();
+ ctor public SparseArrayCompat(int);
+ method public void append(int, E!);
+ method public void clear();
+ method public androidx.collection.SparseArrayCompat<E!>! clone();
+ method public boolean containsKey(int);
+ method public boolean containsValue(E!);
+ method @Deprecated public void delete(int);
+ method public E? get(int);
+ method public E! get(int, E!);
+ method public int indexOfKey(int);
+ method public int indexOfValue(E!);
+ method public boolean isEmpty();
+ method public int keyAt(int);
+ method public void put(int, E!);
+ method public void putAll(androidx.collection.SparseArrayCompat<? extends E>);
+ method public E? putIfAbsent(int, E!);
+ method public void remove(int);
+ method public boolean remove(int, Object!);
+ method public void removeAt(int);
+ method public void removeAtRange(int, int);
+ method public E? replace(int, E!);
+ method public boolean replace(int, E!, E!);
+ method public void setValueAt(int, E!);
+ method public int size();
+ method public E! valueAt(int);
+ }
+
+}
+
diff --git a/collection2/collection2/src/commonMain/kotlin/androidx/collection/LruCache.kt b/collection2/collection2/src/commonMain/kotlin/androidx/collection/LruCache.kt
index 36f9739..621e729 100644
--- a/collection2/collection2/src/commonMain/kotlin/androidx/collection/LruCache.kt
+++ b/collection2/collection2/src/commonMain/kotlin/androidx/collection/LruCache.kt
@@ -20,7 +20,7 @@
import kotlin.jvm.JvmName
/**
- * Static library version of {@code android.util.LruCache}. Used to write apps
+ * Static library version of `android.util.LruCache`. Used to write apps
* that run on API levels prior to 12. When running on API level 12 or above,
* this implementation is still used; it does not try to switch to the
* framework's implementation. See the framework SDK documentation for a class
@@ -36,7 +36,7 @@
@get:JvmName("size")
public var size: Int = 0
/**
- * For caches that do not override {@link #sizeOf}, this returns the number
+ * For caches that do not override [sizeOf], this returns the number
* of entries in the cache. For all other caches, this returns the sum of
* the sizes of the entries in this cache.
*/
@@ -52,7 +52,7 @@
private var missCount = 0
/**
- * @param maxSize for caches that do not override {@link #sizeOf}, this is
+ * @param maxSize for caches that do not override [sizeOf], this is
* the maximum number of entries in the cache. For all other caches,
* this is the maximum sum of the sizes of the entries in this cache.
*/
@@ -79,9 +79,9 @@
}
/**
- * Returns the value for {@code key} if it exists in the cache or can be
- * created by {@code #create}. If a value was returned, it is moved to the
- * head of the queue. This returns null if a value is not cached and cannot
+ * Returns the value for [key] if it exists in the cache or can be
+ * created by [create]. If a value was returned, it is moved to the
+ * head of the queue. This returns `null` if a value is not cached and cannot
* be created.
*/
@JsName("get")
@@ -239,17 +239,17 @@
/**
* Called for entries that have been evicted or removed. This method is
* invoked when a value is evicted to make space, removed by a call to
- * {@link #remove}, or replaced by a call to {@link #put}. The default
+ * [remove], or replaced by a call to [put]. The default
* implementation does nothing.
*
* The method is called without synchronization: other threads may
* access the cache while this method is executing.
*
- * @param evicted true if the entry is being removed to make space, false
- * if the removal was caused by a {@link #put} or {@link #remove}.
- * @param newValue the new value for {@code key}, if it exists. If non-null,
- * this removal was caused by a {@link #put}. Otherwise it was caused by
- * an eviction or a {@link #remove}.
+ * @param evicted `true` if the entry is being removed to make space, `false`
+ * if the removal was caused by a [put] or [remove].
+ * @param newValue the new value for [key], if it exists. If non-null,
+ * this removal was caused by a [put]. Otherwise it was caused by
+ * an eviction or a [remove].
*/
protected open fun entryRemoved(evicted: Boolean, key: K, oldValue: V, newValue: V?) {
}
@@ -262,11 +262,11 @@
* The method is called without synchronization: other threads may
* access the cache while this method is executing.
*
- * If a value for {@code key} exists in the cache when this method
- * returns, the created value will be released with {@link #entryRemoved}
+ * If a value for [key] exists in the cache when this method
+ * returns, the created value will be released with [entryRemoved]
* and discarded. This can occur when multiple threads request the same key
* at the same time (causing multiple values to be created), or when one
- * thread calls {@link #put} while another is creating a value for the same
+ * thread calls [put] while another is creating a value for the same
* key.
*/
@JsName("create")
@@ -279,7 +279,7 @@
}
/**
- * Returns the size of the entry for {@code key} and {@code value} in
+ * Returns the size of the entry for [key] and [value] in
* user-defined units. The default implementation returns 1 so that size
* is the number of entries and max size is the maximum number of entries.
*
@@ -288,38 +288,38 @@
protected open fun sizeOf(key: K, value: V) = 1
/**
- * Clear the cache, calling {@link #entryRemoved} on each removed entry.
+ * Clear the cache, calling [entryRemoved] on each removed entry.
*/
fun evictAll() {
trimToSize(-1) // -1 will evict 0-sized elements
}
/**
- * For caches that do not override {@link #sizeOf}, this returns the maximum
+ * For caches that do not override [sizeOf], this returns the maximum
* number of entries in the cache. For all other caches, this returns the
* maximum sum of the sizes of the entries in this cache.
*/
fun maxSize(): Int = synchronizedValue { maxSize }
/**
- * Returns the number of times {@link #get} returned a value that was
+ * Returns the number of times [get] returned a value that was
* already present in the cache.
*/
fun hitCount(): Int = synchronizedValue { hitCount }
/**
- * Returns the number of times {@link #get} returned null or required a new
+ * Returns the number of times [get] returned null or required a new
* value to be created.
*/
fun missCount(): Int = synchronizedValue { missCount }
/**
- * Returns the number of times {@link #create(Object)} returned a value.
+ * Returns the number of times [create] returned a value.
*/
fun createCount(): Int = synchronizedValue { createCount }
/**
- * Returns the number of times {@link #put} was called.
+ * Returns the number of times [put] was called.
*/
fun putCount(): Int = synchronizedValue { putCount }
diff --git a/collection2/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt b/collection2/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt
index da4523a7..f7c857c 100644
--- a/collection2/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt
+++ b/collection2/collection2/src/commonMain/kotlin/androidx/collection/SimpleArrayMap.kt
@@ -253,11 +253,11 @@
}
/**
- * Retrieve a value from the array, or {@code defaultValue} if there is no mapping for the key.
+ * Retrieve a value from the array, or [defaultValue] if there is no mapping for the key.
* @param key The key of the value to retrieve.
* @param defaultValue The default mapping of the key
* @return Returns the value associated with the given key,
- * or {@code defaultValue} if there is no mapping for the key.
+ * or [defaultValue] if there is no mapping for the key.
*/
@Suppress("UNCHECKED_CAST")
open fun getOrDefault(key: K, defaultValue: V): V {
@@ -267,7 +267,7 @@
/**
* Return the key at the given index in the array.
- * @param index The desired index, must be between 0 and {@link #size()}-1.
+ * @param index The desired index, must be between 0 and [size]-1.
* @return Returns the key stored at the given index.
*/
@Suppress("UNCHECKED_CAST")
@@ -275,7 +275,7 @@
/**
* Return the value at the given index in the array.
- * @param index The desired index, must be between 0 and {@link #size()}-1.
+ * @param index The desired index, must be between 0 and [size]-1.
* @return Returns the value stored at the given index.
*/
@Suppress("UNCHECKED_CAST")
@@ -283,7 +283,7 @@
/**
* Set the value at a given index in the array.
- * @param index The desired index, must be between 0 and {@link #size()}-1.
+ * @param index The desired index, must be between 0 and [size]-1.
* @param value The new value to store at this index.
* @return Returns the previous value at the given index.
*/
@@ -369,7 +369,7 @@
}
/**
- * Perform a {@link #put(Object, Object)} of all key/value pairs in <var>array</var>
+ * Perform a [put] of all key/value pairs in <var>array</var>
* @param array The array whose contents are to be retrieved.
*/
open fun putAll(array: SimpleArrayMap<out K, out V>) {
@@ -390,7 +390,7 @@
/**
* Add a new value to the array map only if the key does not already have a value or it is
- * mapped to {@code null}.
+ * mapped to `null`.
* @param key The key under which to store the value.
* @param value The value to store for the given key.
* @return Returns the value that was stored for the given key, or null if there
@@ -416,7 +416,7 @@
}
/**
- * Remove an existing key from the array map only if it is currently mapped to {@code value}.
+ * Remove an existing key from the array map only if it is currently mapped to [value].
* @param key The key of the mapping to remove.
* @param value The value expected to be mapped to the key.
* @return Returns true if the mapping was removed.
@@ -435,7 +435,7 @@
/**
* Remove the key/value mapping at the given index.
- * @param index The desired index, must be between 0 and {@link #size()}-1.
+ * @param index The desired index, must be between 0 and [size]-1.
* @return Returns the value that was stored at this index.
* @throws ConcurrentModificationException if the map has been concurrently modified.
*/
@@ -501,7 +501,7 @@
}
/**
- * Replace the mapping for {@code key} only if it is already mapped to a value.
+ * Replace the mapping for [key] only if it is already mapped to a value.
* @param key The key of the mapping to replace.
* @param value The value to store for the given key.
* @return Returns the previous mapped value or null.
@@ -512,7 +512,7 @@
}
/**
- * Replace the mapping for {@code key} only if it is already mapped to a value.
+ * Replace the mapping for [key] only if it is already mapped to a value.
*
* @param key The key of the mapping to replace.
* @param oldValue The value expected to be mapped to the key.
diff --git a/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.kt b/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.kt
index 68d3605..0e39c2c 100644
--- a/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.kt
+++ b/collection2/collection2/src/nonJvmMain/kotlin/androidx/collection/ArrayMap.kt
@@ -38,7 +38,7 @@
}
/**
- * Perform a {@link #put(Object, Object)} of all key/value pairs in <var>map</var>
+ * Perform a [put] of all key/value pairs in <var>map</var>
* @param from The map whose contents are to be retrieved.
*/
override fun putAll(from: Map<out K, V>) {
@@ -78,17 +78,17 @@
}
/**
- * Return a {@link Set} for iterating over and interacting with all mappings
+ * Return a [Set] for iterating over and interacting with all mappings
* in the array map.
*
* <p><b>Note:</b> this is a very inefficient way to access the array contents, it
* requires generating a number of temporary objects.</p>
*
* <p><b>Note:</b></p> the semantics of this
- * Set are subtly different than that of a {@link HashMap}: most important,
- * the {@link Map.Entry Map.Entry} object returned by its iterator is a single
+ * Set are subtly different than that of a [HashMap]: most important,
+ * the [Map.Entry] object returned by its iterator is a single
* object that exists for the entire iterator, so you can <b>not</b> hold on to it
- * after calling {@link Iterator#next() Iterator.next}.</p>
+ * after calling [Iterator.next].</p>
*/
override val entries: MutableSet<MutableMap.MutableEntry<K, V>>
get() {
@@ -98,7 +98,7 @@
private var _entries: EntrySet<K, V>? = null
/**
- * Return a {@link Set} for iterating over and interacting with all keys
+ * Return a [Set] for iterating over and interacting with all keys
* in the array map.
*
* <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
@@ -112,7 +112,7 @@
private var _keys: KeySet<K, V>? = null
/**
- * Return a {@link Collection} for iterating over and interacting with all values
+ * Return a [Collection] for iterating over and interacting with all values
* in the array map.
*
* <p><b>Note:</b> this is a fairly inefficient way to access the array contents, it
diff --git a/compose/animation/animation-core/build.gradle b/compose/animation/animation-core/build.gradle
index d6a01a7..30a3cfe 100644
--- a/compose/animation/animation-core/build.gradle
+++ b/compose/animation/animation-core/build.gradle
@@ -61,6 +61,8 @@
androidTestImplementation(project(":compose:test-utils"))
lintPublish project(":compose:animation:animation-core-lint")
+
+ samples(project(":compose:animation:animation-core:animation-core-samples"))
}
}
diff --git a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt
index 7172064..7d04945 100644
--- a/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt
+++ b/compose/animation/animation-core/samples/src/main/java/androidx/compose/animation/core/samples/TransitionSamples.kt
@@ -405,6 +405,7 @@
NumberPad
}
+@Sampled
@OptIn(ExperimentalTransitionApi::class)
@Composable
fun TransitionStateIsIdleSample() {
diff --git a/compose/animation/animation-graphics/build.gradle b/compose/animation/animation-graphics/build.gradle
index b102bdf..38bd9d9 100644
--- a/compose/animation/animation-graphics/build.gradle
+++ b/compose/animation/animation-graphics/build.gradle
@@ -29,7 +29,6 @@
dependencies {
kotlinPlugin(project(":compose:compiler:compiler"))
-
if(!AndroidXComposePlugin.isMultiplatformEnabled(project)) {
/*
* When updating dependencies, make sure to make the an an analogous update in the
@@ -58,6 +57,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(project(":compose:animation:animation-graphics:animation-graphics-samples"))
}
}
diff --git a/compose/animation/animation/build.gradle b/compose/animation/animation/build.gradle
index b204e6e..395cbfd 100644
--- a/compose/animation/animation/build.gradle
+++ b/compose/animation/animation/build.gradle
@@ -58,6 +58,8 @@
androidTestImplementation(libs.junit)
lintPublish project(":compose:animation:animation-lint")
+
+ samples(project(":compose:animation:animation:animation-samples"))
}
}
diff --git a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
index 8b8e9d3..d5d3c7b 100644
--- a/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
+++ b/compose/compiler/compiler-hosted/integration-tests/src/test/java/androidx/compose/compiler/plugins/kotlin/ComposerParamSignatureTests.kt
@@ -125,6 +125,19 @@
)
@Test
+ fun testArrayListSizeOverride(): Unit = validateBytecode(
+ """
+ class CustomList : ArrayList<Any>() {
+ override val size: Int
+ get() = super.size
+ }
+ """, dumpClasses = true
+ ) {
+ assertTrue(it.contains("INVOKESPECIAL java/util/ArrayList.size ()I"))
+ assertFalse(it.contains("INVOKESPECIAL java/util/ArrayList.getSize ()I"))
+ }
+
+ @Test
fun test32Params(): Unit = codegen(
"""
@Composable
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt
index 4851232..0b0797b 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/BuildMetrics.kt
@@ -99,7 +99,8 @@
fun Appendable.appendComposablesCsv()
fun Appendable.appendComposablesTxt()
fun Appendable.appendClassesTxt()
- fun saveTo(directory: String)
+ fun saveMetricsTo(directory: String)
+ fun saveReportsTo(directory: String)
fun makeFunctionMetrics(function: IrFunction): FunctionMetrics
}
@@ -115,7 +116,8 @@
override fun Appendable.appendComposablesCsv() {}
override fun Appendable.appendComposablesTxt() {}
override fun Appendable.appendClassesTxt() {}
- override fun saveTo(directory: String) {}
+ override fun saveMetricsTo(directory: String) {}
+ override fun saveReportsTo(directory: String) {}
override fun makeFunctionMetrics(function: IrFunction): FunctionMetrics = EmptyFunctionMetrics
}
@@ -391,7 +393,7 @@
}
}
- override fun saveTo(directory: String) {
+ override fun saveMetricsTo(directory: String) {
val dir = File(directory)
val prefix = name
.replace('.', '_')
@@ -400,7 +402,14 @@
File(dir, "$prefix-module.json").write {
appendModuleJson()
}
+ }
+ override fun saveReportsTo(directory: String) {
+ val dir = File(directory)
+ val prefix = name
+ .replace('.', '_')
+ .replace("<", "")
+ .replace(">", "")
File(dir, "$prefix-composables.csv").write {
appendComposablesCsv()
}
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
index 2e21020..c559cb6 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposeIrGenerationExtension.kt
@@ -48,7 +48,8 @@
private val sourceInformationEnabled: Boolean = true,
private val intrinsicRememberEnabled: Boolean = true,
private val decoysEnabled: Boolean = false,
- private val metricsDestination: String? = null
+ private val metricsDestination: String? = null,
+ private val reportsDestination: String? = null
) : IrGenerationExtension {
var metrics: ModuleMetrics = EmptyModuleMetrics
@OptIn(ObsoleteDescriptorBasedAPI::class)
@@ -69,8 +70,11 @@
// create a symbol remapper to be used across all transforms
val symbolRemapper = ComposableSymbolRemapper()
- if (metricsDestination != null) {
- metrics = ModuleMetricsImpl(moduleFragment.name.asString(), pluginContext)
+ if (metricsDestination != null || reportsDestination != null) {
+ metrics = ModuleMetricsImpl(
+ moduleFragment.name.asString(),
+ pluginContext
+ )
}
ClassStabilityTransformer(
@@ -183,7 +187,10 @@
}
if (metricsDestination != null) {
- metrics.saveTo(metricsDestination)
+ metrics.saveMetricsTo(metricsDestination)
+ }
+ if (reportsDestination != null) {
+ metrics.saveReportsTo(reportsDestination)
}
}
}
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
index d816b6b..6bbd5a2 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/ComposePlugin.kt
@@ -45,6 +45,8 @@
CompilerConfigurationKey<Boolean>("Include source information in generated code")
val METRICS_DESTINATION_KEY =
CompilerConfigurationKey<String>("Directory to save compose build metrics")
+ val REPORTS_DESTINATION_KEY =
+ CompilerConfigurationKey<String>("Directory to save compose build reports")
val INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY =
CompilerConfigurationKey<Boolean>("Enable optimization to treat remember as an intrinsic")
val SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK =
@@ -84,6 +86,13 @@
required = false,
allowMultipleOccurrences = false
)
+ val REPORTS_DESTINATION_OPTION = CliOption(
+ "reportsDestination",
+ "<path>",
+ "Save compose build reports to this folder",
+ required = false,
+ allowMultipleOccurrences = false
+ )
val INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION = CliOption(
"intrinsicRemember",
"<true|false>",
@@ -113,6 +122,7 @@
LIVE_LITERALS_V2_ENABLED_OPTION,
SOURCE_INFORMATION_ENABLED_OPTION,
METRICS_DESTINATION_OPTION,
+ REPORTS_DESTINATION_OPTION,
INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION,
SUPPRESS_KOTLIN_VERSION_CHECK_ENABLED_OPTION,
DECOYS_ENABLED_OPTION,
@@ -139,6 +149,10 @@
ComposeConfiguration.METRICS_DESTINATION_KEY,
value
)
+ REPORTS_DESTINATION_OPTION -> configuration.put(
+ ComposeConfiguration.REPORTS_DESTINATION_KEY,
+ value
+ )
INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_OPTION -> configuration.put(
ComposeConfiguration.INTRINSIC_REMEMBER_OPTIMIZATION_ENABLED_KEY,
value == "true"
@@ -173,7 +187,7 @@
project: Project,
configuration: CompilerConfiguration
) {
- val KOTLIN_VERSION_EXPECTATION = "1.5.30"
+ val KOTLIN_VERSION_EXPECTATION = "1.5.31"
KotlinCompilerVersion.getVersion()?.let { version ->
val suppressKotlinVersionCheck = configuration.get(
ComposeConfiguration.SUPPRESS_KOTLIN_VERSION_COMPATIBILITY_CHECK,
@@ -224,6 +238,12 @@
).let {
if (it.isBlank()) null else it
}
+ val reportsDestination = configuration.get(
+ ComposeConfiguration.REPORTS_DESTINATION_KEY,
+ ""
+ ).let {
+ if (it.isBlank()) null else it
+ }
StorageComponentContainerContributor.registerExtension(
project,
@@ -252,6 +272,7 @@
intrinsicRememberEnabled = intrinsicRememberEnabled,
decoysEnabled = decoysEnabled,
metricsDestination = metricsDestination,
+ reportsDestination = reportsDestination,
)
)
DescriptorSerializerPlugin.registerExtension(
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
index c1be5cc..cef6acf 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/VersionChecker.kt
@@ -55,6 +55,7 @@
4200 to "1.1.0-alpha03",
4300 to "1.1.0-alpha04",
4400 to "1.1.0-alpha05",
+ 4500 to "1.1.0-alpha06",
)
/**
@@ -67,7 +68,7 @@
* The maven version string of this compiler. This string should be updated before/after every
* release.
*/
- const val compilerVersion: String = "1.1.0-alpha05"
+ const val compilerVersion: String = "1.1.0-alpha06"
private val minimumRuntimeVersion: String
get() = versionTable[minimumRuntimeVersionInt] ?: "unknown"
}
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
index 7f2efdf..3437af9 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/AbstractComposeLowering.kt
@@ -54,7 +54,6 @@
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
-import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
import org.jetbrains.kotlin.ir.builders.IrBlockBodyBuilder
import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope
import org.jetbrains.kotlin.ir.builders.declarations.buildField
@@ -149,6 +148,7 @@
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.resolve.source.PsiSourceElement
import org.jetbrains.kotlin.types.KotlinType
+import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.DFS
@Suppress("DEPRECATION")
@@ -626,7 +626,7 @@
protected fun irAnd(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
return irCall(
- lhs.type.binaryOperator(OperatorNames.AND, rhs.type),
+ lhs.type.binaryOperator(OperatorNameConventions.AND, rhs.type),
null,
lhs,
null,
@@ -637,7 +637,7 @@
protected fun irInv(lhs: IrExpression): IrCallImpl {
val int = context.irBuiltIns.intType
return irCall(
- int.unaryOperator(OperatorNames.INV),
+ int.unaryOperator(OperatorNameConventions.INV),
null,
lhs
)
@@ -646,7 +646,7 @@
protected fun irOr(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
val int = context.irBuiltIns.intType
return irCall(
- int.binaryOperator(OperatorNames.OR, int),
+ int.binaryOperator(OperatorNameConventions.OR, int),
null,
lhs,
null,
@@ -657,7 +657,7 @@
protected fun irBooleanOr(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
val boolean = context.irBuiltIns.booleanType
return irCall(
- boolean.binaryOperator(OperatorNames.OR, boolean),
+ boolean.binaryOperator(OperatorNameConventions.OR, boolean),
null,
lhs,
null,
@@ -714,7 +714,7 @@
protected fun irXor(lhs: IrExpression, rhs: IrExpression): IrCallImpl {
val int = context.irBuiltIns.intType
return irCall(
- int.binaryOperator(OperatorNames.XOR, int),
+ int.binaryOperator(OperatorNameConventions.XOR, int),
null,
lhs,
null,
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
index c2f287f..df47f3d 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableFunctionBodyTransformer.kt
@@ -47,7 +47,6 @@
import org.jetbrains.kotlin.ir.IrStatement
import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
-import org.jetbrains.kotlin.ir.backend.js.utils.OperatorNames
import org.jetbrains.kotlin.ir.builders.declarations.addValueParameter
import org.jetbrains.kotlin.ir.builders.irBlockBody
import org.jetbrains.kotlin.ir.builders.irCall
@@ -155,6 +154,7 @@
import org.jetbrains.kotlin.resolve.BindingTrace
import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameSafe
import org.jetbrains.kotlin.types.typeUtil.isUnit
+import org.jetbrains.kotlin.util.OperatorNameConventions
import kotlin.math.abs
import kotlin.math.absoluteValue
import kotlin.math.ceil
@@ -3031,7 +3031,7 @@
irCall(
int.binaryOperator(
- OperatorNames.SHL,
+ OperatorNameConventions.SHL,
int
),
null,
@@ -4054,11 +4054,11 @@
if (bitsToShiftLeft == 0) return value
val int = context.irBuiltIns.intType
val shiftLeft = int.binaryOperator(
- OperatorNames.SHL,
+ OperatorNameConventions.SHL,
int
)
val shiftRight = int.binaryOperator(
- OperatorNames.SHR,
+ OperatorNameConventions.SHR,
int
)
diff --git a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt
index 0109a61..23b1648 100644
--- a/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt
+++ b/compose/compiler/compiler-hosted/src/main/java/androidx/compose/compiler/plugins/kotlin/lower/ComposableTypeRemapper.kt
@@ -236,13 +236,17 @@
) {
if (ownerFn.correspondingPropertySymbol != null) {
val property = ownerFn.correspondingPropertySymbol!!.owner
- symbolRemapper.visitProperty(property)
- visitProperty(property).also {
- it.getter?.correspondingPropertySymbol = it.symbol
- it.setter?.correspondingPropertySymbol = it.symbol
- it.parent = ownerFn.parent
- it.patchDeclarationParents(it.parent)
- it.copyAttributes(property)
+ // avoid java properties since they go through a different lowering and it is
+ // also impossible for them to have composable types
+ if (property.origin != IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB) {
+ symbolRemapper.visitProperty(property)
+ visitProperty(property).also {
+ it.getter?.correspondingPropertySymbol = it.symbol
+ it.setter?.correspondingPropertySymbol = it.symbol
+ it.parent = ownerFn.parent
+ it.patchDeclarationParents(it.parent)
+ it.copyAttributes(property)
+ }
}
} else {
symbolRemapper.visitSimpleFunction(ownerFn)
diff --git a/compose/desktop/desktop/build.gradle b/compose/desktop/desktop/build.gradle
index 06539d4..0428946 100644
--- a/compose/desktop/desktop/build.gradle
+++ b/compose/desktop/desktop/build.gradle
@@ -94,12 +94,14 @@
PublicationContainer.metaClass.jvmOs = { name, skikoDeps ->
delegate.create("jvm$name", MavenPublication) {
artifactId = "${project.name}-jvm-$name"
+ def projectGroup = project.group
+ def projectName = project.name
pom {
withXml {
def dependenciesNode = asNode().appendNode("dependencies")
def desktopDependency = dependenciesNode.appendNode("dependency")
- desktopDependency.appendNode("groupId", group)
- desktopDependency.appendNode("artifactId", project.name)
+ desktopDependency.appendNode("groupId", projectGroup)
+ desktopDependency.appendNode("artifactId", projectName)
desktopDependency.appendNode("version", LibraryVersions.COMPOSE)
desktopDependency.appendNode("scope", "compile")
for (skiko in skikoDeps) {
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
index e1d2611..c10893f 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/example1/Main.jvm.kt
@@ -18,7 +18,6 @@
import androidx.compose.animation.animateColorAsState
import androidx.compose.animation.core.TweenSpec
-import androidx.compose.foundation.ExperimentalDesktopApi
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.Image
import androidx.compose.foundation.ScrollState
@@ -106,12 +105,12 @@
import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextDecoration.Companion.Underline
import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.em
import androidx.compose.ui.unit.sp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.FrameWindowScope
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.launchApplication
import androidx.compose.ui.window.rememberWindowState
@@ -197,10 +196,7 @@
)
}
-@OptIn(
- ExperimentalComposeUiApi::class,
- ExperimentalDesktopApi::class
-)
+@OptIn(ExperimentalComposeUiApi::class)
@Composable
private fun FrameWindowScope.ScrollableContent(scrollState: ScrollState) {
val amount = remember { mutableStateOf(0f) }
@@ -379,7 +375,7 @@
}
var clickableText by remember { mutableStateOf("Click me!") }
-
+ @OptIn(ExperimentalFoundationApi::class)
Text(
modifier = Modifier.mouseClickable(
onClick = {
@@ -424,7 +420,7 @@
GlobalScope.launchApplication {
Window(
onCloseRequest = ::exitApplication,
- state = rememberWindowState(size = WindowSize(400.dp, 200.dp)),
+ state = rememberWindowState(size = DpSize(400.dp, 200.dp)),
onPreviewKeyEvent = {
if (it.key == Key.Escape) {
exitApplication()
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
index c10f5dc..2b9d6c4 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/AppContent.jvm.kt
@@ -16,10 +16,10 @@
package androidx.compose.desktop.examples.popupexample
+import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background
-import androidx.compose.foundation.BoxWithTooltip
+import androidx.compose.foundation.TooltipArea
import androidx.compose.foundation.TooltipPlacement
-import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
@@ -56,6 +56,7 @@
import androidx.compose.ui.awt.SwingPanel
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
@@ -67,14 +68,12 @@
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.WindowScope
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.rememberWindowState
import java.awt.event.ActionEvent
import java.awt.event.ActionListener
import javax.swing.JButton
-@OptIn(ExperimentalMaterialApi::class)
@Composable
fun WindowScope.Content(
windowState: WindowState,
@@ -251,6 +250,7 @@
dialogState.value = false
println("Dialog window is dismissed.")
}
+ @OptIn(ExperimentalMaterialApi::class)
if (AppState.alertDialog.value) {
AlertDialog(
onDismissRequest = dismiss,
@@ -352,7 +352,8 @@
color: Color = Color(10, 162, 232),
size: IntSize = IntSize(200, 35)
) {
- BoxWithTooltip(
+ @OptIn(ExperimentalFoundationApi::class)
+ TooltipArea(
tooltip = {
Surface(
color = Color(210, 210, 210),
@@ -388,14 +389,16 @@
}
}
-@OptIn(ExperimentalComposeUiApi::class)
@Composable
+@OptIn(
+ ExperimentalFoundationApi::class
+)
fun ContextMenu() {
val items = listOf("Item A", "Item B", "Item C", "Item D", "Item E", "Item F")
val showMenu = remember { mutableStateOf(false) }
val selectedIndex = remember { mutableStateOf(0) }
- BoxWithTooltip(
- delay = 100,
+ TooltipArea(
+ delayMillis = 100,
tooltipPlacement = TooltipPlacement.ComponentRect(
anchor = Alignment.TopStart,
alignment = Alignment.TopEnd
@@ -541,7 +544,7 @@
@Composable
fun ApplicationScope.SecondaryWindow(onCloseRequest: () -> Unit) = Window(
onCloseRequest = onCloseRequest,
- state = rememberWindowState(size = WindowSize(400.dp, 200.dp)),
+ state = rememberWindowState(size = DpSize(400.dp, 200.dp)),
undecorated = AppState.undecorated.value,
) {
WindowContent(
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
index 80bcbee..3d99ae2 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/popupexample/Main.jvm.kt
@@ -18,18 +18,18 @@
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.key
-import androidx.compose.ui.graphics.asPainter
+import androidx.compose.ui.graphics.toPainter
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Tray
import androidx.compose.ui.window.Window
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberTrayState
import androidx.compose.ui.window.rememberWindowState
fun main() = application {
val windowState = rememberWindowState(
- size = WindowSize(800.dp, 600.dp)
+ size = DpSize(800.dp, 600.dp)
)
val trayState = rememberTrayState()
@@ -37,7 +37,7 @@
if (AppState.isMainWindowOpen) {
Tray(
state = trayState,
- icon = AppState.image().asPainter(),
+ icon = AppState.image().toPainter(),
menu = {
ActionItems(trayState)
}
@@ -47,7 +47,7 @@
onCloseRequest = AppState::closeMainWindow,
title = AppState.wndTitle.value,
state = windowState,
- icon = AppState.image().asPainter(),
+ icon = AppState.image().toPainter(),
) {
MainMenuBar(windowState, trayState)
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt
index f202452..cb1aa60 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/swingexample/Main.jvm.kt
@@ -40,11 +40,11 @@
import androidx.compose.ui.awt.ComposePanel
import androidx.compose.ui.awt.SwingPanel
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.ApplicationScope
import androidx.compose.ui.window.Window
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.launchApplication
import androidx.compose.ui.window.rememberWindowState
import kotlinx.coroutines.DelicateCoroutinesApi
@@ -158,7 +158,7 @@
GlobalScope.launchApplication {
Window(
onCloseRequest = ::exitApplication,
- state = rememberWindowState(size = WindowSize(400.dp, 250.dp))
+ state = rememberWindowState(size = DpSize(400.dp, 250.dp))
) {
SecondWindowContent()
}
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt
index 11f1317..331a34e 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/vsynctest/Main.jvm.kt
@@ -29,10 +29,10 @@
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.ApplicationScope
import androidx.compose.ui.window.Window
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.application
import androidx.compose.ui.window.rememberWindowState
@@ -83,7 +83,7 @@
Window(
onCloseRequest = ::exitApplication,
- state = rememberWindowState(size = WindowSize(800.dp, 200.dp))
+ state = rememberWindowState(size = DpSize(800.dp, 200.dp))
) {
val width = (LocalDensity.current.density * window.width).toInt()
val singleFrameMillis = remember {
diff --git a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt
index d7624ae..e360681 100644
--- a/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt
+++ b/compose/desktop/desktop/samples/src/jvmMain/kotlin/androidx/compose/desktop/examples/windowapi/Examples.jvm.kt
@@ -35,7 +35,7 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.ComposeWindow
import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.graphics.asPainter
+import androidx.compose.ui.graphics.toPainter
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyShortcut
import androidx.compose.ui.input.key.key
@@ -43,6 +43,7 @@
import androidx.compose.ui.res.loadSvgPainter
import androidx.compose.ui.res.useResource
import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.ApplicationScope
import androidx.compose.ui.window.AwtWindow
@@ -54,7 +55,6 @@
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.WindowPosition
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.awaitApplication
import androidx.compose.ui.window.launchApplication
@@ -192,7 +192,7 @@
if (!isVisible) {
Tray(
icon,
- hint = "Counter",
+ tooltip = "Counter",
onAction = { isVisible = true },
menu = {
Item("Exit", onClick = ::exitApplication)
@@ -346,7 +346,7 @@
var icon: Painter? by remember { mutableStateOf(null) }
LaunchedEffect(Unit) {
- icon = loadAwtIcon()?.asPainter()
+ icon = loadAwtIcon().toPainter()
}
Window(onCloseRequest = ::exitApplication, icon = icon) {}
@@ -446,7 +446,7 @@
@OptIn(DelicateCoroutinesApi::class)
fun setSize() = GlobalScope.launchApplication {
var isOpen by remember { mutableStateOf(true) }
- val state = rememberWindowState(size = WindowSize(400.dp, 100.dp))
+ val state = rememberWindowState(size = DpSize(400.dp, 100.dp))
if (isOpen) {
Window(onCloseRequest = ::exitApplication, state = state) {}
@@ -665,13 +665,13 @@
}
}
- Tray(icon, hint = "Tray1")
+ Tray(icon, tooltip = "Tray1")
if (state.isTray2Visible) {
Tray(
icon = icon,
state = state.tray,
- hint = "Tray2",
+ tooltip = "Tray2",
menu = {
Menu("Submenu") {
Item(
diff --git a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt b/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt
deleted file mode 100644
index 5f36b41..0000000
--- a/compose/desktop/desktop/src/jvmMain/kotlin/androidx/compose/ui/window/WindowDraggableArea.jvm.kt
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.window
-
-import androidx.compose.desktop.LocalAppWindow
-import androidx.compose.foundation.gestures.awaitFirstDown
-import androidx.compose.foundation.gestures.drag
-import androidx.compose.foundation.gestures.forEachGesture
-import androidx.compose.foundation.layout.Box
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.pointer.pointerInput
-import androidx.compose.ui.unit.IntOffset
-import java.awt.event.MouseAdapter
-import java.awt.event.MouseEvent
-import java.awt.event.MouseMotionAdapter
-import java.awt.MouseInfo
-import java.awt.Point
-
-/**
- * WindowDraggableArea is a component that allows you to drag the window using the mouse.
- *
- * @param modifier The modifier to be applied to the layout.
- */
-@Deprecated(
- "Use another variant of WindowDraggableArea for the new Composable Window API (https://github" +
- ".com/JetBrains/compose-jb/tree/master/tutorials/Window_API_new)",
- replaceWith = ReplaceWith(
- "WindowDraggableArea(modifier, content)",
- "androidx.compose.foundation.window.WindowDraggableArea"
- )
-)
-@Suppress("DEPRECATION")
-@Composable
-fun WindowDraggableArea(
- modifier: Modifier = Modifier,
- content: @Composable() () -> Unit = {}
-) {
- val window = LocalAppWindow.current
- val handler = remember { DragHandler(window) }
-
- Box(
- modifier = modifier.pointerInput(Unit) {
- forEachGesture {
- awaitPointerEventScope {
- awaitFirstDown()
- handler.register()
- }
- }
- }
- ) {
- content()
- }
-}
-
-@Suppress("DEPRECATION")
-private class DragHandler(private val window: androidx.compose.desktop.AppWindow) {
- private var location = window.window.location.toComposeOffset()
- private var pointStart = MouseInfo.getPointerInfo().location.toComposeOffset()
-
- private val dragListener = object : MouseMotionAdapter() {
- override fun mouseDragged(event: MouseEvent) = drag()
- }
- private val removeListener = object : MouseAdapter() {
- override fun mouseReleased(event: MouseEvent) {
- window.removeMouseMotionListener(dragListener)
- window.removeMouseListener(this)
- }
- }
-
- fun register() {
- location = window.window.location.toComposeOffset()
- pointStart = MouseInfo.getPointerInfo().location.toComposeOffset()
- window.addMouseListener(removeListener)
- window.addMouseMotionListener(dragListener)
- }
-
- private fun drag() {
- val point = MouseInfo.getPointerInfo().location.toComposeOffset()
- val location = location + (point - pointStart)
- window.setLocation(location.x, location.y)
- }
-
- private fun Point.toComposeOffset() = IntOffset(x, y)
-}
diff --git a/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt b/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt
index 5ff9f3b..9901bb97 100644
--- a/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt
+++ b/compose/desktop/desktop/src/jvmTest/kotlin/androidx/compose/desktop/ParagraphTest.kt
@@ -29,6 +29,7 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.TestComposeWindow
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.SpanStyle
@@ -45,6 +46,7 @@
import org.junit.runners.JUnit4
@RunWith(JUnit4::class)
+@OptIn(InternalTestApi::class)
class ParagraphTest {
@get:Rule
val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/paragraph")
diff --git a/compose/foundation/foundation-layout/build.gradle b/compose/foundation/foundation-layout/build.gradle
index 4ba21f3..e276a55 100644
--- a/compose/foundation/foundation-layout/build.gradle
+++ b/compose/foundation/foundation-layout/build.gradle
@@ -55,6 +55,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(project(":compose:foundation:foundation-layout:foundation-layout-samples"))
}
}
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt
new file mode 100644
index 0000000..a199a83
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextInColumnTestCase.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.foundation.benchmark.text
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.TextUnit
+
+/**
+ * The benchmark test case for [Text], where the input is a plain annotated string.
+ */
+class AnnotatedTextInColumnTestCase(
+ private val texts: List<AnnotatedString>,
+ private val width: Dp,
+ private val fontSize: TextUnit
+) : LayeredComposeTestCase(), ToggleableTestCase {
+
+ private val color = mutableStateOf(Color.Black)
+
+ @Composable
+ override fun MeasuredContent() {
+ for (text in texts) {
+ Text(text = text, color = color.value, fontSize = fontSize)
+ }
+ }
+
+ @Composable
+ override fun ContentWrappers(content: @Composable () -> Unit) {
+ Column(
+ modifier = Modifier.wrapContentSize(Alignment.Center).width(width)
+ .verticalScroll(rememberScrollState())
+ ) {
+ content()
+ }
+ }
+
+ override fun toggleState() {
+ if (color.value == Color.Black) {
+ color.value = Color.Red
+ } else {
+ color.value = Color.Black
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextBenchmark.kt
new file mode 100644
index 0000000..bc2e652
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextBenchmark.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.foundation.benchmark.text
+
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.test.filters.SmallTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@SmallTest
+@RunWith(Parameterized::class)
+class AnnotatedTextToggleTextBenchmark(
+ private val textLength: Int
+) {
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "length={0}")
+ fun initParameters(): Array<Any> = arrayOf(32, 512)
+ }
+
+ @get:Rule
+ val textBenchmarkRule = TextBenchmarkTestRule()
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val width = textBenchmarkRule.widthDp.dp
+ private val fontSize = textBenchmarkRule.fontSizeSp.sp
+
+ private val caseFactory = {
+ textBenchmarkRule.generator { generator ->
+ AnnotatedTextToggleTextTestCase(
+ textGenerator = generator,
+ textLength = textLength,
+ textNumber = textBenchmarkRule.repeatTimes,
+ width = width,
+ fontSize = fontSize
+ )
+ }
+ }
+
+ /**
+ * Measure the time taken to recompose the [Text] composable when text gets toggled.
+ */
+ @Test
+ fun toggleText_recompose() {
+ benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to measure the [Text] composable when text gets toggled.
+ */
+ @Test
+ fun toggleText_measure() {
+ benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to layout the [Text] composable when text gets toggled.
+ */
+ @Test
+ fun toggleText_layout() {
+ benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to draw the [Text] composable when text gets toggled.
+ */
+ @Test
+ fun toggleText_draw() {
+ benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
+ }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextTestCase.kt
new file mode 100644
index 0000000..cc4c5a7
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/AnnotatedTextToggleTextTestCase.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.foundation.benchmark.text
+
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.width
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.ComposeTestCase
+import androidx.compose.testutils.ToggleableTestCase
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.benchmark.RandomTextGenerator
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.TextUnit
+
+class AnnotatedTextToggleTextTestCase(
+ private val textGenerator: RandomTextGenerator,
+ private val textLength: Int,
+ private val textNumber: Int,
+ private val width: Dp,
+ private val fontSize: TextUnit
+) : ComposeTestCase, ToggleableTestCase {
+
+ private val texts = List(textNumber) {
+ mutableStateOf(AnnotatedString(textGenerator.nextParagraph(length = textLength)))
+ }
+
+ @Composable
+ override fun Content() {
+ Column(
+ modifier = Modifier.wrapContentSize(Alignment.Center).width(width)
+ .verticalScroll(rememberScrollState())
+ ) {
+ for (text in texts) {
+ Text(text = text.value, color = Color.Black, fontSize = fontSize)
+ }
+ }
+ }
+
+ override fun toggleState() {
+ texts.forEach {
+ it.value = AnnotatedString(textGenerator.nextParagraph(length = textLength))
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicAnnotatedBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicAnnotatedBenchmark.kt
new file mode 100644
index 0000000..c382b96
--- /dev/null
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicAnnotatedBenchmark.kt
@@ -0,0 +1,165 @@
+/*
+ * 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.compose.foundation.benchmark.text
+
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkDraw
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
+import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+/**
+ * The benchmark for [Text] composable with the input being a plain annotated string.
+ */
+@LargeTest
+@RunWith(Parameterized::class)
+class TextBasicAnnotatedBenchmark(
+ private val textLength: Int
+) {
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "length={0}")
+ fun initParameters(): Array<Any> = arrayOf(32, 512)
+ }
+
+ @get:Rule
+ val textBenchmarkRule = TextBenchmarkTestRule()
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val width = textBenchmarkRule.widthDp.dp
+ private val fontSize = textBenchmarkRule.fontSizeSp.sp
+
+ private val caseFactory = {
+ textBenchmarkRule.generator { textGenerator ->
+ /**
+ * Text render has a word cache in the underlying system. To get a proper metric of its
+ * performance, the cache needs to be disabled, which unfortunately is not doable via
+ * public API. Here is a workaround which generates a new string when a new test case
+ * is created.
+ */
+ val texts = List(textBenchmarkRule.repeatTimes) {
+ AnnotatedString(textGenerator.nextParagraph(textLength))
+ }
+ AnnotatedTextInColumnTestCase(
+ texts = texts,
+ width = width,
+ fontSize = fontSize
+ )
+ }
+ }
+
+ /**
+ * Measure the time taken to compose a [Text] composable from scratch with the given input.
+ * This is the time taken to call the [Text] composable function.
+ */
+ @Test
+ fun first_compose() {
+ benchmarkRule.benchmarkFirstCompose(caseFactory)
+ }
+
+ /**
+ * Measure the time taken by the first time measure the [Text] composable with the given input.
+ * This is mainly the time used to measure all the [Measurable]s in the [Text] composable.
+ */
+ @Test
+ fun first_measure() {
+ benchmarkRule.benchmarkFirstMeasure(caseFactory)
+ }
+
+ /**
+ * Measure the time taken by the first time layout the [Text] composable with the given input.
+ * This is mainly the time used to place [Placeable]s in [Text] composable.
+ */
+ @Test
+ fun first_layout() {
+ benchmarkRule.benchmarkFirstLayout(caseFactory)
+ }
+
+ /**
+ * Measure the time taken by first time draw the [Text] composable with the given input.
+ */
+ @Test
+ fun first_draw() {
+ benchmarkRule.benchmarkFirstDraw(caseFactory)
+ }
+
+ /**
+ * Measure the time taken by layout the [Text] composable after the layout constrains changed.
+ * This is mainly the time used to re-measure and re-layout the composable.
+ */
+ @Test
+ fun layout() {
+ benchmarkRule.benchmarkLayoutPerf(caseFactory)
+ }
+
+ /**
+ * Measure the time taken by redrawing the [Text] composable.
+ */
+ @Test
+ fun draw() {
+ benchmarkRule.benchmarkDrawPerf(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to recompose the [Text] composable when color gets toggled.
+ */
+ @Test
+ fun toggleColor_recompose() {
+ benchmarkRule.toggleStateBenchmarkRecompose(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to measure the [Text] composable when color gets toggled.
+ */
+ @Test
+ fun toggleColor_measure() {
+ benchmarkRule.toggleStateBenchmarkMeasure(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to layout the [Text] composable when color gets toggled.
+ */
+ @Test
+ fun toggleColor_layout() {
+ benchmarkRule.toggleStateBenchmarkLayout(caseFactory)
+ }
+
+ /**
+ * Measure the time taken to draw the [Text] composable when color gets toggled.
+ */
+ @Test
+ fun toggleColor_draw() {
+ benchmarkRule.toggleStateBenchmarkDraw(caseFactory)
+ }
+}
\ No newline at end of file
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
index f7f3edd..111b86c 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextBasicBenchmark.kt
@@ -27,7 +27,6 @@
import androidx.compose.testutils.benchmark.toggleStateBenchmarkLayout
import androidx.compose.testutils.benchmark.toggleStateBenchmarkMeasure
import androidx.compose.testutils.benchmark.toggleStateBenchmarkRecompose
-import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.text.benchmark.TextBenchmarkTestRule
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
@@ -69,7 +68,7 @@
* is created.
*/
val texts = List(textBenchmarkRule.repeatTimes) {
- AnnotatedString(textGenerator.nextParagraph(textLength))
+ textGenerator.nextParagraph(textLength)
}
TextInColumnTestCase(
texts = texts,
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
index 227309e..0cdc58b 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextInColumnTestCase.kt
@@ -29,7 +29,6 @@
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.text.AnnotatedString
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.TextUnit
@@ -37,7 +36,7 @@
* The benchmark test case for [Text], where the input is a plain string.
*/
class TextInColumnTestCase(
- private val texts: List<AnnotatedString>,
+ private val texts: List<String>,
private val width: Dp,
private val fontSize: TextUnit
) : LayeredComposeTestCase(), ToggleableTestCase {
diff --git a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
index 5995d6d..519e0c4 100644
--- a/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
+++ b/compose/foundation/foundation/benchmark/src/androidTest/java/androidx/compose/foundation/benchmark/text/TextMultiStyleBenchmark.kt
@@ -76,7 +76,7 @@
hasMetricAffectingStyle = true
)
}
- TextInColumnTestCase(
+ AnnotatedTextInColumnTestCase(
texts = texts,
width = width,
fontSize = fontSize
diff --git a/compose/foundation/foundation/build.gradle b/compose/foundation/foundation/build.gradle
index d6e0cc0..8ae8c9c 100644
--- a/compose/foundation/foundation/build.gradle
+++ b/compose/foundation/foundation/build.gradle
@@ -70,6 +70,8 @@
androidTestImplementation(libs.dexmakerMockito)
androidTestImplementation(libs.mockitoCore)
androidTestImplementation(libs.mockitoKotlin)
+
+ samples(project(":compose:foundation:foundation:foundation-samples"))
}
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt
index bf55164..57511e1 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollAccessibilityTest.kt
@@ -88,19 +88,23 @@
private val scrollerTag = "ScrollerTest"
private var composeView: View? = null
private val accessibilityNodeProvider: AccessibilityNodeProvider
- get() = ViewCompat
- .getAccessibilityDelegate(composeView!!)!!
- .getAccessibilityNodeProvider(composeView)
- .provider as AccessibilityNodeProvider
+ get() = checkNotNull(composeView) {
+ "composeView not initialized. Did `composeView = LocalView.current` not work?"
+ }.let { composeView ->
+ ViewCompat
+ .getAccessibilityDelegate(composeView)!!
+ .getAccessibilityNodeProvider(composeView)
+ .provider as AccessibilityNodeProvider
+ }
@Test
fun scrollForward() {
- testRelativeDirection(55, AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
+ testScrollAction(55, AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
}
@Test
fun scrollBackward() {
- testRelativeDirection(45, AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
+ testScrollAction(45, AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
}
@Test
@@ -125,20 +129,6 @@
/**
* Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
- * has been reached. The canonical target is the item that we expect to see when moving
- * forward in a non-reversed scrollable (e.g. down in vertical orientation or right in
- * horizontal orientation in LTR). The actual target is either the canonical target or the
- * target that is as far from the middle of the scrollable as the canonical target, but on
- * the other side of the middle. For testing relative directions, this mirroring is done if
- * the scroll is [reversed][TestConfig.reversed].
- */
- private fun testRelativeDirection(canonicalTarget: Int, accessibilityAction: Int) {
- val target = if (!config.reversed) canonicalTarget else 100 - canonicalTarget - 1
- testScrollAction(target, accessibilityAction)
- }
-
- /**
- * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
* has been reached (but only if we [expect][expectActionSuccess] the action to succeed).
* The canonical target is the item that we expect to see when moving forward in a
* non-reversed scrollable (e.g. down in vertical orientation or right in horizontal
@@ -169,7 +159,6 @@
createScrollableContent_StartInMiddle()
rule.onNodeWithText("$target").assertIsNotDisplayed()
- waitForSubtreeEventToSend()
val returnValue = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
accessibilityNodeProvider.performAction(id, accessibilityAction, null)
}
@@ -232,11 +221,4 @@
private fun <T> SemanticsNodeInteraction.withSemanticsNode(block: SemanticsNode.() -> T): T {
return block.invoke(fetchSemanticsNode())
}
-
- private fun waitForSubtreeEventToSend() {
- // When the subtree events are sent, we will also update our previousSemanticsNodes,
- // which will affect our next accessibility events from semantics tree comparison.
- rule.mainClock.advanceTimeBy(1000)
- rule.waitForIdle()
- }
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
index 24cea39..f944a6a 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ScrollableTest.kt
@@ -376,7 +376,6 @@
up()
}
val expected = prevAfterSomeFling + 115
- rule.mainClock.advanceTimeBy(1000)
assertThat(total).isEqualTo(expected)
}
@@ -1189,7 +1188,8 @@
up()
}
assertThat(flingCalled).isEqualTo(1)
- assertThat(flingVelocity).isEqualTo(0f)
+ assertThat(flingVelocity).isLessThan(0.01f)
+ assertThat(flingVelocity).isGreaterThan(-0.01f)
}
@Test
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
index 7e6d8aa..a18359c 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/SelectableTest.kt
@@ -27,6 +27,7 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
+import androidx.compose.testutils.first
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.InspectableValue
import androidx.compose.ui.platform.isDebugInspectorInfoEnabled
@@ -314,7 +315,7 @@
false,
interactionSource = remember { MutableInteractionSource() },
indication = null
- ) {}.toList().first() as InspectableValue
+ ) {}.first() as InspectableValue
assertThat(modifier.nameFallback).isEqualTo("selectable")
assertThat(modifier.valueOverride).isNull()
assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
@@ -327,7 +328,4 @@
)
}
}
-
- private fun Modifier.toList(): List<Modifier.Element> =
- foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
}
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
index 3183011..a50acae 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/ToggleableTest.kt
@@ -31,6 +31,7 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
+import androidx.compose.testutils.first
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.platform.InspectableValue
@@ -411,7 +412,7 @@
onValueChange = {},
interactionSource = remember { MutableInteractionSource() },
indication = null
- ).toList().first() as InspectableValue
+ ).first() as InspectableValue
assertThat(modifier.nameFallback).isEqualTo("toggleable")
assertThat(modifier.valueOverride).isNull()
assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
@@ -449,7 +450,7 @@
interactionSource = remember { MutableInteractionSource() },
indication = null,
onClick = {}
- ).toList().first() as InspectableValue
+ ).first() as InspectableValue
assertThat(modifier.nameFallback).isEqualTo("triStateToggleable")
assertThat(modifier.valueOverride).isNull()
assertThat(modifier.inspectableElements.map { it.name }.asIterable()).containsExactly(
@@ -522,7 +523,4 @@
click(position = Offset(-1f, -1f))
}.assertIsOn()
}
-
- private fun Modifier.toList(): List<Modifier.Element> =
- foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollTest.kt
index 785d730..51adedd 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/gesture/OverScrollTest.kt
@@ -231,10 +231,11 @@
up()
}
+ // ignores touch slop if overscroll animation is on progress while pointer goes down
+ assertThat(acummulatedScroll - lastAccScroll).isEqualTo(500f)
+
rule.runOnIdle {
assertThat(controller.stopAnimationCallsCount).isEqualTo(2)
- // ignores touch slop if overscroll animation is on progress while pointer goes down
- assertThat(acummulatedScroll - lastAccScroll).isEqualTo(500f)
}
}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollAccessibilityTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollAccessibilityTest.kt
new file mode 100644
index 0000000..7f03801
--- /dev/null
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/LazyScrollAccessibilityTest.kt
@@ -0,0 +1,247 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.foundation.lazy
+
+import android.view.View
+import android.view.accessibility.AccessibilityNodeProvider
+import androidx.activity.ComponentActivity
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.text.BasicText
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsNode
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onNodeWithText
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.core.view.ViewCompat
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@MediumTest
+@RunWith(Parameterized::class)
+class LazyScrollAccessibilityTest(private val config: TestConfig) {
+ data class TestConfig(
+ val horizontal: Boolean,
+ val rtl: Boolean,
+ val reversed: Boolean
+ ) {
+ val vertical = !horizontal
+
+ override fun toString(): String {
+ return (if (horizontal) "horizontal" else "vertical") +
+ (if (rtl) ",rtl" else ",ltr") +
+ (if (reversed) ",reversed" else "")
+ }
+ }
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "{0}")
+ fun params() =
+ listOf(true, false).flatMap { horizontal ->
+ listOf(false, true).flatMap { rtl ->
+ listOf(false, true).map { reversed ->
+ TestConfig(horizontal, rtl, reversed)
+ }
+ }
+ }
+ }
+
+ @get:Rule
+ val rule = createAndroidComposeRule<ComponentActivity>()
+
+ private val scrollerTag = "ScrollerTest"
+ private var composeView: View? = null
+ private val accessibilityNodeProvider: AccessibilityNodeProvider
+ get() = checkNotNull(composeView) {
+ "composeView not initialized. Did `composeView = LocalView.current` not work?"
+ }.let { composeView ->
+ ViewCompat
+ .getAccessibilityDelegate(composeView)!!
+ .getAccessibilityNodeProvider(composeView)
+ .provider as AccessibilityNodeProvider
+ }
+
+ @Test
+ fun scrollForward() {
+ testRelativeDirection(58, AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
+ }
+
+ @Test
+ fun scrollBackward() {
+ testRelativeDirection(41, AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
+ }
+
+ @Test
+ fun scrollRight() {
+ testAbsoluteDirection(58, android.R.id.accessibilityActionScrollRight, config.horizontal)
+ }
+
+ @Test
+ fun scrollLeft() {
+ testAbsoluteDirection(41, android.R.id.accessibilityActionScrollLeft, config.horizontal)
+ }
+
+ @Test
+ fun scrollDown() {
+ testAbsoluteDirection(58, android.R.id.accessibilityActionScrollDown, config.vertical)
+ }
+
+ @Test
+ fun scrollUp() {
+ testAbsoluteDirection(41, android.R.id.accessibilityActionScrollUp, config.vertical)
+ }
+
+ /**
+ * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
+ * has been reached. The canonical target is the item that we expect to see when moving
+ * forward in a non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR).
+ * The actual target is either the canonical target or the target that is as far from the
+ * middle of the lazy list as the canonical target, but on the other side of the middle,
+ * depending on the [configuration][config].
+ */
+ private fun testRelativeDirection(canonicalTarget: Int, accessibilityAction: Int) {
+ val target = if (!config.reversed) canonicalTarget else 100 - canonicalTarget - 1
+ testScrollAction(target, accessibilityAction)
+ }
+
+ /**
+ * Setup the test, run the given [accessibilityAction], and check if the [canonicalTarget]
+ * has been reached (but only if we [expect][expectActionSuccess] the action to succeed).
+ * The canonical target is the item that we expect to see when moving forward in a
+ * non-reversed scrollable (e.g. down in LazyColumn or right in LazyRow in LTR). The actual
+ * target is either the canonical target or the target that is as far from the middle of the
+ * scrollable as the canonical target, but on the other side of the middle, depending on the
+ * [configuration][config].
+ */
+ private fun testAbsoluteDirection(
+ canonicalTarget: Int,
+ accessibilityAction: Int,
+ expectActionSuccess: Boolean
+ ) {
+ var target = canonicalTarget
+ if (config.horizontal && config.rtl) {
+ target = 100 - target - 1
+ }
+ if (config.reversed) {
+ target = 100 - target - 1
+ }
+ testScrollAction(target, accessibilityAction, expectActionSuccess)
+ }
+
+ /**
+ * Setup the test, run the given [accessibilityAction], and check if the [target] has been
+ * reached (but only if we [expect][expectActionSuccess] the action to succeed).
+ */
+ private fun testScrollAction(
+ target: Int,
+ accessibilityAction: Int,
+ expectActionSuccess: Boolean = true
+ ) {
+ createScrollableContent_StartInMiddle()
+ rule.onNodeWithText("$target").assertDoesNotExist()
+
+ val returnValue = rule.onNodeWithTag(scrollerTag).withSemanticsNode {
+ accessibilityNodeProvider.performAction(id, accessibilityAction, null)
+ }
+
+ assertThat(returnValue).isEqualTo(expectActionSuccess)
+ if (expectActionSuccess) {
+ rule.onNodeWithText("$target").assertIsDisplayed()
+ } else {
+ rule.onNodeWithText("$target").assertDoesNotExist()
+ }
+ }
+
+ /**
+ * Creates a Row/Column with a viewport of 100.dp, containing 100 items each 17.dp in size.
+ * The items have a text with their index (ASC), and the viewport starts in the middle of the
+ * scrollable. All properties from [config] are applied. The viewport has padding around it
+ * to make sure scroll distance doesn't include padding.
+ */
+ private fun createScrollableContent_StartInMiddle() {
+ rule.setContent {
+ composeView = LocalView.current
+ val lazyContent: LazyListScope.() -> Unit = {
+ items(100) {
+ Box(Modifier.requiredSize(21.dp).background(Color.Yellow)) {
+ BasicText("$it", Modifier.align(Alignment.Center))
+ }
+ }
+ }
+
+ // Start at the middle:
+ // Content size: 100 items * 21dp per item = 2100dp
+ // Viewport size: 200dp rect - 50dp padding on both sides = 100dp
+ // Content outside viewport: 2100dp - 100dp = 2000dp
+ // -> centered when 1000dp on either side, which is 47 items + 13dp
+ val state = rememberLazyListState(
+ 47,
+ with(LocalDensity.current) { 13.dp.roundToPx() }
+ )
+
+ Box(Modifier.requiredSize(200.dp).background(Color.White)) {
+ val direction = if (config.rtl) LayoutDirection.Rtl else LayoutDirection.Ltr
+ CompositionLocalProvider(LocalLayoutDirection provides direction) {
+ if (config.horizontal) {
+ LazyRow(
+ Modifier.testTag(scrollerTag).matchParentSize(),
+ state = state,
+ contentPadding = PaddingValues(50.dp),
+ reverseLayout = config.reversed,
+ verticalAlignment = Alignment.CenterVertically
+ ) {
+ lazyContent()
+ }
+ } else {
+ LazyColumn(
+ Modifier.testTag(scrollerTag).matchParentSize(),
+ state = state,
+ contentPadding = PaddingValues(50.dp),
+ reverseLayout = config.reversed,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ lazyContent()
+ }
+ }
+ }
+ }
+ }
+ }
+
+ private fun <T> SemanticsNodeInteraction.withSemanticsNode(block: SemanticsNode.() -> T): T {
+ return block.invoke(fetchSemanticsNode())
+ }
+}
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
index 60b43c6..38449b5 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/Scroll.kt
@@ -264,16 +264,12 @@
factory = {
val overScrollController = rememberOverScrollController()
val coroutineScope = rememberCoroutineScope()
- val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
- // Add RTL to the mix: if horizontal and RTL, reverse reverseScrolling
- val resolvedReverseScrolling =
- if (!isVertical && isRtl) !reverseScrolling else reverseScrolling
val semantics = Modifier.semantics {
if (isScrollable) {
val accessibilityScrollState = ScrollAxisRange(
value = { state.value.toFloat() },
maxValue = { state.maxValue.toFloat() },
- reverseScrolling = resolvedReverseScrolling
+ reverseScrolling = reverseScrolling
)
if (isVertical) {
this.verticalScrollAxisRange = accessibilityScrollState
@@ -297,8 +293,17 @@
}
val scrolling = Modifier.scrollable(
orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal,
- // reverse scroll to have a "natural" gesture that goes reversed to layout
- reverseDirection = !resolvedReverseScrolling,
+ reverseDirection = run {
+ // A finger moves with the content, not with the viewport. Therefore,
+ // always reverse once to have "natural" gesture that goes reversed to layout
+ var reverseDirection = !reverseScrolling
+ // But if rtl and horizontal, things move the other way around
+ val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
+ if (isRtl && !isVertical) {
+ reverseDirection = !reverseDirection
+ }
+ reverseDirection
+ },
enabled = isScrollable,
interactionSource = state.internalInteractionSource,
flingBehavior = flingBehavior,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
index 7c6a3d9..f60c979 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/gestures/Draggable.kt
@@ -41,6 +41,7 @@
import androidx.compose.ui.input.pointer.consumePositionChange
import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.input.pointer.positionChange
+import androidx.compose.ui.input.pointer.util.addPointerInputChange
import androidx.compose.ui.input.pointer.util.VelocityTracker
import androidx.compose.ui.platform.debugInspectorInfo
import androidx.compose.ui.unit.Velocity
@@ -261,7 +262,12 @@
forEachGesture {
awaitPointerEventScope {
val velocityTracker = VelocityTracker()
- awaitDownAndSlop(canDragState, startImmediatelyState, orientation)?.let {
+ awaitDownAndSlop(
+ canDragState,
+ startImmediatelyState,
+ velocityTracker,
+ orientation
+ )?.let {
var isDragSuccessful = false
try {
isDragSuccessful = awaitDrag(
@@ -294,9 +300,11 @@
private suspend fun AwaitPointerEventScope.awaitDownAndSlop(
canDrag: State<(PointerInputChange) -> Boolean>,
startDragImmediately: State<() -> Boolean>,
+ velocityTracker: VelocityTracker,
orientation: Orientation
): Pair<PointerInputChange, Float>? {
val down = awaitFirstDown(requireUnconsumed = false)
+ velocityTracker.addPointerInputChange(down)
return if (!canDrag.value.invoke(down)) {
null
} else if (startDragImmediately.value.invoke()) {
@@ -305,6 +313,7 @@
} else {
var initialDelta = 0f
val postPointerSlop = { event: PointerInputChange, offset: Float ->
+ velocityTracker.addPointerInputChange(event)
event.consumePositionChange()
initialDelta = offset
}
@@ -326,7 +335,6 @@
): Boolean {
val initialDelta = dragStart.second
val startEvent = dragStart.first
- velocityTracker.addPosition(startEvent.uptimeMillis, startEvent.position)
val overSlopOffset = initialDelta.toOffset(orientation)
val adjustedStart = startEvent.position - overSlopOffset *
@@ -340,8 +348,8 @@
)
)
- val dragTick: (PointerInputChange) -> Unit = { event: PointerInputChange ->
- velocityTracker.addPosition(event.uptimeMillis, event.position)
+ val dragTick: (PointerInputChange) -> Unit = { event ->
+ velocityTracker.addPointerInputChange(event)
val delta = event.positionChange().toFloat(orientation)
event.consumePositionChange()
channel.trySend(
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
index 16532b7..64cccaf 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyList.kt
@@ -102,19 +102,29 @@
state.updateScrollPositionIfTheFirstItemWasMoved(itemsProvider)
}
- val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
LazyLayout(
modifier = modifier
.lazyListSemantics(
stateOfItemsProvider = stateOfItemsProvider,
state = state,
coroutineScope = rememberCoroutineScope(),
- isVertical = isVertical
+ isVertical = isVertical,
+ reverseScrolling = reverseLayout
)
.clipScrollableContainer(isVertical)
.scrollable(
orientation = if (isVertical) Orientation.Vertical else Orientation.Horizontal,
- reverseDirection = if (!isVertical && isRtl) reverseLayout else !reverseLayout,
+ reverseDirection = run {
+ // A finger moves with the content, not with the viewport. Therefore,
+ // always reverse once to have "natural" gesture that goes reversed to layout
+ var reverseDirection = !reverseLayout
+ // But if rtl and horizontal, things move the other way around
+ val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
+ if (isRtl && !isVertical) {
+ reverseDirection = !reverseDirection
+ }
+ reverseDirection
+ },
interactionSource = state.internalInteractionSource,
flingBehavior = flingBehavior,
state = state,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index d5f755d0..716e85d 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -219,7 +219,8 @@
get() = scrollableState.isScrollInProgress
private var canScrollBackward: Boolean = false
- private var canScrollForward: Boolean = false
+ internal var canScrollForward: Boolean = false
+ private set
// TODO: Coroutine scrolling APIs will allow this to be private again once we have more
// fine-grained control over scrolling
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
index f5ef66d..8f949991 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazySemantics.kt
@@ -36,7 +36,8 @@
stateOfItemsProvider: State<LazyListItemsProvider>,
state: LazyListState,
coroutineScope: CoroutineScope,
- isVertical: Boolean
+ isVertical: Boolean,
+ reverseScrolling: Boolean
): Modifier {
return semantics {
indexForKey { needle ->
@@ -57,7 +58,17 @@
// rather than the actual offset in pixels.
state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
},
- maxValue = { Float.POSITIVE_INFINITY }
+ maxValue = {
+ if (state.canScrollForward) {
+ // If we can scroll further, we don't know the end yet,
+ // but it's upper bounded by #items + 1
+ stateOfItemsProvider.value.itemsCount + 1f
+ } else {
+ // If we can't scroll further, the current value is the max
+ state.firstVisibleItemIndex + state.firstVisibleItemScrollOffset / 100_000f
+ }
+ },
+ reverseScrolling = reverseScrolling
)
if (isVertical) {
verticalScrollAxisRange = accessibilityScrollState
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
index 47a31dd..df20938 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/BasicText.kt
@@ -55,7 +55,15 @@
softWrap: Boolean = true,
maxLines: Int = Int.MAX_VALUE,
) {
+ // NOTE(text-perf-review): consider precomputing layout here by pushing text to a channel...
+ // something like:
+ // remember(text) { precomputeTextLayout(text) }
+
BasicText(
+ // NOTE(text-perf-review): we create an AnnotatedString here no matter what, which causes
+ // us to lose a lot of information (ie, a bunch of optimization potential by the fact
+ // that it is _just_ a string). We should consider heavily optimizing for the very common
+ // case of String, even if it means we have two separate code paths for a lot of things.
AnnotatedString(text),
modifier,
style,
@@ -99,8 +107,12 @@
maxLines: Int = Int.MAX_VALUE,
inlineContent: Map<String, InlineTextContent> = mapOf(),
) {
+ // NOTE(text-perf-review): why do we have a separate CoreText and BasicText? It seems to be
+ // creating nesting with little to no value. This nesting isn't the end of the world, but it
+ // might be worthwhile to remove it!
CoreText(
text,
+ // NOTE(text-perf-review): why is the semantics here and not in the TextDelegate below?
modifier.semantics { this.text = text },
style,
softWrap,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
index 3ac3fe5..56b4742 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/CoreText.kt
@@ -129,11 +129,17 @@
// as a brand new CoreText.
// When SelectionRegistrar is updated, CoreText have to request a new ID to avoid ID collision.
+ // NOTE(text-perf-review): potential bug. selectableId is regenerated here whenever text
+ // changes, but it is only saved in the initial creation of TextState.
val selectableId =
rememberSaveable(text, selectionRegistrar, saver = selectionIdSaver(selectionRegistrar)) {
selectionRegistrar?.nextSelectableId() ?: SelectionRegistrar.InvalidSelectableId
}
+ // NOTE(text-perf-review): We might want to consider consolidating a lot of what is going on
+ // here. We might end up saving a bit of cost here. There are 3 things that we remember and
+ // store separately but could instead just be a single object:
+ // selectableId, TextState, TextController.
val state = remember {
TextState(
TextDelegate(
@@ -166,6 +172,13 @@
val controller = remember { TextController(state) }
controller.update(selectionRegistrar)
+ // NOTE(text-perf-review): if we split this function into separate String/AnnotatedString
+ // versions, we wouldn't have any inline composables, and text would always be child-less. We
+ // might then want to consider using `ReusableComposeNode` directly instead of `Layout`,
+ // which should be a bit faster (layout isn't buying us anything here). Additionally, we
+ // might want to see if the "non skippable updateable" version of ComposeNode is advantageous
+ // to us here, since this is already a restartable composable and it is a "leaf" node, we don't
+ // need the modifiers to materialize inside of a tight scope.
Layout(
content = if (inlineComposables.isEmpty()) {
{}
@@ -174,6 +187,9 @@
},
modifier = modifier
.then(controller.modifiers)
+ // NOTE(text-perf-review): consider moving this to controller.modifiers. It only uses
+ // the controller already, and by having the modifier be instance-equal across
+ // recompositions you would gain a lot.
.then(
if (selectionRegistrar != null) {
if (isInTouchMode) {
@@ -196,6 +212,8 @@
measurePolicy = controller.measurePolicy
)
+ // NOTE(text-perf-review): consider making TextController or TextState a remember observer
+ // and just implementing onDispose on it, which might save us a little bit here.
DisposableEffect(selectionRegistrar, effect = controller.commit)
}
@@ -216,6 +234,7 @@
}
}
+// NOTE(text-perf-review): consider merging this with TextDelegate?
@OptIn(InternalFoundationTextApi::class)
/*@VisibleForTesting*/
internal class TextController(val state: TextState) {
@@ -252,6 +271,9 @@
measurables: List<Measurable>,
constraints: Constraints
): MeasureResult {
+ // NOTE(text-perf-review): current implementation of layout means that layoutResult
+ // will _never_ be the same instance. We should try and fast path case where
+ // everything is the same and return same instance in that case.
val layoutResult = state.textDelegate.layout(
constraints,
layoutDirection,
@@ -299,6 +321,8 @@
// round just because the Android framework is doing float-to-int conversion with
// round.
// https://cs.android.com/android/platform/superproject/+/master:frameworks/base/core/jni/android/graphics/Paint.cpp;l=635?q=Paint.cpp
+ // NOTE(text-perf-review): layoutResult should ideally just cache this map. It is
+ // being recreated every layout right now,
mapOf(
FirstBaseline to layoutResult.firstBaseline.roundToInt(),
LastBaseline to layoutResult.lastBaseline.roundToInt()
@@ -572,6 +596,7 @@
}
}
+// NOTE(text-perf-review): consider merging with TextDelegate?
@OptIn(InternalFoundationTextApi::class)
/*@VisibleForTesting*/
internal class TextState(
@@ -613,6 +638,8 @@
maxLines: Int = Int.MAX_VALUE,
placeholders: List<AnnotatedString.Range<Placeholder>>
): TextDelegate {
+ // NOTE(text-perf-review): whenever we have remember intrinsic implemented, this might be a
+ // lot slower than the equivalent `remember(a, b, c, ...) { ... }` call.
return if (current.text != text ||
current.style != style ||
current.softWrap != softWrap ||
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
index ba4f6e4..f41c77e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextDelegate.kt
@@ -91,6 +91,9 @@
val placeholders: List<AnnotatedString.Range<Placeholder>> = emptyList()
) {
/*@VisibleForTesting*/
+ // NOTE(text-perf-review): it seems like TextDelegate essentially guarantees that we use
+ // MultiParagraph. Can we have a fast-path that uses just Paragraph in simpler cases (ie,
+ // String)?
internal var paragraphIntrinsics: MultiParagraphIntrinsics? = null
internal var intrinsicsLayoutDirection: LayoutDirection? = null
@@ -206,6 +209,8 @@
resourceLoader, constraints
)
) {
+ // NOTE(text-perf-review): seems like there's a nontrivial chance for us to be able
+ // to just return prevResult here directly?
return with(prevResult) {
copy(
layoutInput = layoutInput.copy(
@@ -234,6 +239,10 @@
)
)
+ // NOTE(text-perf-review): it feels odd to create the input + result at the same time. if
+ // the allocation of these objects is 1:1 then it might make sense to just merge them?
+ // Alternatively, we might be able to save some effort here by having a common object for
+ // the types that go into the result here that are less likely to change
return TextLayoutResult(
TextLayoutInput(
text,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
index 2f2051e..4bc3077 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/text/TextLayoutHelper.kt
@@ -53,6 +53,8 @@
constraints: Constraints
): Boolean {
+ // NOTE(text-perf-review): might make sense to short-circuit instance equality here
+
// Check if this is created from the same parameter.
val layoutInput = this.layoutInput
if (!(
@@ -84,6 +86,7 @@
* Returns true if text layout created with this TextStyle can be reused for the [other] TextStyle.
*/
internal fun TextStyle.canReuseLayout(other: TextStyle): Boolean {
+ // NOTE(text-perf-review): might make sense to short-circuit instance equality here
return fontSize == other.fontSize &&
fontWeight == other.fontWeight &&
fontStyle == other.fontStyle &&
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
index 32eb24d..1ba0aab 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Clickable.desktop.kt
@@ -41,13 +41,13 @@
// TODO: b/168524931 - should this depend on the input device?
internal actual val TapIndicationDelay: Long = 0L
-@Immutable @ExperimentalDesktopApi
+@Immutable @ExperimentalFoundationApi
class MouseClickScope constructor(
val buttons: PointerButtons,
val keyboardModifiers: PointerKeyboardModifiers
)
-@ExperimentalDesktopApi
+@ExperimentalFoundationApi
internal val EmptyClickContext = MouseClickScope(
PointerButtons(0), PointerKeyboardModifiers(0)
)
@@ -57,7 +57,7 @@
* information about pressed buttons and keyboard modifiers
*
*/
-@ExperimentalDesktopApi
+@ExperimentalFoundationApi
fun Modifier.mouseClickable(
enabled: Boolean = true,
onClickLabel: String? = null,
@@ -104,7 +104,7 @@
}
)
-@OptIn(ExperimentalDesktopApi::class)
+@OptIn(ExperimentalFoundationApi::class)
internal suspend fun PointerInputScope.detectTapWithContext(
onTap: ((PointerEvent, PointerEvent) -> Unit)? = null
) {
@@ -126,7 +126,7 @@
}
}
-@ExperimentalDesktopApi
+@ExperimentalFoundationApi
suspend fun AwaitPointerEventScope.awaitEventFirstDown(): PointerEvent {
var event: PointerEvent
do {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
index 9d63c78..ac939cd 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/Scrollbar.desktop.kt
@@ -359,28 +359,6 @@
/**
* Create and [remember] [ScrollbarAdapter] for lazy scrollable container and current instance of
- * [scrollState] and item configuration
- */
-@Suppress("UNUSED_PARAMETER")
-@ExperimentalFoundationApi
-@Composable
-@Deprecated(
- "itemCount and averageItemSize are calculated automatically. Use " +
- "another overload rememberScrollbarAdapter without passing them",
- ReplaceWith("rememberScrollbarAdapter(scrollState)")
-)
-fun rememberScrollbarAdapter(
- scrollState: LazyListState,
- itemCount: Int,
- averageItemSize: Dp
-): ScrollbarAdapter {
- return remember(scrollState) {
- ScrollbarAdapter(scrollState)
- }
-}
-
-/**
- * Create and [remember] [ScrollbarAdapter] for lazy scrollable container and current instance of
* [scrollState]
*/
@Composable
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BoxWithTooltip.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt
similarity index 85%
rename from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BoxWithTooltip.desktop.kt
rename to compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt
index f7ff21a..49f13ae 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/BoxWithTooltip.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/TooltipArea.desktop.kt
@@ -58,15 +58,44 @@
* @param tooltipPlacement Defines position of the tooltip.
* @param content Composable content that the current tooltip is set to.
*/
-@OptIn(ExperimentalComposeUiApi::class)
+@OptIn(ExperimentalFoundationApi::class)
@Composable
+@Deprecated(
+ "Use TooltipArea",
+ replaceWith = ReplaceWith(
+ "TooltipArea(tooltip, modifier, delay, tooltipPlacement, content)"
+ )
+)
+@Suppress("UNUSED_PARAMETER")
fun BoxWithTooltip(
tooltip: @Composable () -> Unit,
modifier: Modifier = Modifier,
contentAlignment: Alignment = Alignment.TopStart,
propagateMinConstraints: Boolean = false,
delay: Int = 500,
- @ExperimentalComposeUiApi
+ tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(
+ offset = DpOffset(0.dp, 16.dp)
+ ),
+ content: @Composable () -> Unit
+) = TooltipArea(
+ tooltip, modifier, delay, tooltipPlacement, content
+)
+
+/**
+ * Sets the tooltip for an element.
+ *
+ * @param tooltip Composable content of the tooltip.
+ * @param modifier The modifier to be applied to the layout.
+ * @param delayMillis Delay in milliseconds.
+ * @param tooltipPlacement Defines position of the tooltip.
+ * @param content Composable content that the current tooltip is set to.
+ */
+@OptIn(ExperimentalFoundationApi::class)
+@Composable
+fun TooltipArea(
+ tooltip: @Composable () -> Unit,
+ modifier: Modifier = Modifier,
+ delayMillis: Int = 500,
tooltipPlacement: TooltipPlacement = TooltipPlacement.CursorPoint(
offset = DpOffset(0.dp, 16.dp)
),
@@ -81,7 +110,7 @@
fun startShowing() {
job?.cancel()
job = scope.launch {
- delay(delay.toLong())
+ delay(delayMillis.toLong())
isVisible = true
}
}
@@ -127,13 +156,11 @@
detectDown {
hide()
}
- },
- contentAlignment = contentAlignment,
- propagateMinConstraints = propagateMinConstraints
+ }
) {
content()
if (isVisible) {
- @OptIn(ExperimentalComposeUiApi::class)
+ @OptIn(ExperimentalFoundationApi::class)
Popup(
popupPositionProvider = tooltipPlacement.positionProvider(),
onDismissRequest = { isVisible = false }
@@ -159,7 +186,7 @@
/**
* An interface for providing a [PopupPositionProvider] for the tooltip.
*/
-@ExperimentalComposeUiApi
+@ExperimentalFoundationApi
interface TooltipPlacement {
/**
* Returns [PopupPositionProvider] implementation.
@@ -175,12 +202,13 @@
* @param alignment The alignment of the popup relative to the current cursor position.
* @param windowMargin Defines the area within the window that limits the placement of the popup.
*/
- @ExperimentalComposeUiApi
+ @ExperimentalFoundationApi
class CursorPoint(
private val offset: DpOffset = DpOffset.Zero,
private val alignment: Alignment = Alignment.BottomEnd,
private val windowMargin: Dp = 4.dp
) : TooltipPlacement {
+ @OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun positionProvider() = rememberCursorPositionProvider(
offset,
@@ -197,12 +225,13 @@
* @param alignment The alignment of the popup relative to the [anchor] point.
* @param offset [DpOffset] to be added to the position of the popup.
*/
- @ExperimentalComposeUiApi
+ @ExperimentalFoundationApi
class ComponentRect(
private val anchor: Alignment = Alignment.BottomCenter,
private val alignment: Alignment = Alignment.BottomCenter,
private val offset: DpOffset = DpOffset.Zero
) : TooltipPlacement {
+ @OptIn(ExperimentalComposeUiApi::class)
@Composable
override fun positionProvider() = rememberComponentRectPositionProvider(
anchor,
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
index 71001d5..fc69250 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
+++ b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/gestures/DesktopScrollable.desktop.kt
@@ -20,6 +20,7 @@
import androidx.compose.foundation.DesktopPlatform
import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.input.mouse.MouseScrollOrientation
@@ -41,6 +42,7 @@
// TODO(demin): implement touchpad bounce physics on MacOS
// TODO(demin): maybe we need to differentiate different linux environments (Gnome/KDE)
// TODO(demin): do we need support real line scrolling (i.e. scroll by 3 text lines)?
+@OptIn(ExperimentalComposeUiApi::class)
internal actual fun Modifier.mouseScrollable(
orientation: Orientation,
onScroll: (Float) -> Unit
@@ -49,7 +51,7 @@
val config = LocalMouseScrollConfig.current
mouseScrollFilter { event, bounds ->
- if (isOrientationMatches(orientation, event.orientation)) {
+ if (isOrientationEqual(orientation, event.orientation)) {
val scrollBounds = when (orientation) {
Orientation.Vertical -> bounds.height
Orientation.Horizontal -> bounds.width
@@ -63,7 +65,8 @@
}
}
-fun isOrientationMatches(
+@OptIn(ExperimentalComposeUiApi::class)
+private fun isOrientationEqual(
orientation: Orientation,
mouseOrientation: MouseScrollOrientation
): Boolean {
@@ -74,6 +77,7 @@
}
}
+@OptIn(ExperimentalComposeUiApi::class)
private fun MouseScrollableConfig.offsetOf(
unit: MouseScrollUnit,
bounds: Int,
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelection.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelection.desktop.kt
deleted file mode 100644
index e69de29..0000000
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelection.desktop.kt
+++ /dev/null
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionManager.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionManager.desktop.kt
deleted file mode 100644
index e69de29..0000000
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionManager.desktop.kt
+++ /dev/null
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionRegistrar.desktop.kt b/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionRegistrar.desktop.kt
deleted file mode 100644
index e69de29..0000000
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/selection/DesktopSelectionRegistrar.desktop.kt
+++ /dev/null
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
index ccab302..3c663e8 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/ScrollbarTest.kt
@@ -32,6 +32,7 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.mutableStateOf
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
@@ -41,6 +42,7 @@
import androidx.compose.ui.input.mouse.MouseScrollUnit
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.test.TouchInjectionScope
import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
import androidx.compose.ui.test.junit4.ComposeTestRule
@@ -428,12 +430,14 @@
}
}
+ @OptIn(InternalTestApi::class, ExperimentalComposeUiApi::class)
private fun ComposeTestRule.performMouseScroll(x: Int, y: Int, delta: Float) {
(this as DesktopComposeTestRule).window.onMouseScroll(
x, y, MouseScrollEvent(MouseScrollUnit.Line(delta), MouseScrollOrientation.Vertical)
)
}
+ @OptIn(InternalTestApi::class)
private fun ComposeTestRule.performMouseMove(x: Int, y: Int) {
(this as DesktopComposeTestRule).window.onMouseMoved(x, y)
}
diff --git a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt
index 50e864c..a3040c2 100644
--- a/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt
+++ b/compose/foundation/foundation/src/desktopTest/kotlin/androidx/compose/foundation/gestures/DesktopScrollableTest.kt
@@ -20,6 +20,7 @@
import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.mouse.MouseScrollEvent
import androidx.compose.ui.input.mouse.MouseScrollOrientation
@@ -34,6 +35,7 @@
import org.junit.runners.JUnit4
import kotlin.math.sqrt
+@OptIn(ExperimentalComposeUiApi::class)
@RunWith(JUnit4::class)
class DesktopScrollableTest {
private val density = 2f
diff --git a/compose/integration-tests/docs-snippets/build.gradle b/compose/integration-tests/docs-snippets/build.gradle
index bebdb14..28dec6e 100644
--- a/compose/integration-tests/docs-snippets/build.gradle
+++ b/compose/integration-tests/docs-snippets/build.gradle
@@ -15,6 +15,7 @@
*/
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -61,3 +62,13 @@
android.defaultConfig.minSdkVersion 21
android.buildFeatures.viewBinding true
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+}
\ No newline at end of file
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Intrinsics.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Intrinsics.kt
index 93eee39..7cc4eb4 100644
--- a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Intrinsics.kt
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Intrinsics.kt
@@ -70,7 +70,6 @@
Text(
modifier = Modifier
.weight(1f)
-
.padding(end = 4.dp)
.wrapContentWidth(Alignment.End),
diff --git a/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Material.kt b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Material.kt
new file mode 100644
index 0000000..3d240ca
--- /dev/null
+++ b/compose/integration-tests/docs-snippets/src/main/java/androidx/compose/integration/docs/layout/Material.kt
@@ -0,0 +1,566 @@
+// ktlint-disable indent https://github.com/pinterest/ktlint/issues/967
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Ignore lint warnings in documentation snippets
+@file:Suppress(
+ "unused", "UNUSED_PARAMETER", "UNUSED_VARIABLE", "RemoveEmptyParenthesesFromLambdaCall"
+)
+
+package androidx.compose.integration.docs.layout
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.shape.CornerSize
+import androidx.compose.material.BackdropScaffold
+import androidx.compose.material.BackdropValue
+import androidx.compose.material.BottomAppBar
+import androidx.compose.material.BottomDrawer
+import androidx.compose.material.BottomDrawerValue
+import androidx.compose.material.BottomSheetScaffold
+import androidx.compose.material.Button
+import androidx.compose.material.ButtonDefaults
+import androidx.compose.material.Divider
+import androidx.compose.material.DrawerValue
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.ExtendedFloatingActionButton
+import androidx.compose.material.FabPosition
+import androidx.compose.material.FloatingActionButton
+import androidx.compose.material.Icon
+import androidx.compose.material.IconButton
+import androidx.compose.material.MaterialTheme
+import androidx.compose.material.ModalBottomSheetLayout
+import androidx.compose.material.ModalBottomSheetValue
+import androidx.compose.material.ModalDrawer
+import androidx.compose.material.Scaffold
+import androidx.compose.material.SnackbarDuration
+import androidx.compose.material.SnackbarResult
+import androidx.compose.material.Text
+import androidx.compose.material.TopAppBar
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Close
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material.icons.filled.Menu
+import androidx.compose.material.rememberBackdropScaffoldState
+import androidx.compose.material.rememberBottomDrawerState
+import androidx.compose.material.rememberBottomSheetScaffoldState
+import androidx.compose.material.rememberDrawerState
+import androidx.compose.material.rememberModalBottomSheetState
+import androidx.compose.material.rememberScaffoldState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.launch
+
+/**
+ * This file lets DevRel track changes to snippets present in
+ * https://developer.android.com/jetpack/compose/layouts/material
+ *
+ * No action required if it's modified.
+ */
+
+private object MaterialSnippet1 {
+ @Composable
+ fun MyApp() {
+ MaterialTheme {
+ // Material Components like Button, Card, Switch, etc.
+ }
+ }
+}
+
+private object MaterialSnippet2 {
+ @Composable
+ fun MyButton() {
+ Button(
+ onClick = { /* ... */ },
+ // Uses ButtonDefaults.ContentPadding by default
+ contentPadding = PaddingValues(
+ start = 20.dp,
+ top = 12.dp,
+ end = 20.dp,
+ bottom = 12.dp
+ )
+ ) {
+ // Inner content including an icon and a text label
+ Icon(
+ Icons.Filled.Favorite,
+ contentDescription = "Favorite",
+ modifier = Modifier.size(ButtonDefaults.IconSize)
+ )
+ Spacer(Modifier.size(ButtonDefaults.IconSpacing))
+ Text("Like")
+ }
+ }
+}
+
+private object MaterialSnippet3 {
+ @Composable
+ fun MyExtendedFloatingActionButton() {
+ ExtendedFloatingActionButton(
+ onClick = { /* ... */ },
+ icon = {
+ Icon(
+ Icons.Filled.Favorite,
+ contentDescription = "Favorite"
+ )
+ },
+ text = { Text("Like") }
+ )
+ }
+}
+
+private object MaterialSnippet4 {
+ @Composable
+ fun MyScaffold() {
+ Scaffold(/* ... */) { contentPadding ->
+ // Screen content
+ Box(modifier = Modifier.padding(contentPadding)) { /* ... */ }
+ }
+ }
+}
+
+private object MaterialSnippet5 {
+ @Composable
+ fun MyTopAppBar() {
+ Scaffold(
+ topBar = {
+ TopAppBar { /* Top app bar content */ }
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet6 {
+ @Composable
+ fun MyBottomAppBar() {
+ Scaffold(
+ bottomBar = {
+ BottomAppBar { /* Bottom app bar content */ }
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet7 {
+ @Composable
+ fun MyFAB() {
+ Scaffold(
+ floatingActionButton = {
+ FloatingActionButton(onClick = { /* ... */ }) {
+ /* FAB content */
+ }
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet8 {
+ @Composable
+ fun MyFAB() {
+ Scaffold(
+ floatingActionButton = {
+ FloatingActionButton(onClick = { /* ... */ }) {
+ /* FAB content */
+ }
+ },
+ // Defaults to FabPosition.End
+ floatingActionButtonPosition = FabPosition.Center
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet9 {
+ @Composable
+ fun MyFAB() {
+ Scaffold(
+ floatingActionButton = {
+ FloatingActionButton(onClick = { /* ... */ }) {
+ /* FAB content */
+ }
+ },
+ // Defaults to false
+ isFloatingActionButtonDocked = true,
+ bottomBar = {
+ BottomAppBar { /* Bottom app bar content */ }
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet10 {
+ @Composable
+ fun MyFAB() {
+ Scaffold(
+ floatingActionButton = {
+ FloatingActionButton(onClick = { /* ... */ }) {
+ /* FAB content */
+ }
+ },
+ isFloatingActionButtonDocked = true,
+ bottomBar = {
+ BottomAppBar(
+ // Defaults to null, that is, no cutout
+ cutoutShape = MaterialTheme.shapes.small.copy(
+ CornerSize(percent = 50)
+ )
+ ) {
+ /* Bottom app bar content */
+ }
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet11 {
+ @Composable
+ fun MySnackbar() {
+ val scaffoldState = rememberScaffoldState()
+ val scope = rememberCoroutineScope()
+ Scaffold(
+ scaffoldState = scaffoldState,
+ floatingActionButton = {
+ ExtendedFloatingActionButton(
+ text = { Text("Show snackbar") },
+ onClick = {
+ scope.launch {
+ scaffoldState.snackbarHostState
+ .showSnackbar("Snackbar")
+ }
+ }
+ )
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet12 {
+ @Composable
+ fun MySnackbar() {
+ val scaffoldState = rememberScaffoldState()
+ val scope = rememberCoroutineScope()
+ Scaffold(
+ scaffoldState = scaffoldState,
+ floatingActionButton = {
+ ExtendedFloatingActionButton(
+ text = { Text("Show snackbar") },
+ onClick = {
+ scope.launch {
+ val result = scaffoldState.snackbarHostState
+ .showSnackbar(
+ message = "Snackbar",
+ actionLabel = "Action",
+ // Defaults to SnackbarDuration.Short
+ duration = SnackbarDuration.Indefinite
+ )
+ when (result) {
+ SnackbarResult.ActionPerformed -> {
+ /* Handle snackbar action performed */
+ }
+ SnackbarResult.Dismissed -> {
+ /* Handle snackbar dismissed */
+ }
+ }
+ }
+ }
+ )
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet13 {
+ @Composable
+ fun MyDrawer() {
+ Scaffold(
+ drawerContent = {
+ Text("Drawer title", modifier = Modifier.padding(16.dp))
+ Divider()
+ // Drawer items
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet14 {
+ @Composable
+ fun MyDrawer() {
+ Scaffold(
+ drawerContent = {
+ // Drawer content
+ },
+ // Defaults to true
+ drawerGesturesEnabled = false
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet15 {
+ @Composable
+ fun MyDrawer() {
+ val scaffoldState = rememberScaffoldState()
+ val scope = rememberCoroutineScope()
+ Scaffold(
+ scaffoldState = scaffoldState,
+ drawerContent = {
+ // Drawer content
+ },
+ floatingActionButton = {
+ ExtendedFloatingActionButton(
+ text = { Text("Open or close drawer") },
+ onClick = {
+ scope.launch {
+ scaffoldState.drawerState.apply {
+ if (isClosed) open() else close()
+ }
+ }
+ }
+ )
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet16 {
+ @Composable
+ fun MyModalDrawer() {
+ val drawerState = rememberDrawerState(DrawerValue.Closed)
+ ModalDrawer(
+ drawerState = drawerState,
+ drawerContent = {
+ // Drawer content
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet17 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyModalDrawer() {
+ val drawerState = rememberBottomDrawerState(BottomDrawerValue.Closed)
+ BottomDrawer(
+ drawerState = drawerState,
+ drawerContent = {
+ // Drawer content
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet18 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBottomSheet() {
+ BottomSheetScaffold(
+ sheetContent = {
+ // Sheet content
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet19 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBottomSheet() {
+ BottomSheetScaffold(
+ sheetContent = {
+ // Sheet content
+ },
+ // Defaults to BottomSheetScaffoldDefaults.SheetPeekHeight
+ sheetPeekHeight = 128.dp,
+ // Defaults to true
+ sheetGesturesEnabled = false
+
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet20 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBottomSheet() {
+ val scaffoldState = rememberBottomSheetScaffoldState()
+ val scope = rememberCoroutineScope()
+ BottomSheetScaffold(
+ scaffoldState = scaffoldState,
+ sheetContent = {
+ // Sheet content
+ },
+ floatingActionButton = {
+ ExtendedFloatingActionButton(
+ text = { Text("Expand or collapse sheet") },
+ onClick = {
+ scope.launch {
+ scaffoldState.bottomSheetState.apply {
+ if (isCollapsed) expand() else collapse()
+ }
+ }
+ }
+ )
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet21 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBottomSheet() {
+ val sheetState = rememberModalBottomSheetState(
+ ModalBottomSheetValue.Hidden
+ )
+ ModalBottomSheetLayout(
+ sheetState = sheetState,
+ sheetContent = {
+ // Sheet content
+ }
+ ) {
+ // Screen content
+ }
+ }
+}
+
+private object MaterialSnippet22 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBackdrop() {
+ BackdropScaffold(
+ appBar = {
+ // Top app bar
+ },
+ backLayerContent = {
+ // Back layer content
+ },
+ frontLayerContent = {
+ // Front layer content
+ }
+ )
+ }
+}
+
+private object MaterialSnippet23 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBackdrop() {
+ BackdropScaffold(
+ appBar = {
+ // Top app bar
+ },
+ backLayerContent = {
+ // Back layer content
+ },
+ frontLayerContent = {
+ // Front layer content
+ },
+ // Defaults to BackdropScaffoldDefaults.PeekHeight
+ peekHeight = 40.dp,
+ // Defaults to BackdropScaffoldDefaults.HeaderHeight
+ headerHeight = 60.dp,
+ // Defaults to true
+ gesturesEnabled = false
+ )
+ }
+}
+
+private object MaterialSnippet24 {
+ @ExperimentalMaterialApi
+ @Composable
+ fun MyBackdrop() {
+ val scaffoldState = rememberBackdropScaffoldState(
+ BackdropValue.Concealed
+ )
+ val scope = rememberCoroutineScope()
+ BackdropScaffold(
+ scaffoldState = scaffoldState,
+ appBar = {
+ TopAppBar(
+ title = { Text("Backdrop") },
+ navigationIcon = {
+ if (scaffoldState.isConcealed) {
+ IconButton(
+ onClick = {
+ scope.launch { scaffoldState.reveal() }
+ }
+ ) {
+ Icon(
+ Icons.Default.Menu,
+ contentDescription = "Menu"
+ )
+ }
+ } else {
+ IconButton(
+ onClick = {
+ scope.launch { scaffoldState.conceal() }
+ }
+ ) {
+ Icon(
+ Icons.Default.Close,
+ contentDescription = "Close"
+ )
+ }
+ }
+ },
+ elevation = 0.dp,
+ backgroundColor = Color.Transparent
+ )
+ },
+ backLayerContent = {
+ // Back layer content
+ },
+ frontLayerContent = {
+ // Front layer content
+ }
+ )
+ }
+}
diff --git a/compose/integration-tests/material-catalog/build.gradle b/compose/integration-tests/material-catalog/build.gradle
index 5e0a273..aace077 100644
--- a/compose/integration-tests/material-catalog/build.gradle
+++ b/compose/integration-tests/material-catalog/build.gradle
@@ -63,12 +63,13 @@
}
}
task.include("*.apk")
+ String projectPath = project.path
task.rename { fileName ->
- "${project.path.substring(1).replace(':', '-')}_$fileName"
+ "${projectPath.substring(1).replace(':', '-')}_$fileName"
}
task.destinationDir =
new File(BuildServerConfigurationKt.getDistributionDirectory(project), "apks")
- task.dependsOn(project.path + ":assembleRelease")
+ task.dependsOn(projectPath + ":assembleRelease")
}
BuildOnServerKt.addToBuildOnServer(project, copyReleaseApk)
diff --git a/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt b/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt
index 8d0f281..db5afd5 100644
--- a/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt
+++ b/compose/lint/common/src/main/java/androidx/compose/lint/ComposableUtils.kt
@@ -114,14 +114,14 @@
// The parameter is in a class file. Currently type annotations aren't currently added to
// the underlying type (https://youtrack.jetbrains.com/issue/KT-45307), so instead we use
// the metadata annotation.
- this is ClsParameterImpl
+ this is ClsParameterImpl ||
// In some cases when a method is defined in bytecode and the call fails to resolve
// to the ClsMethodImpl, we will instead get a LightParameter. Note that some Kotlin
// declarations too will also appear as a LightParameter, so we can check to see if
// the source language is Java, which means that this is a LightParameter for
// bytecode, as opposed to for a Kotlin declaration.
// https://youtrack.jetbrains.com/issue/KT-46883
- || (this is LightParameter && this.language is JavaLanguage) -> {
+ (this is LightParameter && this.language is JavaLanguage) -> {
// Find the containing method, so we can get metadata from the containing class
val containingMethod = getParentOfType<PsiMethod>(true)
val kmFunction = containingMethod!!.toKmFunction()
diff --git a/compose/material/material-icons-core/build.gradle b/compose/material/material-icons-core/build.gradle
index 73f45d3..f846ef2 100644
--- a/compose/material/material-icons-core/build.gradle
+++ b/compose/material/material-icons-core/build.gradle
@@ -39,6 +39,8 @@
api("androidx.compose.ui:ui:1.0.0")
implementation(project(":compose:runtime:runtime"))
implementation(libs.kotlinStdlib)
+
+ samples(project(":compose:material:material-icons-core:material-icons-core-samples"))
}
}
diff --git a/compose/material/material/api/current.txt b/compose/material/material/api/current.txt
index 47a989b..5f957f6 100644
--- a/compose/material/material/api/current.txt
+++ b/compose/material/material/api/current.txt
@@ -257,6 +257,9 @@
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
}
+ public final class ExposedDropdownMenuKt {
+ }
+
public final inline class FabPosition {
ctor public FabPosition();
}
diff --git a/compose/material/material/api/public_plus_experimental_current.txt b/compose/material/material/api/public_plus_experimental_current.txt
index 08a7f21..ef18be6 100644
--- a/compose/material/material/api/public_plus_experimental_current.txt
+++ b/compose/material/material/api/public_plus_experimental_current.txt
@@ -366,6 +366,24 @@
@kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterialApi {
}
+ @androidx.compose.material.ExperimentalMaterialApi public interface ExposedDropdownMenuBoxScope {
+ method @androidx.compose.runtime.Composable public default void ExposedDropdownMenu(boolean expanded, kotlin.jvm.functions.Function0<kotlin.Unit> onDismissRequest, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.ColumnScope,kotlin.Unit> content);
+ method public androidx.compose.ui.Modifier exposedDropdownSize(androidx.compose.ui.Modifier, optional boolean matchTextFieldWidth);
+ }
+
+ @androidx.compose.material.ExperimentalMaterialApi public final class ExposedDropdownMenuDefaults {
+ method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public void TrailingIcon(boolean expanded, optional kotlin.jvm.functions.Function0<kotlin.Unit> onIconClick);
+ method public androidx.compose.ui.window.PopupProperties getPopupProperties();
+ method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors outlinedTextFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedBorderColor, optional long unfocusedBorderColor, optional long disabledBorderColor, optional long errorBorderColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+ method @androidx.compose.runtime.Composable public androidx.compose.material.TextFieldColors textFieldColors(optional long textColor, optional long disabledTextColor, optional long backgroundColor, optional long cursorColor, optional long errorCursorColor, optional long focusedIndicatorColor, optional long unfocusedIndicatorColor, optional long disabledIndicatorColor, optional long errorIndicatorColor, optional long leadingIconColor, optional long disabledLeadingIconColor, optional long errorLeadingIconColor, optional long trailingIconColor, optional long focusedTrailingIconColor, optional long disabledTrailingIconColor, optional long errorTrailingIconColor, optional long focusedLabelColor, optional long unfocusedLabelColor, optional long disabledLabelColor, optional long errorLabelColor, optional long placeholderColor, optional long disabledPlaceholderColor);
+ property public final androidx.compose.ui.window.PopupProperties PopupProperties;
+ field public static final androidx.compose.material.ExposedDropdownMenuDefaults INSTANCE;
+ }
+
+ public final class ExposedDropdownMenuKt {
+ method @androidx.compose.material.ExperimentalMaterialApi @androidx.compose.runtime.Composable public static void ExposedDropdownMenuBox(boolean expanded, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onExpandedChange, optional androidx.compose.ui.Modifier modifier, kotlin.jvm.functions.Function1<? super androidx.compose.material.ExposedDropdownMenuBoxScope,kotlin.Unit> content);
+ }
+
public final inline class FabPosition {
ctor public FabPosition();
}
diff --git a/compose/material/material/api/restricted_current.txt b/compose/material/material/api/restricted_current.txt
index 47a989b..5f957f6 100644
--- a/compose/material/material/api/restricted_current.txt
+++ b/compose/material/material/api/restricted_current.txt
@@ -257,6 +257,9 @@
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.material.ElevationOverlay> getLocalElevationOverlay();
}
+ public final class ExposedDropdownMenuKt {
+ }
+
public final inline class FabPosition {
ctor public FabPosition();
}
diff --git a/compose/material/material/build.gradle b/compose/material/material/build.gradle
index f55cc5e..6c3d250 100644
--- a/compose/material/material/build.gradle
+++ b/compose/material/material/build.gradle
@@ -62,8 +62,11 @@
androidTestImplementation(libs.dexmakerMockito)
androidTestImplementation(libs.mockitoCore)
androidTestImplementation(libs.mockitoKotlin)
+ androidTestImplementation(libs.testUiautomator)
lintPublish project(":compose:material:material-lint")
+
+ samples(project(":compose:material:material:material-samples"))
}
}
diff --git a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt
index c4c0a5a..9e8aea3 100644
--- a/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt
+++ b/compose/material/material/icons/generator/src/main/kotlin/androidx/compose/material/icons/generator/tasks/IconGenerationTask.kt
@@ -169,10 +169,10 @@
// b/175401659 - disable lint as it takes a long time, and most errors should
// be caught by lint on material-icons-core anyway
project.afterEvaluate {
- project.tasks.named("lintAnalyzeRelease") { t ->
+ project.tasks.named("lintAnalyzeDebug") { t ->
t.enabled = false
}
- project.tasks.named("lintRelease") { t ->
+ project.tasks.named("lintDebug") { t ->
t.enabled = false
}
}
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DropdownMenuVariationDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DropdownMenuVariationDemo.kt
new file mode 100644
index 0000000..e97d59a
--- /dev/null
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/DropdownMenuVariationDemo.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2020 The Android expanded Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material.demos
+
+import android.view.WindowManager
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.foundation.layout.width
+import androidx.compose.material.Button
+import androidx.compose.material.DropdownMenu
+import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.sp
+import androidx.compose.ui.window.PopupProperties
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Composable
+fun DropdownMenuVariationsDemo() {
+ Column(
+ modifier = Modifier.fillMaxHeight().width(300.dp),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ Spacer(Modifier.requiredHeight(10.dp))
+
+ Text("Default Menu (not focusable)", fontSize = 20.sp)
+ DropdownMenuInstance()
+
+ Spacer(Modifier.requiredHeight(10.dp))
+
+ Text("Focusable menu", fontSize = 20.sp)
+ DropdownMenuInstance(PopupProperties(focusable = true))
+
+ Spacer(Modifier.requiredHeight(10.dp))
+
+ Text(
+ "Focusable Menu which propagates clicks",
+ fontSize = 20.sp
+ )
+ DropdownMenuInstance(
+ PopupProperties(
+ focusable = true,
+ updateAndroidWindowManagerFlags = { flags ->
+ flags or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ }
+ )
+ )
+ }
+}
+
+@Composable
+fun DropdownMenuInstance(popupProperties: PopupProperties = PopupProperties()) {
+ val options = listOf(
+ "Refresh",
+ "Settings",
+ "Send Feedback",
+ "Help",
+ "Signout"
+ )
+
+ var expanded by remember { mutableStateOf(false) }
+
+ Box {
+ Button(onClick = { expanded = true }) {
+ Text("SHOW MENU")
+ }
+ DropdownMenu(
+ expanded = expanded,
+ onDismissRequest = { expanded = false },
+ properties = popupProperties,
+ ) {
+ options.forEach {
+ DropdownMenuItem(onClick = { expanded = false }) {
+ Text(it)
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt
new file mode 100644
index 0000000..a2a8b5a
--- /dev/null
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/ExposedDropdownMenuDemo.kt
@@ -0,0 +1,132 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material.demos
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.ExposedDropdownMenuBox
+import androidx.compose.material.ExposedDropdownMenuDefaults
+import androidx.compose.material.OutlinedTextField
+import androidx.compose.material.Text
+import androidx.compose.material.TextField
+import androidx.compose.material.samples.EditableExposedDropdownMenuSample
+import androidx.compose.material.samples.ExposedDropdownMenuSample
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.unit.dp
+
+@Composable
+fun ExposedDropdownMenuDemo() {
+ Column(
+ verticalArrangement = Arrangement.spacedBy(DefaultSpace)
+ ) {
+ ExposedDropdownMenuSample()
+
+ EditableExposedDropdownMenuSample()
+
+ OutlinedExposedDropdownMenu(isReadOnly = true)
+
+ OutlinedExposedDropdownMenu()
+ }
+}
+
+@Composable
+fun OutlinedExposedDropdownMenu(isReadOnly: Boolean = false) {
+ ExposedDropdownMenuImpl(true, isReadOnly)
+}
+
+@OptIn(ExperimentalMaterialApi::class, androidx.compose.ui.ExperimentalComposeUiApi::class)
+@Composable
+fun ExposedDropdownMenuImpl(isOutlined: Boolean, isReadOnly: Boolean) {
+ val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
+ var expanded by remember { mutableStateOf(false) }
+ var selectedOptionText by remember { mutableStateOf(if (isReadOnly) options[0] else "") }
+ // We want to react on tap/press on TextField to show menu
+ ExposedDropdownMenuBox(
+ expanded = expanded,
+ onExpandedChange = {
+ expanded = !expanded
+ }
+ ) {
+ if (isOutlined) {
+ OutlinedTextField(
+ readOnly = isReadOnly,
+ value = selectedOptionText,
+ onValueChange = { selectedOptionText = it },
+ label = { Text("Label") },
+ trailingIcon = {
+ ExposedDropdownMenuDefaults.TrailingIcon(
+ expanded = expanded
+ )
+ },
+ colors = ExposedDropdownMenuDefaults.outlinedTextFieldColors()
+ )
+ } else {
+ TextField(
+ readOnly = isReadOnly,
+ value = selectedOptionText,
+ onValueChange = { selectedOptionText = it },
+ label = { Text("Label") },
+ trailingIcon = {
+ ExposedDropdownMenuDefaults.TrailingIcon(
+ expanded = expanded
+ )
+ },
+ colors = ExposedDropdownMenuDefaults.textFieldColors()
+ )
+ }
+ if (
+ options.any {
+ it.contains(
+ selectedOptionText,
+ ignoreCase = true
+ )
+ } || isReadOnly
+ ) {
+ ExposedDropdownMenu(
+ expanded = expanded,
+ onDismissRequest = {
+ expanded = false
+ }
+ ) {
+ options.forEach { selectionOption ->
+ if (selectionOption.contains(
+ selectedOptionText,
+ ignoreCase = true
+ ) || isReadOnly
+ ) {
+ DropdownMenuItem(
+ onClick = {
+ selectedOptionText = selectionOption
+ expanded = false
+ }
+ ) {
+ Text(text = selectionOption)
+ }
+ }
+ }
+ }
+ }
+ }
+}
+
+private val DefaultSpace = 20.dp
\ No newline at end of file
diff --git a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
index 0890d9e..c69e980 100644
--- a/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
+++ b/compose/material/material/integration-tests/material-demos/src/main/java/androidx/compose/material/demos/MaterialDemos.kt
@@ -35,6 +35,7 @@
val MaterialDemos = DemoCategory(
"Material",
listOf(
+ ComposableDemo("ExposedDropdownMenu") { ExposedDropdownMenuDemo() },
DemoCategory(
"AlertDialog",
listOf(
@@ -71,7 +72,13 @@
)
),
ComposableDemo("Material Theme") { MaterialThemeDemo() },
- ComposableDemo("Menus") { MenuDemo() },
+ DemoCategory(
+ "Menus",
+ listOf(
+ ComposableDemo("Dropdown Menu positioning") { MenuDemo() },
+ ComposableDemo("Menu variations") { DropdownMenuVariationsDemo() },
+ )
+ ),
ComposableDemo("Navigation Rail") { NavigationRailDemo() },
DemoCategory(
"Playground",
diff --git a/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt
new file mode 100644
index 0000000..67f435f
--- /dev/null
+++ b/compose/material/material/samples/src/main/java/androidx/compose/material/samples/ExposedDropdownMenuSamples.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.material.DropdownMenuItem
+import androidx.compose.material.ExperimentalMaterialApi
+import androidx.compose.material.ExposedDropdownMenuBox
+import androidx.compose.material.ExposedDropdownMenuDefaults
+import androidx.compose.material.Text
+import androidx.compose.material.TextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+
+@OptIn(ExperimentalMaterialApi::class)
+@Sampled
+@Composable
+fun ExposedDropdownMenuSample() {
+ val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
+ var expanded by remember { mutableStateOf(false) }
+ var selectedOptionText by remember { mutableStateOf(options[0]) }
+ // We want to react on tap/press on TextField to show menu
+ ExposedDropdownMenuBox(
+ expanded = expanded,
+ onExpandedChange = {
+ expanded = !expanded
+ }
+ ) {
+ TextField(
+ readOnly = true,
+ value = selectedOptionText,
+ onValueChange = { },
+ label = { Text("Label") },
+ trailingIcon = {
+ ExposedDropdownMenuDefaults.TrailingIcon(
+ expanded = expanded
+ )
+ },
+ colors = ExposedDropdownMenuDefaults.textFieldColors()
+ )
+ ExposedDropdownMenu(
+ expanded = expanded,
+ onDismissRequest = {
+ expanded = false
+ }
+ ) {
+ options.forEach { selectionOption ->
+ DropdownMenuItem(
+ onClick = {
+ selectedOptionText = selectionOption
+ expanded = false
+ }
+ ) {
+ Text(text = selectionOption)
+ }
+ }
+ }
+ }
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+@Sampled
+@Composable
+fun EditableExposedDropdownMenuSample() {
+ val options = listOf("Option 1", "Option 2", "Option 3", "Option 4", "Option 5")
+ var expanded by remember { mutableStateOf(false) }
+ var selectedOptionText by remember { mutableStateOf("") }
+ ExposedDropdownMenuBox(
+ expanded = expanded,
+ onExpandedChange = {
+ expanded = !expanded
+ }
+ ) {
+ TextField(
+ value = selectedOptionText,
+ onValueChange = { selectedOptionText = it },
+ label = { Text("Label") },
+ trailingIcon = {
+ ExposedDropdownMenuDefaults.TrailingIcon(
+ expanded = expanded
+ )
+ },
+ colors = ExposedDropdownMenuDefaults.textFieldColors()
+ )
+ // filter options based on text field value
+ val filteringOptions =
+ options.filter { it.contains(selectedOptionText, ignoreCase = true) }
+ if (filteringOptions.isNotEmpty()) {
+ ExposedDropdownMenu(
+ expanded = expanded,
+ onDismissRequest = {
+ expanded = false
+ }
+ ) {
+ filteringOptions.forEach { selectionOption ->
+ DropdownMenuItem(
+ onClick = {
+ selectedOptionText = selectionOption
+ expanded = false
+ }
+ ) {
+ Text(text = selectionOption)
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt
index 13e251a..4c44037d 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/AppBarTest.kt
@@ -17,6 +17,7 @@
package androidx.compose.material
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -258,11 +259,12 @@
}
/**
- * [IconButton] that just draws a red box, to simulate a real icon for testing positions.
+ * A 48.dp box with a red box inside, to simulate an [IconButton] with a real icon inside for
+ * testing positions.
*/
private val FakeIcon = @Composable { modifier: Modifier ->
- IconButton(onClick = {}, modifier = modifier) {
- Icon(ColorPainter(Color.Red), null)
+ Box(Modifier.size(48.dp)) {
+ Icon(ColorPainter(Color.Red), null, modifier)
}
}
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt
new file mode 100644
index 0000000..43a598b
--- /dev/null
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/ExposedDropdownMenuTest.kt
@@ -0,0 +1,235 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.layout.boundsInRoot
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.assertIsFocused
+import androidx.compose.ui.test.assertTextContains
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.UiDevice
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalMaterialApi::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class ExposedDropdownMenuTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ private val EDMBoxTag = "ExposedDropdownMenuBoxTag"
+ private val TFTag = "TextFieldTag"
+ private val TrailingIconTag = "TrailingIconTag"
+ private val EDMTag = "ExposedDropdownMenuTag"
+ private val MenuItemTag = "MenuItemTag"
+ private val OptionName = "Option 1"
+
+ @Test
+ fun expandedBehaviour_expandsOnClickAndCollapsesOnOutside() {
+ var textFieldBounds = Rect.Zero
+ rule.setMaterialContent {
+ var expanded by remember { mutableStateOf(false) }
+ ExposedDropdownMenuForTest(
+ expanded = expanded,
+ onExpandChange = { expanded = it },
+ onTextFieldBoundsChanged = {
+ textFieldBounds = it
+ }
+ )
+ }
+
+ rule.onNodeWithTag(TFTag).assertIsDisplayed()
+ rule.onNodeWithTag(EDMTag).assertDoesNotExist()
+
+ // Click on the TextField
+ rule.onNodeWithTag(TFTag).performClick()
+
+ rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
+
+ // Click outside EDM
+ UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).click(
+ (textFieldBounds.right + 1).toInt(),
+ (textFieldBounds.bottom + 1).toInt(),
+ )
+
+ rule.onNodeWithTag(MenuItemTag).assertDoesNotExist()
+ }
+
+ @Test
+ fun expandedBehaviour_collapseOnTextFieldClick() {
+ rule.setMaterialContent {
+ var expanded by remember { mutableStateOf(true) }
+ ExposedDropdownMenuForTest(
+ expanded = expanded,
+ onExpandChange = { expanded = it }
+ )
+ }
+
+ rule.onNodeWithTag(TFTag).assertIsDisplayed()
+ rule.onNodeWithTag(EDMTag).assertIsDisplayed()
+ rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
+
+ // Click on the TextField
+ rule.onNodeWithTag(TFTag).performClick()
+
+ rule.onNodeWithTag(MenuItemTag).assertDoesNotExist()
+ }
+
+ @Test
+ fun expandedBehaviour_expandsAndFocusesTextFieldOnTrailingIconClick() {
+ rule.setMaterialContent {
+ var expanded by remember { mutableStateOf(false) }
+ ExposedDropdownMenuForTest(
+ expanded = expanded,
+ onExpandChange = { expanded = it },
+ )
+ }
+
+ rule.onNodeWithTag(TFTag).assertIsDisplayed()
+ rule.onNodeWithTag(TrailingIconTag, useUnmergedTree = true).assertIsDisplayed()
+
+ // Click on the Trailing Icon
+ rule.onNodeWithTag(TrailingIconTag, useUnmergedTree = true).performClick()
+
+ rule.onNodeWithTag(TFTag).assertIsFocused()
+ rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
+ }
+
+ @Test
+ fun uiProperties_menuMatchesTextWidth() {
+ var textFieldBounds by mutableStateOf(Rect.Zero)
+ var menuBounds by mutableStateOf(Rect.Zero)
+ rule.setMaterialContent {
+ var expanded by remember { mutableStateOf(true) }
+ ExposedDropdownMenuForTest(
+ expanded = expanded,
+ onExpandChange = { expanded = it },
+ onTextFieldBoundsChanged = {
+ textFieldBounds = it
+ },
+ onMenuBoundsChanged = {
+ menuBounds = it
+ }
+ )
+ }
+
+ rule.onNodeWithTag(TFTag).assertIsDisplayed()
+ rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
+
+ rule.runOnIdle {
+ assertThat(menuBounds.width).isEqualTo(textFieldBounds.width)
+ }
+ }
+
+ @Test
+ fun EDMBehaviour_rightOptionIsChosen() {
+ rule.setMaterialContent {
+ var expanded by remember { mutableStateOf(true) }
+ ExposedDropdownMenuForTest(
+ expanded = expanded,
+ onExpandChange = { expanded = it }
+ )
+ }
+
+ rule.onNodeWithTag(TFTag).assertIsDisplayed()
+ rule.onNodeWithTag(MenuItemTag).assertIsDisplayed()
+
+ // Choose the option
+ rule.onNodeWithTag(MenuItemTag).performClick()
+
+ // Menu should collapse
+ rule.onNodeWithTag(MenuItemTag).assertDoesNotExist()
+ rule.onNodeWithTag(TFTag).assertTextContains(OptionName)
+ }
+
+ @Composable
+ fun ExposedDropdownMenuForTest(
+ expanded: Boolean,
+ onExpandChange: (Boolean) -> Unit,
+ onTextFieldBoundsChanged: ((Rect) -> Unit)? = null,
+ onMenuBoundsChanged: ((Rect) -> Unit)? = null
+ ) {
+ var selectedOptionText by remember { mutableStateOf("") }
+ Box(Modifier.fillMaxSize()) {
+ ExposedDropdownMenuBox(
+ modifier = Modifier.testTag(EDMBoxTag).align(Alignment.Center),
+ expanded = expanded,
+ onExpandedChange = { onExpandChange(!expanded) }
+ ) {
+ TextField(
+ modifier = Modifier.testTag(TFTag)
+ .onGloballyPositioned {
+ onTextFieldBoundsChanged?.invoke(it.boundsInRoot())
+ },
+ value = selectedOptionText,
+ onValueChange = { selectedOptionText = it },
+ label = { Text("Label") },
+ trailingIcon = {
+ Box(
+ modifier = Modifier.testTag(TrailingIconTag)
+ ) {
+ ExposedDropdownMenuDefaults.TrailingIcon(
+ expanded = expanded
+ )
+ }
+ },
+ colors = ExposedDropdownMenuDefaults.textFieldColors()
+ )
+ ExposedDropdownMenu(
+ modifier = Modifier.testTag(EDMTag).onGloballyPositioned {
+ onMenuBoundsChanged?.invoke(it.boundsInRoot())
+ },
+ expanded = expanded,
+ onDismissRequest = { onExpandChange(false) }
+ ) {
+ DropdownMenuItem(
+ onClick = {
+ selectedOptionText = OptionName
+ onExpandChange(false)
+ },
+ modifier = Modifier.testTag(MenuItemTag)
+ ) {
+ Text(
+ text = OptionName
+ )
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconButtonTest.kt b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconButtonTest.kt
index d184cd1..71b1b5f 100644
--- a/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconButtonTest.kt
+++ b/compose/material/material/src/androidAndroidTest/kotlin/androidx/compose/material/IconButtonTest.kt
@@ -21,6 +21,7 @@
import androidx.compose.foundation.layout.size
import androidx.compose.material.samples.IconButtonSample
import androidx.compose.material.samples.IconToggleButtonSample
+import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
@@ -74,6 +75,21 @@
.assertHeightIsEqualTo(height)
}
+ @OptIn(ExperimentalMaterialApi::class)
+ @Test
+ fun iconButton_size_withoutMinimumTouchTarget() {
+ val width = 24.dp
+ val height = 24.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
+ IconButtonSample()
+ }
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
@Test
fun iconButton_defaultSemantics() {
rule.setMaterialContent {
@@ -168,6 +184,21 @@
.assertHeightIsEqualTo(height)
}
+ @OptIn(ExperimentalMaterialApi::class)
+ @Test
+ fun iconToggleButton_size_withoutMinimumTouchTarget() {
+ val width = 24.dp
+ val height = 24.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
+ IconToggleButtonSample()
+ }
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
@Test
fun iconToggleButton_defaultSemantics() {
rule.setMaterialContent {
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.kt
new file mode 100644
index 0000000..3b85ffd
--- /dev/null
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/ExposedDropdownMenu.kt
@@ -0,0 +1,692 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material
+
+import android.graphics.Rect
+import android.view.View
+import android.view.ViewTreeObserver
+import android.view.WindowManager
+import androidx.compose.animation.animateColorAsState
+import androidx.compose.animation.core.tween
+import androidx.compose.foundation.gestures.forEachGesture
+import androidx.compose.foundation.interaction.InteractionSource
+import androidx.compose.foundation.interaction.collectIsFocusedAsState
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.heightIn
+import androidx.compose.foundation.layout.width
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.ArrowDropDown
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.DisposableEffect
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.SideEffect
+import androidx.compose.runtime.State
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.rotate
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.input.pointer.PointerEvent
+import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.input.pointer.changedToUp
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.boundsInWindow
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.node.Ref
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.semantics.clearAndSetSemantics
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.onClick
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.unit.IntRect
+import androidx.compose.ui.util.fastAll
+import androidx.compose.ui.window.PopupProperties
+import kotlinx.coroutines.coroutineScope
+import kotlin.math.max
+
+/**
+ * [Material Design Exposed Dropdown Menu](https://material.io/components/menus#exposed-dropdown-menu).
+ *
+ * Box for Exposed Dropdown Menu. Expected to contain [TextField] and
+ * [ExposedDropdownMenuBoxScope.ExposedDropdownMenu] as a content.
+ *
+ * An example of read-only Exposed Dropdown Menu:
+ *
+ * @sample androidx.compose.material.samples.ExposedDropdownMenuSample
+ *
+ * An example of editable Exposed Dropdown Menu:
+ *
+ * @sample androidx.compose.material.samples.EditableExposedDropdownMenuSample
+ *
+ * @param expanded Whether Dropdown Menu should be expanded or not.
+ * @param onExpandedChange Executes when the user clicks on the ExposedDropdownMenuBox.
+ * @param modifier The modifier to apply to this layout
+ * @param content The content to be displayed inside ExposedDropdownMenuBox.
+ */
+@ExperimentalMaterialApi
+@Composable
+fun ExposedDropdownMenuBox(
+ expanded: Boolean,
+ onExpandedChange: (Boolean) -> Unit,
+ modifier: Modifier = Modifier,
+ content: @Composable ExposedDropdownMenuBoxScope.() -> Unit
+) {
+ val density = LocalDensity.current
+ val view = LocalView.current
+ var width by remember { mutableStateOf(0) }
+ var menuHeight by remember { mutableStateOf(0) }
+ val verticalMarginInPx = with(density) { MenuVerticalMargin.roundToPx() }
+ val coordinates = remember { Ref<LayoutCoordinates>() }
+
+ val scope = remember(density, menuHeight, width) {
+ object : ExposedDropdownMenuBoxScope {
+ override fun Modifier.exposedDropdownSize(matchTextFieldWidth: Boolean): Modifier {
+ return with(density) {
+ heightIn(max = menuHeight.toDp()).let {
+ if (matchTextFieldWidth) {
+ it.width(width.toDp())
+ } else it
+ }
+ }
+ }
+ }
+ }
+ val focusRequester = remember { FocusRequester() }
+
+ Box(
+ modifier.onGloballyPositioned {
+ width = it.size.width
+ coordinates.value = it
+ updateHeight(
+ view.rootView,
+ coordinates.value,
+ verticalMarginInPx
+ ) { newHeight ->
+ menuHeight = newHeight
+ }
+ }.expandable(
+ onExpandedChange = { onExpandedChange(!expanded) },
+ menuLabel = getString(Strings.ExposedDropdownMenu)
+ ).focusRequester(focusRequester)
+ ) {
+ scope.content()
+ }
+
+ SideEffect {
+ if (expanded) focusRequester.requestFocus()
+ }
+
+ DisposableEffect(view) {
+ val listener = ViewTreeObserver.OnGlobalLayoutListener {
+ updateHeight(
+ view.rootView,
+ coordinates.value,
+ verticalMarginInPx
+ ) { newHeight ->
+ menuHeight = newHeight
+ }
+ }
+ view.viewTreeObserver.addOnGlobalLayoutListener(listener)
+ onDispose {
+ view.viewTreeObserver.removeOnGlobalLayoutListener(listener)
+ }
+ }
+}
+
+/**
+ * Scope for [ExposedDropdownMenuBox].
+ */
+@ExperimentalMaterialApi
+interface ExposedDropdownMenuBoxScope {
+ /**
+ * Modifier which should be applied to an [ExposedDropdownMenu]
+ * placed inside the scope. It's responsible for
+ * setting the width of the [ExposedDropdownMenu], which
+ * will match the width of the [TextField]
+ * (if [matchTextFieldWidth] is set to true).
+ * Also it'll change the height of [ExposedDropdownMenu], so
+ * it'll take the largest possible height to not overlap
+ * the [TextField] and the software keyboard.
+ *
+ * @param matchTextFieldWidth Whether menu should match
+ * the width of the text field to which it's attached.
+ * If set to true the width will match the width
+ * of the text field.
+ */
+ fun Modifier.exposedDropdownSize(
+ matchTextFieldWidth: Boolean = true
+ ): Modifier
+
+ /**
+ * Popup which contains content for Exposed Dropdown Menu.
+ * Should be used inside the content of [ExposedDropdownMenuBox].
+ *
+ * @param expanded Whether the menu is currently open and visible to the user
+ * @param onDismissRequest Called when the user requests to dismiss the menu, such as by
+ * tapping outside the menu's bounds
+ * @param modifier The modifier to apply to this layout
+ * @param content The content of the [ExposedDropdownMenu]
+ */
+ @Composable
+ fun ExposedDropdownMenu(
+ expanded: Boolean,
+ onDismissRequest: () -> Unit,
+ modifier: Modifier = Modifier,
+ content: @Composable ColumnScope.() -> Unit
+ ) = DropdownMenu(
+ expanded = expanded,
+ onDismissRequest = onDismissRequest,
+ modifier = modifier.exposedDropdownSize(),
+ properties = ExposedDropdownMenuDefaults.PopupProperties,
+ content = content
+ )
+}
+
+/**
+ * Contains default values used by Exposed Dropdown Menu.
+ */
+@OptIn(ExperimentalComposeUiApi::class)
+@ExperimentalMaterialApi
+object ExposedDropdownMenuDefaults {
+ /**
+ * The default Popup Properties for ExposedDropdownMenu inside ExposedDropdownMenuBox.
+ * ExposedDropdownMenu will be focusable, will propagate clicks, work with input method,
+ * won't be dismissed when Text Field was clicked.
+ */
+ val PopupProperties = PopupProperties(
+ focusable = true,
+ dismissOnOutsideClick = { offset: Offset?, bounds: IntRect ->
+ if (offset == null) false
+ else {
+ offset.x < bounds.left || offset.x > bounds.right ||
+ offset.y < bounds.top || offset.y > bounds.bottom
+ }
+ },
+ updateAndroidWindowManagerFlags = { flags ->
+ flags or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or WindowManager
+ .LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ }
+ )
+
+ /**
+ * Default trailing icon for Exposed Dropdown Menu.
+ *
+ * @param expanded Whether [ExposedDropdownMenuBoxScope.ExposedDropdownMenu]
+ * is expanded or not. Affects the appearance of the icon.
+ * @param onIconClick Called when the icon was clicked.
+ */
+ @ExperimentalMaterialApi
+ @Composable
+ fun TrailingIcon(
+ expanded: Boolean,
+ onIconClick: () -> Unit = {}
+ ) {
+ // Clear semantics here as otherwise icon will be a11y focusable but without an
+ // action. When there's an API to check if Talkback is on, developer will be able to
+ // expand the menu on icon click in a11y mode only esp. if using their own custom
+ // trailing icon.
+ IconButton(onClick = onIconClick, modifier = Modifier.clearAndSetSemantics { }) {
+ Icon(
+ Icons.Filled.ArrowDropDown,
+ "Trailing icon for exposed dropdown menu",
+ Modifier.rotate(
+ if (expanded)
+ 180f
+ else
+ 360f
+ )
+ )
+ }
+ }
+
+ /**
+ * Creates a [TextFieldColors] that represents the default input text, background and content
+ * (including label, placeholder, leading and trailing icons) colors used in a [TextField].
+ *
+ * @param textColor Represents the color used for the input text of this text field.
+ * @param disabledTextColor Represents the color used for the input text of this text field
+ * when it's disabled.
+ * @param backgroundColor Represents the background color for this text field.
+ * @param cursorColor Represents the cursor color for this text field.
+ * @param errorCursorColor Represents the cursor color for this text field
+ * when it's in error state.
+ * @param focusedIndicatorColor Represents the indicator color for this text field
+ * when it's focused.
+ * @param unfocusedIndicatorColor Represents the indicator color for this text field
+ * when it's not focused.
+ * @param disabledIndicatorColor Represents the indicator color for this text field
+ * when it's disabled.
+ * @param errorIndicatorColor Represents the indicator color for this text field
+ * when it's in error state.
+ * @param leadingIconColor Represents the leading icon color for this text field.
+ * @param disabledLeadingIconColor Represents the leading icon color for this text field
+ * when it's disabled.
+ * @param errorLeadingIconColor Represents the leading icon color for this text field
+ * when it's in error state.
+ * @param trailingIconColor Represents the trailing icon color for this text field.
+ * @param focusedTrailingIconColor Represents the trailing icon color for this text field
+ * when it's focused.
+ * @param disabledTrailingIconColor Represents the trailing icon color for this text field
+ * when it's disabled.
+ * @param errorTrailingIconColor Represents the trailing icon color for this text field
+ * when it's in error state.
+ * @param focusedLabelColor Represents the label color for this text field
+ * when it's focused.
+ * @param unfocusedLabelColor Represents the label color for this text field
+ * when it's not focused.
+ * @param disabledLabelColor Represents the label color for this text field
+ * when it's disabled.
+ * @param errorLabelColor Represents the label color for this text field
+ * when it's in error state.
+ * @param placeholderColor Represents the placeholder color for this text field.
+ * @param disabledPlaceholderColor Represents the placeholder color for this text field
+ * when it's disabled.
+ */
+ @Composable
+ fun textFieldColors(
+ textColor: Color = LocalContentColor.current.copy(LocalContentAlpha.current),
+ disabledTextColor: Color = textColor.copy(ContentAlpha.disabled),
+ backgroundColor: Color =
+ MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.BackgroundOpacity),
+ cursorColor: Color = MaterialTheme.colors.primary,
+ errorCursorColor: Color = MaterialTheme.colors.error,
+ focusedIndicatorColor: Color =
+ MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+ unfocusedIndicatorColor: Color =
+ MaterialTheme.colors.onSurface.copy(
+ alpha = TextFieldDefaults.UnfocusedIndicatorLineOpacity
+ ),
+ disabledIndicatorColor: Color = unfocusedIndicatorColor.copy(alpha = ContentAlpha.disabled),
+ errorIndicatorColor: Color = MaterialTheme.colors.error,
+ leadingIconColor: Color =
+ MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.IconOpacity),
+ disabledLeadingIconColor: Color = leadingIconColor.copy(alpha = ContentAlpha.disabled),
+ errorLeadingIconColor: Color = leadingIconColor,
+ trailingIconColor: Color =
+ MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.IconOpacity),
+ focusedTrailingIconColor: Color =
+ MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+ disabledTrailingIconColor: Color = trailingIconColor.copy(alpha = ContentAlpha.disabled),
+ errorTrailingIconColor: Color = MaterialTheme.colors.error,
+ focusedLabelColor: Color =
+ MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+ unfocusedLabelColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
+ disabledLabelColor: Color = unfocusedLabelColor.copy(ContentAlpha.disabled),
+ errorLabelColor: Color = MaterialTheme.colors.error,
+ placeholderColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
+ disabledPlaceholderColor: Color = placeholderColor.copy(ContentAlpha.disabled)
+ ): TextFieldColors =
+ DefaultTextFieldForExposedDropdownMenusColors(
+ textColor = textColor,
+ disabledTextColor = disabledTextColor,
+ cursorColor = cursorColor,
+ errorCursorColor = errorCursorColor,
+ focusedIndicatorColor = focusedIndicatorColor,
+ unfocusedIndicatorColor = unfocusedIndicatorColor,
+ errorIndicatorColor = errorIndicatorColor,
+ disabledIndicatorColor = disabledIndicatorColor,
+ leadingIconColor = leadingIconColor,
+ disabledLeadingIconColor = disabledLeadingIconColor,
+ errorLeadingIconColor = errorLeadingIconColor,
+ trailingIconColor = trailingIconColor,
+ focusedTrailingIconColor = focusedTrailingIconColor,
+ disabledTrailingIconColor = disabledTrailingIconColor,
+ errorTrailingIconColor = errorTrailingIconColor,
+ backgroundColor = backgroundColor,
+ focusedLabelColor = focusedLabelColor,
+ unfocusedLabelColor = unfocusedLabelColor,
+ disabledLabelColor = disabledLabelColor,
+ errorLabelColor = errorLabelColor,
+ placeholderColor = placeholderColor,
+ disabledPlaceholderColor = disabledPlaceholderColor
+ )
+
+ /**
+ * Creates a [TextFieldColors] that represents the default input text, background and content
+ * (including label, placeholder, leading and trailing icons) colors used in an
+ * [OutlinedTextField].
+ *
+ * @param textColor Represents the color used for the input text of this text field.
+ * @param disabledTextColor Represents the color used for the input text of this text field
+ * when it's disabled.
+ * @param backgroundColor Represents the background color for this text field.
+ * @param cursorColor Represents the cursor color for this text field.
+ * @param errorCursorColor Represents the cursor color for this text field
+ * when it's in error state.
+ * @param focusedBorderColor Represents the border color for this text field
+ * when it's focused.
+ * @param unfocusedBorderColor Represents the border color for this text field
+ * when it's not focused.
+ * @param disabledBorderColor Represents the border color for this text field
+ * when it's disabled.
+ * @param errorBorderColor Represents the border color for this text field
+ * when it's in error state.
+ * @param leadingIconColor Represents the leading icon color for this text field.
+ * @param disabledLeadingIconColor Represents the leading icon color for this text field
+ * when it's disabled.
+ * @param errorLeadingIconColor Represents the leading icon color for this text field
+ * when it's in error state.
+ * @param trailingIconColor Represents the trailing icon color for this text field.
+ * @param focusedTrailingIconColor Represents the trailing icon color for this text field
+ * when it's focused.
+ * @param disabledTrailingIconColor Represents the trailing icon color for this text field
+ * when it's disabled.
+ * @param errorTrailingIconColor Represents the trailing icon color for this text field
+ * when it's in error state.
+ * @param focusedLabelColor Represents the label color for this text field
+ * when it's focused.
+ * @param unfocusedLabelColor Represents the label color for this text field
+ * when it's not focused.
+ * @param disabledLabelColor Represents the label color for this text field
+ * when it's disabled.
+ * @param errorLabelColor Represents the label color for this text field
+ * when it's in error state.
+ * @param placeholderColor Represents the placeholder color for this text field.
+ * @param disabledPlaceholderColor Represents the placeholder color for this text field
+ * when it's disabled.
+ */
+ @Composable
+ fun outlinedTextFieldColors(
+ textColor: Color = LocalContentColor.current.copy(LocalContentAlpha.current),
+ disabledTextColor: Color = textColor.copy(ContentAlpha.disabled),
+ backgroundColor: Color = Color.Transparent,
+ cursorColor: Color = MaterialTheme.colors.primary,
+ errorCursorColor: Color = MaterialTheme.colors.error,
+ focusedBorderColor: Color =
+ MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+ unfocusedBorderColor: Color =
+ MaterialTheme.colors.onSurface.copy(alpha = ContentAlpha.disabled),
+ disabledBorderColor: Color = unfocusedBorderColor.copy(alpha = ContentAlpha.disabled),
+ errorBorderColor: Color = MaterialTheme.colors.error,
+ leadingIconColor: Color =
+ MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.IconOpacity),
+ disabledLeadingIconColor: Color = leadingIconColor.copy(alpha = ContentAlpha.disabled),
+ errorLeadingIconColor: Color = leadingIconColor,
+ trailingIconColor: Color =
+ MaterialTheme.colors.onSurface.copy(alpha = TextFieldDefaults.IconOpacity),
+ focusedTrailingIconColor: Color =
+ MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+ disabledTrailingIconColor: Color = trailingIconColor.copy(alpha = ContentAlpha.disabled),
+ errorTrailingIconColor: Color = MaterialTheme.colors.error,
+ focusedLabelColor: Color =
+ MaterialTheme.colors.primary.copy(alpha = ContentAlpha.high),
+ unfocusedLabelColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
+ disabledLabelColor: Color = unfocusedLabelColor.copy(ContentAlpha.disabled),
+ errorLabelColor: Color = MaterialTheme.colors.error,
+ placeholderColor: Color = MaterialTheme.colors.onSurface.copy(ContentAlpha.medium),
+ disabledPlaceholderColor: Color = placeholderColor.copy(ContentAlpha.disabled)
+ ): TextFieldColors =
+ DefaultTextFieldForExposedDropdownMenusColors(
+ textColor = textColor,
+ disabledTextColor = disabledTextColor,
+ cursorColor = cursorColor,
+ errorCursorColor = errorCursorColor,
+ focusedIndicatorColor = focusedBorderColor,
+ unfocusedIndicatorColor = unfocusedBorderColor,
+ errorIndicatorColor = errorBorderColor,
+ disabledIndicatorColor = disabledBorderColor,
+ leadingIconColor = leadingIconColor,
+ disabledLeadingIconColor = disabledLeadingIconColor,
+ errorLeadingIconColor = errorLeadingIconColor,
+ trailingIconColor = trailingIconColor,
+ focusedTrailingIconColor = focusedTrailingIconColor,
+ disabledTrailingIconColor = disabledTrailingIconColor,
+ errorTrailingIconColor = errorTrailingIconColor,
+ backgroundColor = backgroundColor,
+ focusedLabelColor = focusedLabelColor,
+ unfocusedLabelColor = unfocusedLabelColor,
+ disabledLabelColor = disabledLabelColor,
+ errorLabelColor = errorLabelColor,
+ placeholderColor = placeholderColor,
+ disabledPlaceholderColor = disabledPlaceholderColor
+ )
+}
+
+private fun Modifier.expandable(
+ onExpandedChange: () -> Unit,
+ menuLabel: String
+) = pointerInput(Unit) {
+ forEachGesture {
+ coroutineScope {
+ awaitPointerEventScope {
+ var event: PointerEvent
+ do {
+ event = awaitPointerEvent(PointerEventPass.Initial)
+ } while (
+ !event.changes.fastAll { it.changedToUp() }
+ )
+ onExpandedChange.invoke()
+ }
+ }
+ }
+}.semantics {
+ contentDescription = menuLabel // this should be a localised string
+ onClick {
+ onExpandedChange()
+ true
+ }
+}
+
+private fun updateHeight(
+ view: View,
+ coordinates: LayoutCoordinates?,
+ verticalMarginInPx: Int,
+ onHeightUpdate: (Int) -> Unit
+) {
+ coordinates ?: return
+ val visibleWindowBounds = Rect().let {
+ view.getWindowVisibleDisplayFrame(it)
+ it
+ }
+ val heightAbove = coordinates.boundsInWindow().top - visibleWindowBounds.top
+ val heightBelow =
+ visibleWindowBounds.bottom - visibleWindowBounds.top - coordinates.boundsInWindow().bottom
+ onHeightUpdate(max(heightAbove, heightBelow).toInt() - verticalMarginInPx)
+}
+
+@OptIn(ExperimentalMaterialApi::class)
+@Immutable
+private class DefaultTextFieldForExposedDropdownMenusColors(
+ private val textColor: Color,
+ private val disabledTextColor: Color,
+ private val cursorColor: Color,
+ private val errorCursorColor: Color,
+ private val focusedIndicatorColor: Color,
+ private val unfocusedIndicatorColor: Color,
+ private val errorIndicatorColor: Color,
+ private val disabledIndicatorColor: Color,
+ private val leadingIconColor: Color,
+ private val disabledLeadingIconColor: Color,
+ private val errorLeadingIconColor: Color,
+ private val trailingIconColor: Color,
+ private val focusedTrailingIconColor: Color,
+ private val disabledTrailingIconColor: Color,
+ private val errorTrailingIconColor: Color,
+ private val backgroundColor: Color,
+ private val focusedLabelColor: Color,
+ private val unfocusedLabelColor: Color,
+ private val disabledLabelColor: Color,
+ private val errorLabelColor: Color,
+ private val placeholderColor: Color,
+ private val disabledPlaceholderColor: Color
+) : TextFieldColorsWithIcons {
+
+ @Composable
+ override fun leadingIconColor(enabled: Boolean, isError: Boolean): State<Color> {
+ return rememberUpdatedState(
+ when {
+ !enabled -> disabledLeadingIconColor
+ isError -> errorLeadingIconColor
+ else -> leadingIconColor
+ }
+ )
+ }
+
+ @Composable
+ override fun trailingIconColor(enabled: Boolean, isError: Boolean): State<Color> {
+ return rememberUpdatedState(
+ when {
+ !enabled -> disabledTrailingIconColor
+ isError -> errorTrailingIconColor
+ else -> trailingIconColor
+ }
+ )
+ }
+
+ @Composable
+ override fun trailingIconColor(
+ enabled: Boolean,
+ isError: Boolean,
+ interactionSource: InteractionSource
+ ): State<Color> {
+ val focused by interactionSource.collectIsFocusedAsState()
+
+ return rememberUpdatedState(
+ when {
+ !enabled -> disabledTrailingIconColor
+ isError -> errorTrailingIconColor
+ focused -> focusedTrailingIconColor
+ else -> trailingIconColor
+ }
+ )
+ }
+
+ @Composable
+ override fun indicatorColor(
+ enabled: Boolean,
+ isError: Boolean,
+ interactionSource: InteractionSource
+ ): State<Color> {
+ val focused by interactionSource.collectIsFocusedAsState()
+
+ val targetValue = when {
+ !enabled -> disabledIndicatorColor
+ isError -> errorIndicatorColor
+ focused -> focusedIndicatorColor
+ else -> unfocusedIndicatorColor
+ }
+ return if (enabled) {
+ animateColorAsState(targetValue, tween(durationMillis = AnimationDuration))
+ } else {
+ rememberUpdatedState(targetValue)
+ }
+ }
+
+ @Composable
+ override fun backgroundColor(enabled: Boolean): State<Color> {
+ return rememberUpdatedState(backgroundColor)
+ }
+
+ @Composable
+ override fun placeholderColor(enabled: Boolean): State<Color> {
+ return rememberUpdatedState(if (enabled) placeholderColor else disabledPlaceholderColor)
+ }
+
+ @Composable
+ override fun labelColor(
+ enabled: Boolean,
+ error: Boolean,
+ interactionSource: InteractionSource
+ ): State<Color> {
+ val focused by interactionSource.collectIsFocusedAsState()
+
+ val targetValue = when {
+ !enabled -> disabledLabelColor
+ error -> errorLabelColor
+ focused -> focusedLabelColor
+ else -> unfocusedLabelColor
+ }
+ return rememberUpdatedState(targetValue)
+ }
+
+ @Composable
+ override fun textColor(enabled: Boolean): State<Color> {
+ return rememberUpdatedState(if (enabled) textColor else disabledTextColor)
+ }
+
+ @Composable
+ override fun cursorColor(isError: Boolean): State<Color> {
+ return rememberUpdatedState(if (isError) errorCursorColor else cursorColor)
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other == null || this::class != other::class) return false
+
+ other as DefaultTextFieldForExposedDropdownMenusColors
+
+ if (textColor != other.textColor) return false
+ if (disabledTextColor != other.disabledTextColor) return false
+ if (cursorColor != other.cursorColor) return false
+ if (errorCursorColor != other.errorCursorColor) return false
+ if (focusedIndicatorColor != other.focusedIndicatorColor) return false
+ if (unfocusedIndicatorColor != other.unfocusedIndicatorColor) return false
+ if (errorIndicatorColor != other.errorIndicatorColor) return false
+ if (disabledIndicatorColor != other.disabledIndicatorColor) return false
+ if (leadingIconColor != other.leadingIconColor) return false
+ if (disabledLeadingIconColor != other.disabledLeadingIconColor) return false
+ if (errorLeadingIconColor != other.errorLeadingIconColor) return false
+ if (trailingIconColor != other.trailingIconColor) return false
+ if (focusedTrailingIconColor != other.focusedTrailingIconColor) return false
+ if (disabledTrailingIconColor != other.disabledTrailingIconColor) return false
+ if (errorTrailingIconColor != other.errorTrailingIconColor) return false
+ if (backgroundColor != other.backgroundColor) return false
+ if (focusedLabelColor != other.focusedLabelColor) return false
+ if (unfocusedLabelColor != other.unfocusedLabelColor) return false
+ if (disabledLabelColor != other.disabledLabelColor) return false
+ if (errorLabelColor != other.errorLabelColor) return false
+ if (placeholderColor != other.placeholderColor) return false
+ if (disabledPlaceholderColor != other.disabledPlaceholderColor) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = textColor.hashCode()
+ result = 31 * result + disabledTextColor.hashCode()
+ result = 31 * result + cursorColor.hashCode()
+ result = 31 * result + errorCursorColor.hashCode()
+ result = 31 * result + focusedIndicatorColor.hashCode()
+ result = 31 * result + unfocusedIndicatorColor.hashCode()
+ result = 31 * result + errorIndicatorColor.hashCode()
+ result = 31 * result + disabledIndicatorColor.hashCode()
+ result = 31 * result + leadingIconColor.hashCode()
+ result = 31 * result + disabledLeadingIconColor.hashCode()
+ result = 31 * result + errorLeadingIconColor.hashCode()
+ result = 31 * result + trailingIconColor.hashCode()
+ result = 31 * result + focusedTrailingIconColor.hashCode()
+ result = 31 * result + disabledTrailingIconColor.hashCode()
+ result = 31 * result + errorTrailingIconColor.hashCode()
+ result = 31 * result + backgroundColor.hashCode()
+ result = 31 * result + focusedLabelColor.hashCode()
+ result = 31 * result + unfocusedLabelColor.hashCode()
+ result = 31 * result + disabledLabelColor.hashCode()
+ result = 31 * result + errorLabelColor.hashCode()
+ result = 31 * result + placeholderColor.hashCode()
+ result = 31 * result + disabledPlaceholderColor.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/Strings.android.kt b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/Strings.android.kt
index cc6d98b..8d04cfb 100644
--- a/compose/material/material/src/androidMain/kotlin/androidx/compose/material/Strings.android.kt
+++ b/compose/material/material/src/androidMain/kotlin/androidx/compose/material/Strings.android.kt
@@ -30,6 +30,7 @@
Strings.CloseDrawer -> resources.getString(R.string.close_drawer)
Strings.CloseSheet -> resources.getString(R.string.close_sheet)
Strings.DefaultErrorMessage -> resources.getString(R.string.default_error_message)
+ Strings.ExposedDropdownMenu -> resources.getString(R.string.dropdown_menu)
else -> ""
}
}
\ No newline at end of file
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
index cd20d08..510807a 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/IconButton.kt
@@ -20,7 +20,6 @@
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.size
import androidx.compose.foundation.selection.toggleable
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.runtime.Composable
@@ -66,14 +65,14 @@
) {
Box(
modifier = modifier
+ .minimumTouchTargetSize()
.clickable(
onClick = onClick,
enabled = enabled,
role = Role.Button,
interactionSource = interactionSource,
indication = rememberRipple(bounded = false, radius = RippleRadius)
- )
- .then(IconButtonSizeModifier),
+ ),
contentAlignment = Alignment.Center
) {
val contentAlpha = if (enabled) LocalContentAlpha.current else ContentAlpha.disabled
@@ -109,14 +108,16 @@
content: @Composable () -> Unit
) {
Box(
- modifier = modifier.toggleable(
+ modifier = modifier
+ .minimumTouchTargetSize()
+ .toggleable(
value = checked,
onValueChange = onCheckedChange,
enabled = enabled,
role = Role.Checkbox,
interactionSource = interactionSource,
indication = rememberRipple(bounded = false, radius = RippleRadius)
- ).then(IconButtonSizeModifier),
+ ),
contentAlignment = Alignment.Center
) {
val contentAlpha = if (enabled) LocalContentAlpha.current else ContentAlpha.disabled
@@ -126,8 +127,3 @@
// Default radius of an unbounded ripple in an IconButton
private val RippleRadius = 24.dp
-
-// TODO: b/149691127 investigate our strategy around accessibility touch targets, and remove
-// per-component definitions of this size.
-// Diameter of the IconButton, to allow for correct minimum touch target size for accessibility
-private val IconButtonSizeModifier = Modifier.size(48.dp)
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
index 2eabebd..5b9bc46 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Menu.kt
@@ -185,7 +185,7 @@
// Size defaults.
private val MenuElevation = 8.dp
-private val MenuVerticalMargin = 48.dp
+internal val MenuVerticalMargin = 48.dp
private val DropdownMenuItemHorizontalPadding = 16.dp
internal val DropdownMenuVerticalPadding = 8.dp
private val DropdownMenuItemDefaultMinWidth = 112.dp
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
index 688038a..ddb7b70 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Strings.kt
@@ -27,6 +27,7 @@
val CloseDrawer = Strings(1)
val CloseSheet = Strings(2)
val DefaultErrorMessage = Strings(3)
+ val ExposedDropdownMenu = Strings(4)
}
}
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
index 29a96a0..9e3c174 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/Text.kt
@@ -106,7 +106,14 @@
onTextLayout: (TextLayoutResult) -> Unit = {},
style: TextStyle = LocalTextStyle.current
) {
+ // NOTE(text-perf-review): Ideally, this Text composable will call directly the
+ // BasicText(String, ...) API, with the assumption that BasicText(String, ...) will be more
+ // optimized than BasicText(AnnotatedString, ...)
Text(
+ // NOTE(text-perf-review): we create an AnnotatedString here no matter what, which causes
+ // us to lose a lot of information (ie, a bunch of optimization potential by the fact
+ // that it is _just_ a string). We should consider heavily optimizing for the very common
+ // case of String, even if it means we have two separate code paths for a lot of things.
AnnotatedString(text),
modifier,
color,
@@ -204,6 +211,8 @@
LocalContentColor.current.copy(alpha = LocalContentAlpha.current)
}
}
+ // NOTE(text-perf-review): It might be worthwhile writing a bespoke merge implementation that
+ // will avoid reallocating if all of the options here are the defaults
val mergedStyle = style.merge(
TextStyle(
color = textColor,
diff --git a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TouchTarget.kt b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TouchTarget.kt
index e0622d6..aaab124 100644
--- a/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TouchTarget.kt
+++ b/compose/material/material/src/commonMain/kotlin/androidx/compose/material/TouchTarget.kt
@@ -27,6 +27,7 @@
import androidx.compose.ui.platform.LocalViewConfiguration
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.DpSize
+import kotlin.math.roundToInt
@OptIn(ExperimentalMaterialApi::class)
@Suppress("ModifierInspectorInfo")
@@ -68,8 +69,8 @@
val height = maxOf(placeable.height, size.height.roundToPx())
return layout(width, height) {
- val centerX = (width - placeable.width) / 2
- val centerY = (height - placeable.height) / 2
+ val centerX = ((width - placeable.width) / 2f).roundToInt()
+ val centerY = ((height - placeable.height) / 2f).roundToInt()
placeable.place(centerX, centerY)
}
}
diff --git a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/v1/DesktopAlertDialogDeprecated.desktop.kt b/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/v1/DesktopAlertDialogDeprecated.desktop.kt
deleted file mode 100644
index 2ca03cd..0000000
--- a/compose/material/material/src/desktopMain/kotlin/androidx/compose/material/v1/DesktopAlertDialogDeprecated.desktop.kt
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.material.v1
-
-import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.fillMaxWidth
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material.AlertDialogContent
-import androidx.compose.material.AlertDialogFlowRow
-import androidx.compose.material.MaterialTheme
-import androidx.compose.material.contentColorFor
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.Shape
-import androidx.compose.ui.unit.dp
-import androidx.compose.ui.window.v1.Dialog
-import androidx.compose.ui.window.v1.DialogProperties
-
-/**
- * Alert dialog is a [Dialog] which interrupts the user with urgent information, details or actions.
- *
- * The dialog will position its buttons based on the available space. By default it will try to
- * place them horizontally next to each other and fallback to horizontal placement if not enough
- * space is available. There is also another version of this composable that has a slot for buttons
- * to provide custom buttons layout.
- *
- * Sample of dialog:
- * @sample androidx.compose.material.samples.AlertDialogSample
- *
- * @param onDismissRequest Executes when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
- * @param confirmButton A button which is meant to confirm a proposed action, thus resolving
- * what triggered the dialog. The dialog does not set up any events for this button so they need
- * to be set up by the caller.
- * @param modifier Modifier to be applied to the layout of the dialog.
- * @param dismissButton A button which is meant to dismiss the dialog. The dialog does not set up
- * any events for this button so they need to be set up by the caller.
- * @param title The title of the Dialog which should specify the purpose of the Dialog. The title
- * is not mandatory, because there may be sufficient information inside the [text]. Provided text
- * style will be [Typography.subtitle1].
- * @param text The text which presents the details regarding the Dialog's purpose. Provided text
- * style will be [Typography.body2].
- * @param shape Defines the Dialog's shape
- * @param backgroundColor The background color of the dialog.
- * @param contentColor The preferred content color provided by this dialog to its children.
- * @param properties Typically platform specific properties to further configure the dialog.
- */
-@Deprecated(
- "Use another variant of AlertDialog for the new Composable Window API (https://github" +
- ".com/JetBrains/compose-jb/tree/master/tutorials/Window_API_new)"
-)
-@Composable
-fun AlertDialog(
- onDismissRequest: () -> Unit,
- confirmButton: @Composable () -> Unit,
- modifier: Modifier = Modifier,
- dismissButton: @Composable (() -> Unit)? = null,
- title: @Composable (() -> Unit)? = null,
- text: @Composable (() -> Unit)? = null,
- shape: Shape = MaterialTheme.shapes.medium,
- backgroundColor: Color = MaterialTheme.colors.surface,
- contentColor: Color = contentColorFor(backgroundColor),
- properties: DialogProperties = DialogProperties()
-) {
- AlertDialog(
- onDismissRequest = onDismissRequest,
- buttons = {
- // TODO: move the modifiers to FlowRow when it supports a modifier parameter
- Box(Modifier.fillMaxWidth().padding(all = 8.dp)) {
- AlertDialogFlowRow(
- mainAxisSpacing = 8.dp,
- crossAxisSpacing = 12.dp
- ) {
- dismissButton?.invoke()
- confirmButton()
- }
- }
- },
- modifier = modifier,
- title = title,
- text = text,
- shape = shape,
- backgroundColor = backgroundColor,
- contentColor = contentColor,
- properties = properties
- )
-}
-
-/**
- * Alert dialog is a [Dialog] which interrupts the user with urgent information, details or actions.
- *
- * This function can be used to fully customize the button area, e.g. with:
- *
- * @sample androidx.compose.material.samples.CustomAlertDialogSample
- *
- * @param onDismissRequest Executes when the user tries to dismiss the Dialog by clicking outside
- * or pressing the back button. This is not called when the dismiss button is clicked.
- * @param buttons Function that emits the layout with the buttons.
- * @param modifier Modifier to be applied to the layout of the dialog.
- * @param title The title of the Dialog which should specify the purpose of the Dialog. The title
- * is not mandatory, because there may be sufficient information inside the [text]. Provided text
- * style will be [Typography.subtitle1].
- * @param text The text which presents the details regarding the Dialog's purpose. Provided text
- * style will be [Typography.body2].
- * @param shape Defines the Dialog's shape.
- * @param backgroundColor The background color of the dialog.
- * @param contentColor The preferred content color provided by this dialog to its children.
- * @param properties Typically platform specific properties to further configure the dialog.
- */
-@Deprecated(
- "Use another variant of AlertDialog for the new Composable Window API (https://github" +
- ".com/JetBrains/compose-jb/tree/master/tutorials/Window_API_new)"
-)
-@Composable
-fun AlertDialog(
- onDismissRequest: () -> Unit,
- buttons: @Composable () -> Unit,
- modifier: Modifier = Modifier,
- title: (@Composable () -> Unit)? = null,
- text: @Composable (() -> Unit)? = null,
- shape: Shape = MaterialTheme.shapes.medium,
- backgroundColor: Color = MaterialTheme.colors.surface,
- contentColor: Color = contentColorFor(backgroundColor),
- properties: DialogProperties = DialogProperties()
-) {
- Dialog(
- onDismissRequest = onDismissRequest,
- properties = properties
- ) {
- AlertDialogContent(
- buttons = buttons,
- modifier = modifier,
- title = title,
- text = text,
- shape = shape,
- backgroundColor = backgroundColor,
- contentColor = contentColor
- )
- }
-}
diff --git a/compose/material3/material3/api/current.txt b/compose/material3/material3/api/current.txt
index 98d95fe..c9d6ce4 100644
--- a/compose/material3/material3/api/current.txt
+++ b/compose/material3/material3/api/current.txt
@@ -2,17 +2,15 @@
package androidx.compose.material3 {
@androidx.compose.runtime.Stable public final class ColorScheme {
- ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long surface1, long surface2, long surface3, long surface4, long surface5, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long disabled, long onDisabled, long error, long onError, long errorContainer, long onErrorContainer, long outline);
- method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline);
+ method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
method public long getBackground();
- method public long getDisabled();
method public long getError();
method public long getErrorContainer();
method public long getInverseOnSurface();
method public long getInversePrimary();
method public long getInverseSurface();
method public long getOnBackground();
- method public long getOnDisabled();
method public long getOnError();
method public long getOnErrorContainer();
method public long getOnPrimary();
@@ -29,23 +27,16 @@
method public long getSecondary();
method public long getSecondaryContainer();
method public long getSurface();
- method public long getSurface1();
- method public long getSurface2();
- method public long getSurface3();
- method public long getSurface4();
- method public long getSurface5();
method public long getSurfaceVariant();
method public long getTertiary();
method public long getTertiaryContainer();
property public final long background;
- property public final long disabled;
property public final long error;
property public final long errorContainer;
property public final long inverseOnSurface;
property public final long inversePrimary;
property public final long inverseSurface;
property public final long onBackground;
- property public final long onDisabled;
property public final long onError;
property public final long onErrorContainer;
property public final long onPrimary;
@@ -62,19 +53,16 @@
property public final long secondary;
property public final long secondaryContainer;
property public final long surface;
- property public final long surface1;
- property public final long surface2;
- property public final long surface3;
- property public final long surface4;
- property public final long surface5;
property public final long surfaceVariant;
property public final long tertiary;
property public final long tertiaryContainer;
}
public final class ColorSchemeKt {
- method public static androidx.compose.material3.ColorScheme darkColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
- method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ method public static long contentColorFor(androidx.compose.material3.ColorScheme, long backgroundColor);
+ method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+ method public static androidx.compose.material3.ColorScheme darkColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
}
public final class ContentColorKt {
@@ -97,30 +85,23 @@
public final class MaterialTheme {
method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.ColorScheme getColorScheme();
- method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Shapes getShapes();
method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Typography getTypography();
property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.ColorScheme colorScheme;
- property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Shapes shapes;
property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Typography typography;
field public static final androidx.compose.material3.MaterialTheme INSTANCE;
}
public final class MaterialThemeKt {
- method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, optional androidx.compose.material3.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
}
- @androidx.compose.runtime.Immutable public final class Shapes {
- ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
- method public androidx.compose.material3.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
- method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
- method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
- method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
- property public final androidx.compose.foundation.shape.CornerBasedShape large;
- property public final androidx.compose.foundation.shape.CornerBasedShape medium;
- property public final androidx.compose.foundation.shape.CornerBasedShape small;
+ public final class ScaffoldKt {
}
- public final class ShapesKt {
+ public final class SurfaceKt {
+ method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
}
public final class TextKt {
@@ -133,6 +114,9 @@
public final class TonalPaletteKt {
}
+ public final class TouchTargetKt {
+ }
+
@androidx.compose.runtime.Immutable public final class Typography {
ctor public Typography(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
method public androidx.compose.material3.Typography copy(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
diff --git a/compose/material3/material3/api/public_plus_experimental_current.txt b/compose/material3/material3/api/public_plus_experimental_current.txt
index 98d95fe..4427c20 100644
--- a/compose/material3/material3/api/public_plus_experimental_current.txt
+++ b/compose/material3/material3/api/public_plus_experimental_current.txt
@@ -2,17 +2,15 @@
package androidx.compose.material3 {
@androidx.compose.runtime.Stable public final class ColorScheme {
- ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long surface1, long surface2, long surface3, long surface4, long surface5, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long disabled, long onDisabled, long error, long onError, long errorContainer, long onErrorContainer, long outline);
- method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline);
+ method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
method public long getBackground();
- method public long getDisabled();
method public long getError();
method public long getErrorContainer();
method public long getInverseOnSurface();
method public long getInversePrimary();
method public long getInverseSurface();
method public long getOnBackground();
- method public long getOnDisabled();
method public long getOnError();
method public long getOnErrorContainer();
method public long getOnPrimary();
@@ -29,23 +27,16 @@
method public long getSecondary();
method public long getSecondaryContainer();
method public long getSurface();
- method public long getSurface1();
- method public long getSurface2();
- method public long getSurface3();
- method public long getSurface4();
- method public long getSurface5();
method public long getSurfaceVariant();
method public long getTertiary();
method public long getTertiaryContainer();
property public final long background;
- property public final long disabled;
property public final long error;
property public final long errorContainer;
property public final long inverseOnSurface;
property public final long inversePrimary;
property public final long inverseSurface;
property public final long onBackground;
- property public final long onDisabled;
property public final long onError;
property public final long onErrorContainer;
property public final long onPrimary;
@@ -62,19 +53,16 @@
property public final long secondary;
property public final long secondaryContainer;
property public final long surface;
- property public final long surface1;
- property public final long surface2;
- property public final long surface3;
- property public final long surface4;
- property public final long surface5;
property public final long surfaceVariant;
property public final long tertiary;
property public final long tertiaryContainer;
}
public final class ColorSchemeKt {
- method public static androidx.compose.material3.ColorScheme darkColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
- method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ method public static long contentColorFor(androidx.compose.material3.ColorScheme, long backgroundColor);
+ method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+ method public static androidx.compose.material3.ColorScheme darkColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
}
public final class ContentColorKt {
@@ -84,6 +72,20 @@
public final class DynamicTonalPaletteKt {
}
+ @kotlin.RequiresOptIn(message="This material API is experimental and is likely to change or to be removed in" + " the future.") public @interface ExperimentalMaterial3Api {
+ }
+
+ @androidx.compose.material3.ExperimentalMaterial3Api public final inline class FabPosition {
+ ctor public FabPosition();
+ }
+
+ public static final class FabPosition.Companion {
+ method public int getCenter();
+ method public int getEnd();
+ property public final int Center;
+ property public final int End;
+ }
+
public final class IconButtonKt {
method @androidx.compose.runtime.Composable public static void IconButton(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void IconToggleButton(boolean checked, kotlin.jvm.functions.Function1<? super java.lang.Boolean,kotlin.Unit> onCheckedChange, optional androidx.compose.ui.Modifier modifier, optional boolean enabled, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, kotlin.jvm.functions.Function0<kotlin.Unit> content);
@@ -97,30 +99,24 @@
public final class MaterialTheme {
method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.ColorScheme getColorScheme();
- method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Shapes getShapes();
method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Typography getTypography();
property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.ColorScheme colorScheme;
- property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Shapes shapes;
property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Typography typography;
field public static final androidx.compose.material3.MaterialTheme INSTANCE;
}
public final class MaterialThemeKt {
- method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, optional androidx.compose.material3.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
}
- @androidx.compose.runtime.Immutable public final class Shapes {
- ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
- method public androidx.compose.material3.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
- method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
- method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
- method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
- property public final androidx.compose.foundation.shape.CornerBasedShape large;
- property public final androidx.compose.foundation.shape.CornerBasedShape medium;
- property public final androidx.compose.foundation.shape.CornerBasedShape small;
+ public final class ScaffoldKt {
+ method @androidx.compose.material3.ExperimentalMaterial3Api @androidx.compose.runtime.Composable public static void Scaffold(optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit> topBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> bottomBar, optional kotlin.jvm.functions.Function0<kotlin.Unit> floatingActionButton, optional int floatingActionButtonPosition, optional long containerColor, optional long contentColor, kotlin.jvm.functions.Function1<? super androidx.compose.foundation.layout.PaddingValues,kotlin.Unit> content);
}
- public final class ShapesKt {
+ public final class SurfaceKt {
+ method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
}
public final class TextKt {
@@ -133,6 +129,10 @@
public final class TonalPaletteKt {
}
+ public final class TouchTargetKt {
+ method @androidx.compose.material3.ExperimentalMaterial3Api public static androidx.compose.runtime.ProvidableCompositionLocal<java.lang.Boolean> getLocalMinimumTouchTargetEnforcement();
+ }
+
@androidx.compose.runtime.Immutable public final class Typography {
ctor public Typography(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
method public androidx.compose.material3.Typography copy(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
diff --git a/compose/material3/material3/api/restricted_current.txt b/compose/material3/material3/api/restricted_current.txt
index 98d95fe..c9d6ce4 100644
--- a/compose/material3/material3/api/restricted_current.txt
+++ b/compose/material3/material3/api/restricted_current.txt
@@ -2,17 +2,15 @@
package androidx.compose.material3 {
@androidx.compose.runtime.Stable public final class ColorScheme {
- ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long surface1, long surface2, long surface3, long surface4, long surface5, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long disabled, long onDisabled, long error, long onError, long errorContainer, long onErrorContainer, long outline);
- method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ ctor public ColorScheme(long primary, long onPrimary, long primaryContainer, long onPrimaryContainer, long inversePrimary, long secondary, long onSecondary, long secondaryContainer, long onSecondaryContainer, long tertiary, long onTertiary, long tertiaryContainer, long onTertiaryContainer, long background, long onBackground, long surface, long onSurface, long surfaceVariant, long onSurfaceVariant, long inverseSurface, long inverseOnSurface, long error, long onError, long errorContainer, long onErrorContainer, long outline);
+ method public androidx.compose.material3.ColorScheme copy(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
method public long getBackground();
- method public long getDisabled();
method public long getError();
method public long getErrorContainer();
method public long getInverseOnSurface();
method public long getInversePrimary();
method public long getInverseSurface();
method public long getOnBackground();
- method public long getOnDisabled();
method public long getOnError();
method public long getOnErrorContainer();
method public long getOnPrimary();
@@ -29,23 +27,16 @@
method public long getSecondary();
method public long getSecondaryContainer();
method public long getSurface();
- method public long getSurface1();
- method public long getSurface2();
- method public long getSurface3();
- method public long getSurface4();
- method public long getSurface5();
method public long getSurfaceVariant();
method public long getTertiary();
method public long getTertiaryContainer();
property public final long background;
- property public final long disabled;
property public final long error;
property public final long errorContainer;
property public final long inverseOnSurface;
property public final long inversePrimary;
property public final long inverseSurface;
property public final long onBackground;
- property public final long onDisabled;
property public final long onError;
property public final long onErrorContainer;
property public final long onPrimary;
@@ -62,19 +53,16 @@
property public final long secondary;
property public final long secondaryContainer;
property public final long surface;
- property public final long surface1;
- property public final long surface2;
- property public final long surface3;
- property public final long surface4;
- property public final long surface5;
property public final long surfaceVariant;
property public final long tertiary;
property public final long tertiaryContainer;
}
public final class ColorSchemeKt {
- method public static androidx.compose.material3.ColorScheme darkColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
- method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long surface1, optional long surface2, optional long surface3, optional long surface4, optional long surface5, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long disabled, optional long onDisabled, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ method public static long contentColorFor(androidx.compose.material3.ColorScheme, long backgroundColor);
+ method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public static long contentColorFor(long backgroundColor);
+ method public static androidx.compose.material3.ColorScheme darkColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
+ method public static androidx.compose.material3.ColorScheme lightColorScheme(optional long primary, optional long onPrimary, optional long primaryContainer, optional long onPrimaryContainer, optional long inversePrimary, optional long secondary, optional long onSecondary, optional long secondaryContainer, optional long onSecondaryContainer, optional long tertiary, optional long onTertiary, optional long tertiaryContainer, optional long onTertiaryContainer, optional long background, optional long onBackground, optional long surface, optional long onSurface, optional long surfaceVariant, optional long onSurfaceVariant, optional long inverseSurface, optional long inverseOnSurface, optional long error, optional long onError, optional long errorContainer, optional long onErrorContainer, optional long outline);
}
public final class ContentColorKt {
@@ -97,30 +85,23 @@
public final class MaterialTheme {
method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.ColorScheme getColorScheme();
- method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Shapes getShapes();
method @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public androidx.compose.material3.Typography getTypography();
property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.ColorScheme colorScheme;
- property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Shapes shapes;
property @androidx.compose.runtime.Composable @androidx.compose.runtime.ReadOnlyComposable public final androidx.compose.material3.Typography typography;
field public static final androidx.compose.material3.MaterialTheme INSTANCE;
}
public final class MaterialThemeKt {
- method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, optional androidx.compose.material3.Shapes shapes, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void MaterialTheme(optional androidx.compose.material3.ColorScheme colorScheme, optional androidx.compose.material3.Typography typography, kotlin.jvm.functions.Function0<kotlin.Unit> content);
}
- @androidx.compose.runtime.Immutable public final class Shapes {
- ctor public Shapes(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
- method public androidx.compose.material3.Shapes copy(optional androidx.compose.foundation.shape.CornerBasedShape small, optional androidx.compose.foundation.shape.CornerBasedShape medium, optional androidx.compose.foundation.shape.CornerBasedShape large);
- method public androidx.compose.foundation.shape.CornerBasedShape getLarge();
- method public androidx.compose.foundation.shape.CornerBasedShape getMedium();
- method public androidx.compose.foundation.shape.CornerBasedShape getSmall();
- property public final androidx.compose.foundation.shape.CornerBasedShape large;
- property public final androidx.compose.foundation.shape.CornerBasedShape medium;
- property public final androidx.compose.foundation.shape.CornerBasedShape small;
+ public final class ScaffoldKt {
}
- public final class ShapesKt {
+ public final class SurfaceKt {
+ method @androidx.compose.runtime.Composable public static void Surface(optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.BorderStroke? border, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void Surface(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.Shape shape, optional long color, optional long contentColor, optional float tonalElevation, optional androidx.compose.foundation.BorderStroke? border, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.foundation.Indication? indication, optional boolean enabled, optional String? onClickLabel, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Dp> getLocalAbsoluteTonalElevation();
}
public final class TextKt {
@@ -133,6 +114,9 @@
public final class TonalPaletteKt {
}
+ public final class TouchTargetKt {
+ }
+
@androidx.compose.runtime.Immutable public final class Typography {
ctor public Typography(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
method public androidx.compose.material3.Typography copy(optional androidx.compose.ui.text.TextStyle displayLarge, optional androidx.compose.ui.text.TextStyle displayMedium, optional androidx.compose.ui.text.TextStyle displaySmall, optional androidx.compose.ui.text.TextStyle headlineLarge, optional androidx.compose.ui.text.TextStyle headlineMedium, optional androidx.compose.ui.text.TextStyle headlineSmall, optional androidx.compose.ui.text.TextStyle titleLarge, optional androidx.compose.ui.text.TextStyle titleMedium, optional androidx.compose.ui.text.TextStyle titleSmall, optional androidx.compose.ui.text.TextStyle bodyLarge, optional androidx.compose.ui.text.TextStyle bodyMedium, optional androidx.compose.ui.text.TextStyle bodySmall, optional androidx.compose.ui.text.TextStyle labelLarge, optional androidx.compose.ui.text.TextStyle labelMedium, optional androidx.compose.ui.text.TextStyle labelSmall);
diff --git a/compose/material3/material3/build.gradle b/compose/material3/material3/build.gradle
index 0d1dc6f..c0b208a 100644
--- a/compose/material3/material3/build.gradle
+++ b/compose/material3/material3/build.gradle
@@ -37,11 +37,14 @@
* corresponding block below
*/
implementation(libs.kotlinStdlibCommon)
+ implementation(project(":compose:foundation:foundation-layout"))
- api("androidx.compose.foundation:foundation:1.0.1")
+ api(project(":compose:foundation:foundation"))
+ api("androidx.compose.material:material-icons-core:1.0.2")
api("androidx.compose.material:material-ripple:1.0.0")
api("androidx.compose.runtime:runtime:1.0.1")
api("androidx.compose.ui:ui-graphics:1.0.1")
+ api(project(":compose:ui:ui"))
api("androidx.compose.ui:ui-text:1.0.1")
testImplementation(libs.testRules)
@@ -49,8 +52,7 @@
testImplementation(libs.junit)
testImplementation(libs.truth)
- // TODO: Enable when Material 3 samples are in place.
- // implementation(project(":compose:material3:material3:material3-samples"))
+ androidTestImplementation(project(":compose:material3:material3:material3-samples"))
androidTestImplementation(project(":compose:test-utils"))
androidTestImplementation(project(":test:screenshot:screenshot"))
androidTestImplementation(libs.testRules)
@@ -77,6 +79,7 @@
implementation(libs.kotlinStdlibCommon)
api(project(":compose:foundation:foundation"))
+ api(project(":compose:material:material-icons-core"))
api(project(":compose:material:material-ripple"))
api(project(":compose:runtime:runtime"))
api(project(":compose:ui:ui-graphics"))
@@ -99,8 +102,7 @@
}
androidAndroidTest.dependencies {
- // TODO: Enable when Material 3 samples are in place.
- // implementation(project(":compose:material3:material3:material3-samples"))
+ implementation(project(":compose:material3:material3:material3-samples"))
implementation(project(":compose:test-utils"))
implementation(project(":test:screenshot:screenshot"))
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSamples.kt
index 7c69291..29869ca 100644
--- a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSamples.kt
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/ColorSamples.kt
@@ -67,12 +67,7 @@
)
},
)
- ColorTile(text = "Surface 0", color = colorScheme.surface)
- ColorTile(text = "Surface 1", color = colorScheme.surface1)
- ColorTile(text = "Surface 2", color = colorScheme.surface2)
- ColorTile(text = "Surface 3", color = colorScheme.surface3)
- ColorTile(text = "Surface 4", color = colorScheme.surface4)
- ColorTile(text = "Surface 5", color = colorScheme.surface5)
+ ColorTile(text = "Surface", color = colorScheme.surface)
Spacer(modifier = Modifier.height(16.dp))
DoubleTile(
leftTile = {
@@ -171,7 +166,12 @@
color = colorScheme.onTertiaryContainer,
)
},
- rightTile = { Box(Modifier.fillMaxWidth()) },
+ rightTile = {
+ ColorTile(
+ text = "On Tertiary",
+ color = colorScheme.onTertiary,
+ )
+ },
)
DoubleTile(
leftTile = {
@@ -180,7 +180,12 @@
color = colorScheme.tertiaryContainer,
)
},
- rightTile = { Box(Modifier.fillMaxWidth()) },
+ rightTile = {
+ ColorTile(
+ text = "Tertiary",
+ color = colorScheme.tertiary,
+ )
+ },
)
Spacer(modifier = Modifier.height(16.dp))
Text("Utility", style = MaterialTheme.typography.bodyLarge)
diff --git a/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt
new file mode 100644
index 0000000..5a724ca
--- /dev/null
+++ b/compose/material3/material3/samples/src/main/java/androidx/compose/material3/samples/IconButtonSamples.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.animation.animateColorAsState
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Favorite
+import androidx.compose.material3.Icon
+import androidx.compose.material3.IconButton
+import androidx.compose.material3.IconToggleButton
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.graphics.Color
+
+@Sampled
+@Composable
+fun IconButtonSample() {
+ IconButton(onClick = { /* doSomething() */ }) {
+ Icon(Icons.Filled.Favorite, contentDescription = "Localized description")
+ }
+}
+
+@Sampled
+@Composable
+fun IconToggleButtonSample() {
+ var checked by remember { mutableStateOf(false) }
+
+ IconToggleButton(checked = checked, onCheckedChange = { checked = it }) {
+ val tint by animateColorAsState(if (checked) Color(0xFFEC407A) else Color(0xFFB0BEC5))
+ Icon(Icons.Filled.Favorite, contentDescription = "Localized description", tint = tint)
+ }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt
index 99f969e..b372bc0 100644
--- a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ColorSchemeTest.kt
@@ -109,18 +109,11 @@
if (background != other.background) return false
if (onBackground != other.onBackground) return false
if (surface != other.surface) return false
- if (surface1 != other.surface1) return false
- if (surface2 != other.surface2) return false
- if (surface3 != other.surface3) return false
- if (surface4 != other.surface4) return false
- if (surface5 != other.surface5) return false
if (onSurface != other.onSurface) return false
if (surfaceVariant != other.surfaceVariant) return false
if (onSurfaceVariant != other.onSurfaceVariant) return false
if (inverseSurface != other.inverseSurface) return false
if (inverseOnSurface != other.inverseOnSurface) return false
- if (disabled != other.disabled) return false
- if (onDisabled != other.onDisabled) return false
if (error != other.error) return false
if (onError != other.onError) return false
if (errorContainer != other.errorContainer) return false
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/GoldenCommon.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/GoldenCommon.kt
new file mode 100644
index 0000000..7843a13
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/GoldenCommon.kt
@@ -0,0 +1,19 @@
+/*
+* Copyright 2021 The Android Open Source Project
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES 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.compose.material3
+
+internal const val GOLDEN_MATERIAL3 = "compose/material3/material3"
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt
new file mode 100644
index 0000000..0ea371e
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconButtonTest.kt
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.material3.samples.IconButtonSample
+import androidx.compose.material3.samples.IconToggleButtonSample
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotEnabled
+import androidx.compose.ui.test.assertIsOff
+import androidx.compose.ui.test.assertIsOn
+import androidx.compose.ui.test.assertLeftPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTopPositionInRootIsEqualTo
+import androidx.compose.ui.test.assertTouchHeightIsEqualTo
+import androidx.compose.ui.test.assertTouchWidthIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.click
+import androidx.compose.ui.test.hasClickAction
+import androidx.compose.ui.test.isToggleable
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+/**
+ * Test for [IconButton] and [IconToggleButton].
+ */
+class IconButtonTest {
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun iconButton_size() {
+ val width = 48.dp
+ val height = 48.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ IconButtonSample()
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @OptIn(ExperimentalMaterial3Api::class)
+ @Test
+ fun iconButton_size_withoutMinimumTouchTarget() {
+ val width = 24.dp
+ val height = 24.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
+ IconButtonSample()
+ }
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun iconButton_defaultSemantics() {
+ rule.setMaterialContent {
+ IconButtonSample()
+ }
+ rule.onNode(hasClickAction()).apply {
+ assertIsEnabled()
+ }
+ }
+
+ @Test
+ fun iconButton_disabledSemantics() {
+ rule.setMaterialContent {
+ IconButton(onClick = {}, enabled = false) {}
+ }
+ rule.onNode(hasClickAction()).apply {
+ assertIsNotEnabled()
+ }
+ }
+
+ @Test
+ fun iconButton_materialIconSize_iconPositioning() {
+ val diameter = 24.dp
+ rule.setMaterialContent {
+ Box {
+ IconButton(onClick = {}) {
+ Box(Modifier.size(diameter).testTag("icon"))
+ }
+ }
+ }
+
+ // Icon should be centered inside the IconButton
+ rule.onNodeWithTag("icon", useUnmergedTree = true)
+ .assertLeftPositionInRootIsEqualTo(24.dp / 2)
+ .assertTopPositionInRootIsEqualTo(24.dp / 2)
+ }
+
+ @Test
+ fun iconButton_customIconSize_iconPositioning() {
+ val width = 36.dp
+ val height = 14.dp
+ rule.setMaterialContent {
+ Box {
+ IconButton(onClick = {}) {
+ Box(Modifier.size(width, height).testTag("icon"))
+ }
+ }
+ }
+
+ // Icon should be centered inside the IconButton
+ rule.onNodeWithTag("icon", useUnmergedTree = true)
+ .assertLeftPositionInRootIsEqualTo((48.dp - width) / 2)
+ .assertTopPositionInRootIsEqualTo((48.dp - height) / 2)
+ }
+
+ @Test
+ fun iconToggleButton_size() {
+ val width = 48.dp
+ val height = 48.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ IconToggleButtonSample()
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @OptIn(ExperimentalMaterial3Api::class)
+ @Test
+ fun iconToggleButton_size_withoutMinimumTouchTarget() {
+ val width = 24.dp
+ val height = 24.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ CompositionLocalProvider(LocalMinimumTouchTargetEnforcement provides false) {
+ IconToggleButtonSample()
+ }
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun iconToggleButton_defaultSemantics() {
+ rule.setMaterialContent {
+ IconToggleButtonSample()
+ }
+ rule.onNode(isToggleable()).apply {
+ assertIsEnabled()
+ assertIsOff()
+ performClick()
+ assertIsOn()
+ }
+ }
+
+ @Test
+ fun iconToggleButton_disabledSemantics() {
+ rule.setMaterialContent {
+ IconToggleButton(checked = false, onCheckedChange = {}, enabled = false) {}
+ }
+ rule.onNode(isToggleable()).apply {
+ assertIsNotEnabled()
+ assertIsOff()
+ }
+ }
+
+ @Test
+ fun iconToggleButton_materialIconSize_iconPositioning() {
+ val diameter = 24.dp
+ rule.setMaterialContent {
+ Box {
+ IconToggleButton(checked = false, onCheckedChange = {}) {
+ Box(Modifier.size(diameter).testTag("icon"))
+ }
+ }
+ }
+
+ // Icon should be centered inside the IconButton
+ rule.onNodeWithTag("icon", useUnmergedTree = true)
+ .assertLeftPositionInRootIsEqualTo(24.dp / 2)
+ .assertTopPositionInRootIsEqualTo(24.dp / 2)
+ }
+
+ @Test
+ fun iconToggleButton_customIconSize_iconPositioning() {
+ val width = 36.dp
+ val height = 14.dp
+ rule.setMaterialContent {
+ Box {
+ IconToggleButton(checked = false, onCheckedChange = {}) {
+ Box(Modifier.size(width, height).testTag("icon"))
+ }
+ }
+ }
+
+ // Icon should be centered inside the IconButton
+ rule.onNodeWithTag("icon", useUnmergedTree = true)
+ .assertLeftPositionInRootIsEqualTo((48.dp - width) / 2)
+ .assertTopPositionInRootIsEqualTo((48.dp - height) / 2)
+ }
+
+ @Test
+ fun iconToggleButton_clickInMinimumTouchTarget(): Unit = with(rule.density) {
+ val tag = "iconToggleButton"
+ var checked by mutableStateOf(false)
+ rule.setMaterialContent {
+ // Box is needed because otherwise the control will be expanded to fill its parent
+ Box(Modifier.fillMaxSize()) {
+ IconToggleButton(
+ checked = checked,
+ onCheckedChange = { checked = it },
+ modifier = Modifier.align(Alignment.Center).requiredSize(2.dp).testTag(tag)
+ ) {
+ Box(Modifier.size(2.dp))
+ }
+ }
+ }
+ rule.onNodeWithTag(tag)
+ .assertIsOff()
+ .assertWidthIsEqualTo(2.dp)
+ .assertHeightIsEqualTo(2.dp)
+ .assertTouchWidthIsEqualTo(48.dp)
+ .assertTouchHeightIsEqualTo(48.dp)
+ .performTouchInput {
+ click(position = Offset(-1f, -1f))
+ }.assertIsOn()
+ }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconTest.kt
new file mode 100644
index 0000000..ef8ae3e
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/IconTest.kt
@@ -0,0 +1,273 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import android.os.Build
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Menu
+import androidx.compose.testutils.assertPixels
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.ImageBitmap
+import androidx.compose.ui.graphics.drawscope.CanvasDrawScope
+import androidx.compose.ui.graphics.painter.ColorPainter
+import androidx.compose.ui.graphics.painter.BitmapPainter
+import androidx.compose.ui.graphics.vector.ImageVector
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertContentDescriptionEquals
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.test.filters.SdkSuppress
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class IconTest {
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun vector_materialIconSize_dimensions() {
+ val width = 24.dp
+ val height = 24.dp
+ val vector = Icons.Filled.Menu
+ rule
+ .setMaterialContentForSizeAssertions {
+ Icon(vector, null)
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun vector_customIconSize_dimensions() {
+ val width = 35.dp
+ val height = 83.dp
+ val vector = ImageVector.Builder(
+ defaultWidth = width, defaultHeight = height,
+ viewportWidth = width.value, viewportHeight = height.value
+ ).build()
+ rule
+ .setMaterialContentForSizeAssertions {
+ Icon(vector, null)
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun image_noIntrinsicSize_dimensions() {
+ val width = 24.dp
+ val height = 24.dp
+ rule
+ .setMaterialContentForSizeAssertions {
+ val image = with(LocalDensity.current) {
+ ImageBitmap(width.roundToPx(), height.roundToPx())
+ }
+
+ Icon(image, null)
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun image_withIntrinsicSize_dimensions() {
+ val width = 35.dp
+ val height = 83.dp
+
+ rule
+ .setMaterialContentForSizeAssertions {
+ val image = with(LocalDensity.current) {
+ ImageBitmap(width.roundToPx(), height.roundToPx())
+ }
+
+ Icon(image, null)
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun painter_noIntrinsicSize_dimensions() {
+ val width = 24.dp
+ val height = 24.dp
+ val painter = ColorPainter(Color.Red)
+ rule
+ .setMaterialContentForSizeAssertions {
+ Icon(painter, null)
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @Test
+ fun painter_withIntrinsicSize_dimensions() {
+ val width = 35.dp
+ val height = 83.dp
+
+ rule
+ .setMaterialContentForSizeAssertions {
+ val image = with(LocalDensity.current) {
+ ImageBitmap(width.roundToPx(), height.roundToPx())
+ }
+
+ val bitmapPainter = BitmapPainter(image)
+ Icon(bitmapPainter, null)
+ }
+ .assertWidthIsEqualTo(width)
+ .assertHeightIsEqualTo(height)
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun iconScalesToFitSize() {
+ // Image with intrinsic size of 24dp
+ val width = 24.dp
+ val height = 24.dp
+ val testTag = "testTag"
+ var expectedIntSize: IntSize? = null
+ rule.setMaterialContent {
+ val image: ImageBitmap
+ with(LocalDensity.current) {
+ image = createBitmapWithColor(
+ this,
+ width.roundToPx(),
+ height.roundToPx(),
+ Color.Red
+ )
+ }
+ Icon(
+ image,
+ null,
+ // Force Icon to be 50dp
+ modifier = Modifier.requiredSize(50.dp).testTag(testTag),
+ tint = Color.Unspecified
+ )
+ with(LocalDensity.current) {
+ val dimension = 50.dp.roundToPx()
+ expectedIntSize = IntSize(dimension, dimension)
+ }
+ }
+
+ rule.onNodeWithTag(testTag)
+ .captureToImage()
+ // The icon should be 50x50 and fill the whole size with red pixels
+ .assertPixels(expectedSize = expectedIntSize!!) {
+ Color.Red
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun iconUnspecifiedTintColorIgnored() {
+ val width = 35.dp
+ val height = 83.dp
+ val testTag = "testTag"
+ rule.setMaterialContent {
+ val image: ImageBitmap
+ with(LocalDensity.current) {
+ image = createBitmapWithColor(
+ this,
+ width.roundToPx(),
+ height.roundToPx(),
+ Color.Red
+ )
+ }
+ Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Unspecified)
+ }
+
+ // With no color provided for a tint, the icon should render the original pixels
+ rule.onNodeWithTag(testTag).captureToImage().assertPixels { Color.Red }
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun iconSpecifiedTintColorApplied() {
+ val width = 35.dp
+ val height = 83.dp
+ val testTag = "testTag"
+ rule.setMaterialContent {
+ val image: ImageBitmap
+ with(LocalDensity.current) {
+ image = createBitmapWithColor(
+ this,
+ width.roundToPx(),
+ height.roundToPx(),
+ Color.Red
+ )
+ }
+ Icon(image, null, modifier = Modifier.testTag(testTag), tint = Color.Blue)
+ }
+
+ // With a tint color provided, all pixels should be blue
+ rule.onNodeWithTag(testTag).captureToImage().assertPixels { Color.Blue }
+ }
+
+ @Test
+ fun defaultSemanticsWhenContentDescriptionProvided() {
+ val testTag = "TestTag"
+ rule.setContent {
+ Icon(
+ bitmap = ImageBitmap(100, 100),
+ contentDescription = "qwerty",
+ modifier = Modifier.testTag(testTag)
+ )
+ }
+
+ rule.onNodeWithTag(testTag)
+ .assertContentDescriptionEquals("qwerty")
+ .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Image))
+ }
+
+ private fun createBitmapWithColor(
+ density: Density,
+ width: Int,
+ height: Int,
+ color: Color
+ ): ImageBitmap {
+ val size = Size(width.toFloat(), height.toFloat())
+ val image = ImageBitmap(width, height)
+ CanvasDrawScope().draw(
+ density,
+ LayoutDirection.Ltr,
+ Canvas(image),
+ size
+ ) {
+ drawRect(color)
+ }
+ return image
+ }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialTest.kt
new file mode 100644
index 0000000..38d2f0c
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/MaterialTest.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.sizeIn
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.layout.FirstBaseline
+import androidx.compose.ui.layout.LastBaseline
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.getAlignmentLinePosition
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.junit4.ComposeTestRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.onRoot
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.unit.height
+import androidx.compose.ui.unit.width
+
+fun ComposeContentTestRule.setMaterialContent(
+ modifier: Modifier = Modifier,
+ composable: @Composable () -> Unit
+) {
+ setContent {
+ MaterialTheme {
+ Surface(modifier = modifier, content = composable)
+ }
+ }
+}
+
+fun <T> ComposeTestRule.runOnIdleWithDensity(action: Density.() -> T): T {
+ return runOnIdle {
+ density.action()
+ }
+}
+
+fun SemanticsNodeInteraction.getFirstBaselinePosition() = getAlignmentLinePosition(FirstBaseline)
+
+fun SemanticsNodeInteraction.getLastBaselinePosition() = getAlignmentLinePosition(LastBaseline)
+
+fun SemanticsNodeInteraction.assertIsSquareWithSize(expectedSize: Dp) =
+ assertWidthIsEqualTo(expectedSize).assertHeightIsEqualTo(expectedSize)
+
+fun ComposeTestRule.rootWidth(): Dp = onRoot().getUnclippedBoundsInRoot().width
+
+fun ComposeTestRule.rootHeight(): Dp = onRoot().getUnclippedBoundsInRoot().height
+
+/**
+ * Constant to emulate very big but finite constraints
+ */
+val BigTestMaxWidth = 5000.dp
+val BigTestMaxHeight = 5000.dp
+
+fun ComposeContentTestRule.setMaterialContentForSizeAssertions(
+ parentMaxWidth: Dp = BigTestMaxWidth,
+ parentMaxHeight: Dp = BigTestMaxHeight,
+ // TODO : figure out better way to make it flexible
+ content: @Composable () -> Unit
+): SemanticsNodeInteraction {
+ setContent {
+ MaterialTheme {
+ Surface {
+ Box {
+ Box(
+ Modifier.sizeIn(
+ maxWidth = parentMaxWidth,
+ maxHeight = parentMaxHeight
+ ).testTag("containerForSizeAssertion")
+ ) {
+ content()
+ }
+ }
+ }
+ }
+ }
+
+ return onNodeWithTag("containerForSizeAssertion")
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
new file mode 100644
index 0000000..1b7f6f7
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/ScaffoldTest.kt
@@ -0,0 +1,204 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import android.os.Build
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.height
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.shadow
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.asAndroidBitmap
+import androidx.compose.ui.layout.LayoutCoordinates
+import androidx.compose.ui.layout.onGloballyPositioned
+import androidx.compose.ui.layout.positionInParent
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.assertHeightIsEqualTo
+import androidx.compose.ui.test.assertWidthIsEqualTo
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.zIndex
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+@OptIn(ExperimentalMaterial3Api::class)
+class ScaffoldTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ private val scaffoldTag = "Scaffold"
+
+ @Test
+ fun scaffold_onlyContent_takesWholeScreen() {
+ rule.setMaterialContentForSizeAssertions(
+ parentMaxWidth = 100.dp,
+ parentMaxHeight = 100.dp
+ ) {
+ Scaffold {
+ Text("Scaffold body")
+ }
+ }
+ .assertWidthIsEqualTo(100.dp)
+ .assertHeightIsEqualTo(100.dp)
+ }
+
+ @Test
+ fun scaffold_onlyContent_stackSlot() {
+ var child1: Offset = Offset.Zero
+ var child2: Offset = Offset.Zero
+ rule.setMaterialContent {
+ Scaffold {
+ Text(
+ "One",
+ Modifier.onGloballyPositioned { child1 = it.positionInParent() }
+ )
+ Text(
+ "Two",
+ Modifier.onGloballyPositioned { child2 = it.positionInParent() }
+ )
+ }
+ }
+ assertThat(child1.y).isEqualTo(child2.y)
+ assertThat(child1.x).isEqualTo(child2.x)
+ }
+
+ @Test
+ fun scaffold_AppbarAndContent_inColumn() {
+ var appbarPosition: Offset = Offset.Zero
+ var appbarSize: IntSize = IntSize.Zero
+ var contentPosition: Offset = Offset.Zero
+ rule.setMaterialContent {
+ Scaffold(
+ topBar = {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .height(50.dp)
+ .background(color = Color.Red)
+ .onGloballyPositioned { positioned: LayoutCoordinates ->
+ appbarPosition = positioned.localToWindow(Offset.Zero)
+ appbarSize = positioned.size
+ }
+ )
+ }
+ ) {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .height(50.dp)
+ .background(Color.Blue)
+ .onGloballyPositioned { contentPosition = it.localToWindow(Offset.Zero) }
+ )
+ }
+ }
+ assertThat(appbarPosition.y + appbarSize.height.toFloat())
+ .isEqualTo(contentPosition.y)
+ }
+
+ @Test
+ fun scaffold_bottomBarAndContent_inStack() {
+ var appbarPosition: Offset = Offset.Zero
+ var appbarSize: IntSize = IntSize.Zero
+ var contentPosition: Offset = Offset.Zero
+ var contentSize: IntSize = IntSize.Zero
+ rule.setMaterialContent {
+ Scaffold(
+ bottomBar = {
+ Box(
+ Modifier
+ .fillMaxWidth()
+ .height(50.dp)
+ .background(color = Color.Red)
+ .onGloballyPositioned { positioned: LayoutCoordinates ->
+ appbarPosition = positioned.positionInParent()
+ appbarSize = positioned.size
+ }
+ )
+ }
+ ) {
+ Box(
+ Modifier
+ .fillMaxSize()
+ .height(50.dp)
+ .background(color = Color.Blue)
+ .onGloballyPositioned { positioned: LayoutCoordinates ->
+ contentPosition = positioned.positionInParent()
+ contentSize = positioned.size
+ }
+ )
+ }
+ }
+ val appBarBottom = appbarPosition.y + appbarSize.height
+ val contentBottom = contentPosition.y + contentSize.height
+ assertThat(appBarBottom).isEqualTo(contentBottom)
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun scaffold_topAppBarIsDrawnOnTopOfContent() {
+ rule.setContent {
+ Box(
+ Modifier
+ .requiredSize(10.dp, 20.dp)
+ .semantics(mergeDescendants = true) {}
+ .testTag("Scaffold")
+ ) {
+ Scaffold(
+ topBar = {
+ Box(
+ Modifier.requiredSize(10.dp)
+ .shadow(4.dp)
+ .zIndex(4f)
+ .background(color = Color.White)
+ )
+ }
+ ) {
+ Box(
+ Modifier.requiredSize(10.dp)
+ .background(color = Color.White)
+ )
+ }
+ }
+ }
+
+ rule.onNodeWithTag("Scaffold")
+ .captureToImage().asAndroidBitmap().apply {
+ // asserts the appbar(top half part) has the shadow
+ val yPos = height / 2 + 2
+ assertThat(Color(getPixel(0, yPos))).isNotEqualTo(Color.White)
+ assertThat(Color(getPixel(width / 2, yPos))).isNotEqualTo(Color.White)
+ assertThat(Color(getPixel(width - 1, yPos))).isNotEqualTo(Color.White)
+ }
+ }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt
new file mode 100644
index 0000000..9080c10
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceContentColorTest.kt
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class SurfaceContentColorTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun surfaceSetsCorrectContentColors_primary() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.primary) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onPrimary)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_primaryContainer() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.primaryContainer) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onPrimaryContainer)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_secondary() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.secondary) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onSecondary)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_secondaryContainer() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.secondaryContainer) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onSecondaryContainer)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_tertiary() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.tertiary) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onTertiary)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_tertiaryContainer() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.tertiaryContainer) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onTertiaryContainer)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_error() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.error) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onError)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_errorContainer() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.errorContainer) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onErrorContainer)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_background() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.background) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onBackground)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_surface() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.surface) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onSurface)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceSetsCorrectContentColors_surfaceVariant() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = MaterialTheme.colorScheme.surfaceVariant) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onSurfaceVariant)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceDoesNotSetContentColor_withCustomColor() {
+ rule.setContent {
+ MaterialTheme {
+ Surface(color = Color.Yellow) {
+ assertThat(LocalContentColor.current).isEqualTo(Color.Black)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun surfaceInheritsParent_withCustomColor() {
+ rule.setContent {
+ MaterialTheme {
+ // This surface sets contentColor to be onSurface
+ Surface {
+ // This surface should inherit the parent contentColor, as yellow is not part
+ // of the theme
+ Surface(color = Color.Yellow) {
+ assertThat(LocalContentColor.current)
+ .isEqualTo(MaterialTheme.colorScheme.onSurface)
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt
new file mode 100644
index 0000000..3011778
--- /dev/null
+++ b/compose/material3/material3/src/androidAndroidTest/kotlin/androidx/compose/material3/SurfaceTest.kt
@@ -0,0 +1,383 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import android.os.Build
+import androidx.compose.foundation.gestures.forEachGesture
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Spacer
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.testutils.assertShape
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.input.pointer.PointerEventPass
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.assertHasClickAction
+import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotEnabled
+import androidx.compose.ui.test.assertTextEquals
+import androidx.compose.ui.test.captureToImage
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.launch
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class SurfaceTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun noTonalElevationColorIsSetOnNonElevatedSurfaceColor() {
+ var absoluteTonalElevation: Dp = 0.dp
+ var surfaceColor: Color = Color.Unspecified
+ rule.setMaterialContent {
+ surfaceColor = MaterialTheme.colorScheme.surface
+ Box(
+ Modifier
+ .size(10.dp, 10.dp)
+ .semantics(mergeDescendants = true) {}
+ .testTag("box")
+ ) {
+ Surface(color = surfaceColor, tonalElevation = 0.dp) {
+ absoluteTonalElevation = LocalAbsoluteTonalElevation.current
+ Box(Modifier.fillMaxSize())
+ }
+ }
+ }
+
+ rule.runOnIdle {
+ Truth.assertThat(absoluteTonalElevation).isEqualTo(0.dp)
+ }
+
+ rule.onNodeWithTag("box")
+ .captureToImage()
+ .assertShape(
+ density = rule.density,
+ shape = RectangleShape,
+ shapeColor = surfaceColor,
+ backgroundColor = Color.White
+ )
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun tonalElevationColorIsSetOnElevatedSurfaceColor() {
+ var absoluteTonalElevation: Dp = 0.dp
+ var surfaceTonalColor: Color = Color.Unspecified
+ var surfaceColor: Color
+ rule.setMaterialContent {
+ surfaceColor = MaterialTheme.colorScheme.surface
+ Box(
+ Modifier
+ .size(10.dp, 10.dp)
+ .semantics(mergeDescendants = true) {}
+ .testTag("box")
+ ) {
+ Surface(color = surfaceColor, tonalElevation = 2.dp) {
+ absoluteTonalElevation = LocalAbsoluteTonalElevation.current
+ Box(Modifier.fillMaxSize())
+ }
+ surfaceTonalColor =
+ MaterialTheme.colorScheme.surfaceColorAtElevation(absoluteTonalElevation)
+ }
+ }
+
+ rule.runOnIdle {
+ Truth.assertThat(absoluteTonalElevation).isEqualTo(2.dp)
+ }
+
+ rule.onNodeWithTag("box")
+ .captureToImage()
+ .assertShape(
+ density = rule.density,
+ shape = RectangleShape,
+ shapeColor = surfaceTonalColor,
+ backgroundColor = Color.White
+ )
+ }
+
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+ @Test
+ fun tonalElevationColorIsNotSetOnNonSurfaceColor() {
+ var absoluteTonalElevation: Dp = 0.dp
+ rule.setMaterialContent {
+ Box(
+ Modifier
+ .size(10.dp, 10.dp)
+ .semantics(mergeDescendants = true) {}
+ .testTag("box")
+ ) {
+ Surface(color = Color.Green, tonalElevation = 2.dp) {
+ Box(Modifier.fillMaxSize())
+ absoluteTonalElevation = LocalAbsoluteTonalElevation.current
+ }
+ }
+ }
+
+ rule.runOnIdle {
+ Truth.assertThat(absoluteTonalElevation).isEqualTo(2.dp)
+ }
+
+ rule.onNodeWithTag("box")
+ .captureToImage()
+ .assertShape(
+ density = rule.density,
+ shape = RectangleShape,
+ shapeColor = Color.Green,
+ backgroundColor = Color.White
+ )
+ }
+
+ @Test
+ fun absoluteElevationCompositionLocalIsSet() {
+ var outerElevation: Dp? = null
+ var innerElevation: Dp? = null
+ rule.setMaterialContent {
+ Surface(tonalElevation = 2.dp) {
+ outerElevation = LocalAbsoluteTonalElevation.current
+ Surface(tonalElevation = 4.dp) {
+ innerElevation = LocalAbsoluteTonalElevation.current
+ }
+ }
+ }
+
+ rule.runOnIdle {
+ Truth.assertThat(outerElevation).isEqualTo(2.dp)
+ Truth.assertThat(innerElevation).isEqualTo(6.dp)
+ }
+ }
+
+ /**
+ * Tests that composed modifiers applied to Surface are applied within the changes to
+ * [LocalContentColor], so they can consume the updated values.
+ */
+ @Test
+ fun contentColorSetBeforeModifier() {
+ var contentColor: Color = Color.Unspecified
+ val expectedColor = Color.Blue
+ rule.setMaterialContent {
+ CompositionLocalProvider(LocalContentColor provides Color.Red) {
+ Surface(
+ Modifier.composed {
+ contentColor = LocalContentColor.current
+ Modifier
+ },
+ tonalElevation = 2.dp,
+ contentColor = expectedColor,
+ content = {}
+ )
+ }
+ }
+
+ rule.runOnIdle {
+ Truth.assertThat(contentColor).isEqualTo(expectedColor)
+ }
+ }
+
+ @Test
+ fun clickableOverload_semantics() {
+ val count = mutableStateOf(0)
+ rule.setMaterialContent {
+ Surface(
+ modifier = Modifier.testTag("surface"),
+ role = Role.Checkbox,
+ onClick = { count.value += 1 }
+ ) {
+ Text("${count.value}")
+ Spacer(Modifier.size(30.dp))
+ }
+ }
+ rule.onNodeWithTag("surface")
+ .assertHasClickAction()
+ .assert(SemanticsMatcher.expectValue(SemanticsProperties.Role, Role.Checkbox))
+ .assertIsEnabled()
+ // since we merge descendants we should have text on the same node
+ .assertTextEquals("0")
+ .performClick()
+ .assertTextEquals("1")
+ }
+
+ @Test
+ fun clickableOverload_clickAction() {
+ val count = mutableStateOf(0f)
+ rule.setMaterialContent {
+ Surface(
+ modifier = Modifier.testTag("surface"),
+ onClick = { count.value += 1 }
+ ) {
+ Spacer(Modifier.size(30.dp))
+ }
+ }
+ rule.onNodeWithTag("surface")
+ .performClick()
+ Truth.assertThat(count.value).isEqualTo(1)
+
+ rule.onNodeWithTag("surface")
+ .performClick()
+ .performClick()
+ Truth.assertThat(count.value).isEqualTo(3)
+ }
+
+ @Test
+ fun clickableOverload_enabled_disabled() {
+ val count = mutableStateOf(0f)
+ val enabled = mutableStateOf(true)
+ rule.setMaterialContent {
+ Surface(
+ modifier = Modifier.testTag("surface"),
+ enabled = enabled.value,
+ onClick = { count.value += 1 }
+ ) {
+ Spacer(Modifier.size(30.dp))
+ }
+ }
+ rule.onNodeWithTag("surface")
+ .assertIsEnabled()
+ .performClick()
+
+ Truth.assertThat(count.value).isEqualTo(1)
+ rule.runOnIdle {
+ enabled.value = false
+ }
+
+ rule.onNodeWithTag("surface")
+ .assertIsNotEnabled()
+ .performClick()
+ .performClick()
+ Truth.assertThat(count.value).isEqualTo(1)
+ }
+
+ @Test
+ fun clickableOverload_interactionSource() {
+ val interactionSource = MutableInteractionSource()
+
+ var scope: CoroutineScope? = null
+
+ rule.mainClock.autoAdvance = false
+
+ rule.setContent {
+ scope = rememberCoroutineScope()
+ Surface(
+ modifier = Modifier.testTag("surface"),
+ onClick = {},
+ interactionSource = interactionSource
+ ) {
+ Spacer(Modifier.size(30.dp))
+ }
+ }
+
+ val interactions = mutableListOf<Interaction>()
+
+ scope!!.launch {
+ interactionSource.interactions.collect { interactions.add(it) }
+ }
+
+ rule.runOnIdle {
+ Truth.assertThat(interactions).isEmpty()
+ }
+
+ rule.onNodeWithTag("surface")
+ .performTouchInput { down(center) }
+
+ // Advance past the tap timeout
+ rule.mainClock.advanceTimeBy(100)
+
+ rule.runOnIdle {
+ Truth.assertThat(interactions).hasSize(1)
+ Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+ }
+
+ rule.onNodeWithTag("surface")
+ .performTouchInput { up() }
+
+ rule.runOnIdle {
+ Truth.assertThat(interactions).hasSize(2)
+ Truth.assertThat(interactions.first()).isInstanceOf(PressInteraction.Press::class.java)
+ Truth.assertThat(interactions[1]).isInstanceOf(PressInteraction.Release::class.java)
+ Truth.assertThat((interactions[1] as PressInteraction.Release).press)
+ .isEqualTo(interactions[0])
+ }
+ }
+
+ // TODO(b/198216553): Add surface_blockClicksBehind test from M2 after Button is added.
+
+ // regression test for b/189411183
+ @Test
+ fun surface_allowsFinalPassChildren() {
+ val hitTested = mutableStateOf(false)
+ rule.setContent {
+ Box(Modifier.fillMaxSize()) {
+ Surface(
+ Modifier.fillMaxSize().testTag("surface"),
+ ) {
+ Box(
+ Modifier
+ .fillMaxSize()
+ .testTag("clickable")
+ .pointerInput(Unit) {
+ forEachGesture {
+ awaitPointerEventScope {
+ hitTested.value = true
+ val event = awaitPointerEvent(PointerEventPass.Final)
+ Truth.assertThat(event.changes[0].consumed.downChange)
+ .isFalse()
+ }
+ }
+ }
+ )
+ }
+ }
+ }
+ rule.onNodeWithTag("clickable")
+ .performTouchInput {
+ down(center)
+ up()
+ }
+ Truth.assertThat(hitTested.value).isTrue()
+ }
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
index 1b09586..1299783 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ColorScheme.kt
@@ -19,7 +19,8 @@
import androidx.compose.material3.tokens.ColorDark
import androidx.compose.material3.tokens.ColorLight
import androidx.compose.material3.tokens.ColorSchemeKey
-import androidx.compose.material3.tokens.Elevation
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ReadOnlyComposable
import androidx.compose.runtime.Stable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
@@ -28,7 +29,9 @@
import androidx.compose.runtime.structuralEqualityPolicy
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.compositeOver
+import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
import kotlin.math.ln
/**
@@ -66,16 +69,6 @@
* @property onBackground Color used for text and icons displayed on top of the background color.
* @property surface The surface color that affect surfaces of components, such as cards, sheets,
* and menus.
- * @property surface1 Variation of [surface] with an overlay color or colors blended on top of it,
- * giving it a slightly more tonal color.
- * @property surface2 Variation of [surface] with an overlay color or colors blended on top of it,
- * giving it a slightly more tonal color.
- * @property surface3 Variation of [surface] with an overlay color or colors blended on top of it,
- * giving it a slightly more tonal color.
- * @property surface4 Variation of [surface] with an overlay color or colors blended on top of it,
- * giving it a slightly more tonal color.
- * @property surface5 Variation of [surface] with an overlay color or colors blended on top of it,
- * giving it a slightly more tonal color.
* @property onSurface Color used for text and icons displayed on top of the surface color.
* @property surfaceVariant Another option for a color with similar uses of [surface].
* @property onSurfaceVariant The color (and state variants) that can be used for content on top of
@@ -84,8 +77,6 @@
* sit on top of other surfaces with [surface] color.
* @property inverseOnSurface A color that contrasts well with [inverseSurface]. Useful for content
* that sits on top of containers that are [inverseSurface].
- * @property disabled A disabled color.
- * @property onDisabled Color used for text and icons displayed on top of the disabled color.
* @property error The error color is used to indicate errors in components, such as invalid text in
* a text field.
* @property onError Color used for text and icons displayed on top of the error color.
@@ -113,18 +104,11 @@
background: Color,
onBackground: Color,
surface: Color,
- surface1: Color,
- surface2: Color,
- surface3: Color,
- surface4: Color,
- surface5: Color,
onSurface: Color,
surfaceVariant: Color,
onSurfaceVariant: Color,
inverseSurface: Color,
inverseOnSurface: Color,
- disabled: Color,
- onDisabled: Color,
error: Color,
onError: Color,
errorContainer: Color,
@@ -163,16 +147,6 @@
internal set
var surface by mutableStateOf(surface, structuralEqualityPolicy())
internal set
- var surface1 by mutableStateOf(surface1, structuralEqualityPolicy())
- internal set
- var surface2 by mutableStateOf(surface2, structuralEqualityPolicy())
- internal set
- var surface3 by mutableStateOf(surface3, structuralEqualityPolicy())
- internal set
- var surface4 by mutableStateOf(surface4, structuralEqualityPolicy())
- internal set
- var surface5 by mutableStateOf(surface5, structuralEqualityPolicy())
- internal set
var onSurface by mutableStateOf(onSurface, structuralEqualityPolicy())
internal set
var surfaceVariant by mutableStateOf(surfaceVariant, structuralEqualityPolicy())
@@ -183,10 +157,6 @@
internal set
var inverseOnSurface by mutableStateOf(inverseOnSurface, structuralEqualityPolicy())
internal set
- var disabled by mutableStateOf(disabled, structuralEqualityPolicy())
- internal set
- var onDisabled by mutableStateOf(onDisabled, structuralEqualityPolicy())
- internal set
var error by mutableStateOf(error, structuralEqualityPolicy())
internal set
var onError by mutableStateOf(onError, structuralEqualityPolicy())
@@ -216,18 +186,11 @@
background: Color = this.background,
onBackground: Color = this.onBackground,
surface: Color = this.surface,
- surface1: Color = this.surface1,
- surface2: Color = this.surface2,
- surface3: Color = this.surface3,
- surface4: Color = this.surface4,
- surface5: Color = this.surface5,
onSurface: Color = this.onSurface,
surfaceVariant: Color = this.surfaceVariant,
onSurfaceVariant: Color = this.onSurfaceVariant,
inverseSurface: Color = this.inverseSurface,
inverseOnSurface: Color = this.inverseOnSurface,
- disabled: Color = this.disabled,
- onDisabled: Color = this.onDisabled,
error: Color = this.error,
onError: Color = this.onError,
errorContainer: Color = this.errorContainer,
@@ -251,18 +214,11 @@
background = background,
onBackground = onBackground,
surface = surface,
- surface1 = surface1,
- surface2 = surface2,
- surface3 = surface3,
- surface4 = surface4,
- surface5 = surface5,
onSurface = onSurface,
surfaceVariant = surfaceVariant,
onSurfaceVariant = onSurfaceVariant,
inverseSurface = inverseSurface,
inverseOnSurface = inverseOnSurface,
- disabled = disabled,
- onDisabled = onDisabled,
error = error,
onError = onError,
errorContainer = errorContainer,
@@ -288,18 +244,11 @@
"background=$background" +
"onBackground=$onBackground" +
"surface=$surface" +
- "surface1=$surface1" +
- "surface2=$surface2" +
- "surface3=$surface3" +
- "surface4=$surface4" +
- "surface5=$surface5" +
"onSurface=$onSurface" +
"surfaceVariant=$surfaceVariant" +
"onSurfaceVariant=$onSurfaceVariant" +
"inverseSurface=$inverseSurface" +
"inverseOnSurface=$inverseOnSurface" +
- "disabled=$disabled" +
- "onDisabled=$onDisabled" +
"error=$error" +
"onError=$onError" +
"errorContainer=$errorContainer" +
@@ -329,38 +278,11 @@
background: Color = ColorLight.Background,
onBackground: Color = ColorLight.OnBackground,
surface: Color = ColorLight.Surface,
- surface1: Color = colorAtElevation(
- elevation = Elevation.Level1,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary40
- ),
- surface2: Color = colorAtElevation(
- elevation = Elevation.Level2,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary40
- ),
- surface3: Color = colorAtElevation(
- elevation = Elevation.Level3,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary40
- ),
- surface4: Color = colorAtElevation(
- elevation = Elevation.Level4,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary40
- ),
- surface5: Color = colorAtElevation(
- elevation = Elevation.Level5,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary40
- ),
onSurface: Color = ColorLight.OnSurface,
surfaceVariant: Color = ColorLight.SurfaceVariant,
onSurfaceVariant: Color = ColorLight.OnSurfaceVariant,
inverseSurface: Color = ColorLight.InverseSurface,
inverseOnSurface: Color = ColorLight.InverseOnSurface,
- disabled: Color = ColorLight.Disabled,
- onDisabled: Color = ColorLight.OnDisabled,
error: Color = ColorLight.Error,
onError: Color = ColorLight.OnError,
errorContainer: Color = ColorLight.ErrorContainer,
@@ -384,18 +306,11 @@
background = background,
onBackground = onBackground,
surface = surface,
- surface1 = surface1,
- surface2 = surface2,
- surface3 = surface3,
- surface4 = surface4,
- surface5 = surface5,
onSurface = onSurface,
surfaceVariant = surfaceVariant,
onSurfaceVariant = onSurfaceVariant,
inverseSurface = inverseSurface,
inverseOnSurface = inverseOnSurface,
- disabled = disabled,
- onDisabled = onDisabled,
error = error,
onError = onError,
errorContainer = errorContainer,
@@ -423,38 +338,11 @@
background: Color = ColorDark.Background,
onBackground: Color = ColorDark.OnBackground,
surface: Color = ColorDark.Surface,
- surface1: Color = colorAtElevation(
- elevation = Elevation.Level1,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary80
- ),
- surface2: Color = colorAtElevation(
- elevation = Elevation.Level2,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary80
- ),
- surface3: Color = colorAtElevation(
- elevation = Elevation.Level3,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary80
- ),
- surface4: Color = colorAtElevation(
- elevation = Elevation.Level4,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary80
- ),
- surface5: Color = colorAtElevation(
- elevation = Elevation.Level5,
- surface = surface,
- surfaceOverlay = BaselineTonalPalette.primary80
- ),
onSurface: Color = ColorDark.OnSurface,
surfaceVariant: Color = ColorDark.SurfaceVariant,
onSurfaceVariant: Color = ColorDark.OnSurfaceVariant,
inverseSurface: Color = ColorDark.InverseSurface,
inverseOnSurface: Color = ColorDark.InverseOnSurface,
- disabled: Color = ColorDark.Disabled,
- onDisabled: Color = ColorDark.OnDisabled,
error: Color = ColorDark.Error,
onError: Color = ColorDark.OnError,
errorContainer: Color = ColorDark.ErrorContainer,
@@ -478,18 +366,11 @@
background = background,
onBackground = onBackground,
surface = surface,
- surface1 = surface1,
- surface2 = surface2,
- surface3 = surface3,
- surface4 = surface4,
- surface5 = surface5,
onSurface = onSurface,
surfaceVariant = surfaceVariant,
onSurfaceVariant = onSurfaceVariant,
inverseSurface = inverseSurface,
inverseOnSurface = inverseOnSurface,
- disabled = disabled,
- onDisabled = onDisabled,
error = error,
onError = onError,
errorContainer = errorContainer,
@@ -497,23 +378,91 @@
outline = outline,
)
-/*
- * Returns the [surface] color with a combination of an overlay layered on top of it.
+/**
+ * The Material color system contains pairs of colors that are typically used for the background and
+ * content color inside a component. For example, a [Button] typically uses `primary` for its
+ * background, and `onPrimary` for the color of its content (usually text or iconography).
*
- * Used to compute the values of surface1 through surface5.
+ * This function tries to match the provided [backgroundColor] to a 'background' color in this
+ * [ColorScheme], and then will return the corresponding color used for content. For example, when
+ * [backgroundColor] is [ColorScheme.primary], this will return [ColorScheme.onPrimary].
*
- * The color is computed using the following 2 layers:
- * - Bottom layer: [surface] at 100% opacity.
- * - Overlay: [surfaceOverlay] at varying opacities for each level.
+ * If [backgroundColor] does not match a background color in the theme, this will return
+ * [Color.Unspecified].
+ *
+ * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
+ * the theme's [ColorScheme], then returns [Color.Unspecified].
+ *
+ * @see contentColorFor
*/
-internal fun colorAtElevation(
+fun ColorScheme.contentColorFor(backgroundColor: Color): Color =
+ when (backgroundColor) {
+ primary -> onPrimary
+ secondary -> onSecondary
+ tertiary -> onTertiary
+ background -> onBackground
+ error -> onError
+ surface -> onSurface
+ surfaceVariant -> onSurfaceVariant
+ error -> onError
+ primaryContainer -> onPrimaryContainer
+ secondaryContainer -> onSecondaryContainer
+ tertiaryContainer -> onTertiaryContainer
+ errorContainer -> onErrorContainer
+ inverseSurface -> inverseOnSurface
+ else -> Color.Unspecified
+ }
+
+/**
+ * The Material color system contains pairs of colors that are typically used for the background and
+ * content color inside a component. For example, a [Button] typically uses `primary` for its
+ * background, and `onPrimary` for the color of its content (usually text or iconography).
+ *
+ * This function tries to match the provided [backgroundColor] to a 'background' color in this
+ * [ColorScheme], and then will return the corresponding color used for content. For example, when
+ * [backgroundColor] is [ColorScheme.primary], this will return [ColorScheme.onPrimary].
+ *
+ * If [backgroundColor] does not match a background color in the theme, this will return the current
+ * value of [LocalContentColor] as a best-effort color.
+ *
+ * @return the matching content color for [backgroundColor]. If [backgroundColor] is not present in
+ * the theme's [ColorScheme], then returns the current value of [LocalContentColor].
+ *
+ * @see ColorScheme.contentColorFor
+ */
+@Composable
+@ReadOnlyComposable
+fun contentColorFor(backgroundColor: Color) =
+ MaterialTheme.colorScheme.contentColorFor(backgroundColor).takeOrElse {
+ LocalContentColor.current
+ }
+
+/**
+ * Returns the new background [Color] to use, representing the original background [color] with an
+ * overlay corresponding to [elevation] applied. The overlay will only be applied to
+ * [ColorScheme.surface].
+ */
+internal fun ColorScheme.applyTonalElevation(backgroundColor: Color, elevation: Dp): Color {
+ if (backgroundColor == surface) {
+ return surfaceColorAtElevation(elevation)
+ } else {
+ return backgroundColor
+ }
+}
+
+/**
+ * Returns the [ColorScheme.surface] color with an alpha of the [ColorScheme.primary] color overlaid
+ * on top of it.
+ * Computes the surface tonal color at different elevation levels e.g. surface1 through surface5.
+ *
+ * @param elevation Elevation value used to compute alpha of the color overlay layer.
+ */
+internal fun ColorScheme.surfaceColorAtElevation(
elevation: Dp,
- surface: Color,
- surfaceOverlay: Color,
): Color {
+ if (elevation == 0.dp) return surface
val alpha = ((4.5f * ln(elevation.value + 1)) + 2f) / 100f
- val surfaceOverlayWithElevation = surfaceOverlay.copy(alpha = alpha)
- return surfaceOverlayWithElevation.compositeOver(surface)
+ return primary.copy(alpha = alpha).compositeOver(surface)
}
/**
@@ -547,18 +496,11 @@
background = other.background
onBackground = other.onBackground
surface = other.surface
- surface1 = other.surface1
- surface2 = other.surface2
- surface3 = other.surface3
- surface4 = other.surface4
- surface5 = other.surface5
onSurface = other.onSurface
surfaceVariant = other.surfaceVariant
onSurfaceVariant = other.onSurfaceVariant
inverseSurface = other.inverseSurface
inverseOnSurface = other.inverseOnSurface
- disabled = other.disabled
- onDisabled = other.onDisabled
error = other.error
onError = other.onError
errorContainer = other.errorContainer
@@ -574,14 +516,12 @@
internal fun ColorScheme.fromToken(value: ColorSchemeKey): Color {
return when (value) {
ColorSchemeKey.Background -> background
- ColorSchemeKey.Disabled -> disabled
ColorSchemeKey.Error -> error
ColorSchemeKey.ErrorContainer -> errorContainer
ColorSchemeKey.InverseOnSurface -> inverseOnSurface
ColorSchemeKey.InversePrimary -> inversePrimary
ColorSchemeKey.InverseSurface -> inverseSurface
ColorSchemeKey.OnBackground -> onBackground
- ColorSchemeKey.OnDisabled -> onDisabled
ColorSchemeKey.OnError -> onError
ColorSchemeKey.OnErrorContainer -> onErrorContainer
ColorSchemeKey.OnPrimary -> onPrimary
@@ -601,11 +541,6 @@
ColorSchemeKey.SurfaceVariant -> surfaceVariant
ColorSchemeKey.Tertiary -> tertiary
ColorSchemeKey.TertiaryContainer -> tertiaryContainer
- ColorSchemeKey.Surface1 -> surface1
- ColorSchemeKey.Surface2 -> surface2
- ColorSchemeKey.Surface3 -> surface3
- ColorSchemeKey.Surface4 -> surface4
- ColorSchemeKey.Surface5 -> surface5
}
}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt
similarity index 74%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt
index 2ab52fb..19f4e59 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/ExperimentalMaterial3Api.kt
@@ -14,7 +14,10 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.compose.material3
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+@RequiresOptIn(
+ "This material API is experimental and is likely to change or to be removed in" +
+ " the future."
+)
+annotation class ExperimentalMaterial3Api
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
index 00fd482..ba9daf7 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/IconButton.kt
@@ -19,7 +19,6 @@
import androidx.compose.foundation.interaction.Interaction
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.foundation.layout.Box
-import androidx.compose.foundation.layout.size
import androidx.compose.foundation.selection.toggleable
import androidx.compose.material.ripple.rememberRipple
import androidx.compose.material3.tokens.IconButton
@@ -29,7 +28,6 @@
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.semantics.Role
-import androidx.compose.ui.unit.dp
/**
* IconButton is a clickable icon, used to represent actions. An IconButton has an overall minimum
@@ -43,6 +41,8 @@
* [androidx.compose.material.icons.Icons]. If using a custom icon, note that the typical size for
* the internal icon is 24 x 24 dp.
*
+ * @sample androidx.compose.material3.samples.IconButtonSample
+ *
* @param onClick the lambda to be invoked when this icon is pressed
* @param modifier optional [Modifier] for this IconButton
* @param enabled whether or not this IconButton will handle input events and appear enabled for
@@ -64,14 +64,14 @@
Box(
modifier =
modifier
+ .minimumTouchTargetSize()
.clickable(
onClick = onClick,
enabled = enabled,
role = Role.Button,
interactionSource = interactionSource,
indication = rememberRipple(bounded = false, radius = RippleRadius)
- )
- .then(IconButtonSizeModifier),
+ ),
contentAlignment = Alignment.Center
) {
val contentColor =
@@ -88,6 +88,8 @@
* An [IconButton] with two states, for icons that can be toggled 'on' and 'off', such as a bookmark
* icon, or a navigation icon that opens a drawer.
*
+ * @sample androidx.compose.material3.samples.IconToggleButtonSample
+ *
* @param checked whether this IconToggleButton is currently checked
* @param onCheckedChange callback to be invoked when this icon is selected
* @param modifier optional [Modifier] for this IconToggleButton
@@ -112,6 +114,7 @@
Box(
modifier =
modifier
+ .minimumTouchTargetSize()
.toggleable(
value = checked,
onValueChange = onCheckedChange,
@@ -119,8 +122,7 @@
role = Role.Checkbox,
interactionSource = interactionSource,
indication = rememberRipple(bounded = false, radius = RippleRadius)
- )
- .then(IconButtonSizeModifier),
+ ),
contentAlignment = Alignment.Center
) {
val contentColor =
@@ -135,8 +137,3 @@
// Default radius of an unbounded ripple in an IconButton
private val RippleRadius = IconButton.StateLayerSize
-
-// TODO: b/149691127 investigate our strategy around accessibility touch targets, and remove
-// per-component definitions of this size.
-// Diameter of the IconButton, to allow for correct minimum touch target size for accessibility
-private val IconButtonSizeModifier = Modifier.size(48.dp)
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
index 46117af..9db274c 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/MaterialTheme.kt
@@ -38,7 +38,7 @@
* default values.
*
* All values may be set by providing this component with the [colorScheme][ColorScheme],
- * [typography][Typography], and [shapes][Shapes] attributes. Use this to configure the overall
+ * [typography][Typography] attributes. Use this to configure the overall
* theme of elements within this MaterialTheme.
*
* Any values that are not set will inherit the current value from the theme, falling back to the
@@ -48,13 +48,12 @@
*
* @param colorScheme A complete definition of the Material Color theme for this hierarchy
* @param typography A set of text styles to be used as this hierarchy's typography system
- * @param shapes A set of shapes to be used by the components in this hierarchy
*/
+
@Composable
fun MaterialTheme(
colorScheme: ColorScheme = MaterialTheme.colorScheme,
typography: Typography = MaterialTheme.typography,
- shapes: Shapes = MaterialTheme.shapes,
content: @Composable () -> Unit
) {
val rememberedColorScheme = remember {
@@ -68,7 +67,6 @@
LocalColorScheme provides rememberedColorScheme,
LocalTypography provides typography,
LocalRippleTheme provides MaterialRippleTheme,
- LocalShapes provides shapes,
) {
ProvideTextStyle(value = typography.bodyLarge, content = content)
}
@@ -94,14 +92,6 @@
@Composable
@ReadOnlyComposable
get() = LocalTypography.current
-
- /**
- * Retrieves the current [Shapes] at the call site's position in the hierarchy.
- */
- val shapes: Shapes
- @Composable
- @ReadOnlyComposable
- get() = LocalShapes.current
}
@Immutable
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
new file mode 100644
index 0000000..ddc8b6f
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Scaffold.kt
@@ -0,0 +1,245 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Immutable
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.layout.SubcomposeLayout
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+
+/**
+ * <a href="https://material.io/design/layout/understanding-layout.html" class="external" target="_blank">Material Design layout</a>.
+ *
+ * Scaffold implements the basic material design visual layout structure.
+ *
+ * This component provides API to put together several material components to construct your
+ * screen, by ensuring proper layout strategy for them and collecting necessary data so these
+ * components will work together correctly.
+ *
+ * @param modifier optional Modifier for the root of the [Scaffold]
+ * @param topBar top app bar of the screen. Consider using [SmallTopAppBar].
+ * @param bottomBar bottom bar of the screen. Consider using [NavigationBar].
+ * @param floatingActionButton Main action button of your screen. Consider using
+ * [FloatingActionButton] for this slot.
+ * @param floatingActionButtonPosition position of the FAB on the screen. See [FabPosition] for
+ * possible options available.
+ * @param containerColor background of the scaffold body
+ * @param contentColor color of the content in scaffold body. Defaults to either the matching
+ * content color for [containerColor], or, if it is not a color from the theme, this will keep
+ * the same value set above this Surface.
+ * @param content content of your screen. The lambda receives an [PaddingValues] that should be
+ * applied to the content root via Modifier.padding to properly offset top and bottom bars. If
+ * you're using Modifier.VerticalScroll, apply this modifier to the child of the scroll, and not on
+ * the scroll itself.
+ */
+// TODO(b/198144133): Add Simple example of a Scaffold with [SmallTopAppBar], [FloatingActionButton]
+// and [Navigation drawer].
+@ExperimentalMaterial3Api
+@Composable
+fun Scaffold(
+ modifier: Modifier = Modifier,
+ topBar: @Composable () -> Unit = {},
+ bottomBar: @Composable () -> Unit = {},
+ floatingActionButton: @Composable () -> Unit = {},
+ floatingActionButtonPosition: FabPosition = FabPosition.End,
+ containerColor: Color = MaterialTheme.colorScheme.background,
+ contentColor: Color = contentColorFor(containerColor),
+ content: @Composable (PaddingValues) -> Unit
+) {
+ val child = @Composable { childModifier: Modifier ->
+ Surface(modifier = childModifier, color = containerColor, contentColor = contentColor) {
+ ScaffoldLayout(
+ fabPosition = floatingActionButtonPosition,
+ topBar = topBar,
+ bottomBar = bottomBar,
+ content = content,
+ fab = floatingActionButton
+ )
+ }
+ }
+
+ // TODO(b/196872589): Add drawer support.
+ child(modifier)
+}
+
+/**
+ * Layout for a [Scaffold]'s content.
+ *
+ * @param fabPosition [FabPosition] for the FAB (if present)
+ * @param topBar the content to place at the top of the [Scaffold], typically a [SmallTopAppBar]
+ * @param content the main 'body' of the [Scaffold]
+ * @param fab the [FloatingActionButton] displayed on top of the [content]
+ * @param bottomBar the content to place at the bottom of the [Scaffold], on top of the
+ * [content], typically a [NavigationBar].
+ */
+@OptIn(ExperimentalMaterial3Api::class)
+@Composable
+private fun ScaffoldLayout(
+ fabPosition: FabPosition,
+ topBar: @Composable () -> Unit,
+ content: @Composable (PaddingValues) -> Unit,
+ fab: @Composable () -> Unit,
+ bottomBar: @Composable () -> Unit
+
+) {
+ SubcomposeLayout { constraints ->
+ val layoutWidth = constraints.maxWidth
+ val layoutHeight = constraints.maxHeight
+
+ val looseConstraints = constraints.copy(minWidth = 0, minHeight = 0)
+
+ layout(layoutWidth, layoutHeight) {
+ val topBarPlaceables = subcompose(ScaffoldLayoutContent.TopBar, topBar).map {
+ it.measure(looseConstraints)
+ }
+
+ val topBarHeight = topBarPlaceables.maxByOrNull { it.height }?.height ?: 0
+
+ val fabPlaceables =
+ subcompose(ScaffoldLayoutContent.Fab, fab).mapNotNull { measurable ->
+ measurable.measure(looseConstraints).takeIf { it.height != 0 && it.width != 0 }
+ }
+
+ val fabPlacement = if (fabPlaceables.isNotEmpty()) {
+ val fabWidth = fabPlaceables.maxByOrNull { it.width }!!.width
+ val fabHeight = fabPlaceables.maxByOrNull { it.height }!!.height
+ // FAB distance from the left of the layout, taking into account LTR / RTL
+ val fabLeftOffset = if (fabPosition == FabPosition.End) {
+ if (layoutDirection == LayoutDirection.Ltr) {
+ layoutWidth - FabSpacing.roundToPx() - fabWidth
+ } else {
+ FabSpacing.roundToPx()
+ }
+ } else {
+ (layoutWidth - fabWidth) / 2
+ }
+
+ FabPlacement(
+ left = fabLeftOffset,
+ width = fabWidth,
+ height = fabHeight
+ )
+ } else {
+ null
+ }
+
+ val bottomBarPlaceables = subcompose(ScaffoldLayoutContent.BottomBar) {
+ CompositionLocalProvider(
+ LocalFabPlacement provides fabPlacement,
+ content = bottomBar
+ )
+ }.map { it.measure(looseConstraints) }
+
+ val bottomBarHeight = bottomBarPlaceables.maxByOrNull { it.height }?.height ?: 0
+ val fabOffsetFromBottom = fabPlacement?.let {
+ if (bottomBarHeight == 0) {
+ it.height + FabSpacing.roundToPx()
+ } else {
+ // Total height is the bottom bar height + the FAB height + the padding
+ // between the FAB and bottom bar
+ bottomBarHeight + it.height + FabSpacing.roundToPx()
+ }
+ }
+
+ val bodyContentHeight = layoutHeight - topBarHeight
+
+ val bodyContentPlaceables = subcompose(ScaffoldLayoutContent.MainContent) {
+ val innerPadding = PaddingValues(bottom = bottomBarHeight.toDp())
+ content(innerPadding)
+ }.map { it.measure(looseConstraints.copy(maxHeight = bodyContentHeight)) }
+
+ // Placing to control drawing order to match default elevation of each placeable
+
+ bodyContentPlaceables.forEach {
+ it.place(0, topBarHeight)
+ }
+ topBarPlaceables.forEach {
+ it.place(0, 0)
+ }
+ // The bottom bar is always at the bottom of the layout
+ bottomBarPlaceables.forEach {
+ it.place(0, layoutHeight - bottomBarHeight)
+ }
+ // Explicitly not using placeRelative here as `leftOffset` already accounts for RTL
+ fabPlacement?.let { placement ->
+ fabPlaceables.forEach {
+ it.place(placement.left, layoutHeight - fabOffsetFromBottom!!)
+ }
+ }
+ }
+ }
+}
+
+/**
+ * The possible positions for a [FloatingActionButton] attached to a [Scaffold].
+ */
+// TODO(b/200553810): Mark as experimental
+@ExperimentalMaterial3Api
+@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
+inline class FabPosition internal constructor(@Suppress("unused") private val value: Int) {
+ companion object {
+ /**
+ * Position FAB at the bottom of the screen in the center, above the [NavigationBar] (if it
+ * exists)
+ */
+ val Center = FabPosition(0)
+
+ /**
+ * Position FAB at the bottom of the screen at the end, above the [NavigationBar] (if it
+ * exists)
+ */
+ val End = FabPosition(1)
+ }
+
+ override fun toString(): String {
+ return when (this) {
+ Center -> "FabPosition.Center"
+ else -> "FabPosition.End"
+ }
+ }
+}
+
+/**
+ * Placement information for a [FloatingActionButton] inside a [Scaffold].
+ *
+ * @property left the FAB's offset from the left edge of the bottom bar, already adjusted for RTL
+ * support
+ * @property width the width of the FAB
+ * @property height the height of the FAB
+ */
+@Immutable
+internal class FabPlacement(
+ val left: Int,
+ val width: Int,
+ val height: Int
+)
+
+/**
+ * CompositionLocal containing a [FabPlacement] that is used to calculate the FAB bottom offset.
+ */
+internal val LocalFabPlacement = staticCompositionLocalOf<FabPlacement?> { null }
+
+// FAB spacing above the bottom bar / bottom of the Scaffold
+private val FabSpacing = 16.dp
+
+private enum class ScaffoldLayoutContent { TopBar, MainContent, Fab, BottomBar }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt
deleted file mode 100644
index dcf0421..0000000
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Shapes.kt
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.material3
-
-import androidx.compose.foundation.shape.CornerBasedShape
-import androidx.compose.material3.tokens.Shape
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.staticCompositionLocalOf
-
-/**
- * Material surfaces can be displayed in different shapes. Shapes direct attention, identify
- * components, communicate state, and express brand.
- *
- * Components are grouped into shape categories based on their size. These categories provide a
- * way to change multiple component values at once, by changing the category’s values.
- * Shape categories include:
- * - Small components
- * - Medium components
- * - Large components
- *
- * See [Material shape specification](https://material.io/design/shape/applying-shape-to-ui.html)
- */
-@Immutable
-class Shapes(
- // TODO(connieshi): add examples.
- /**
- * Shape used by small components.
- */
- val small: CornerBasedShape = Shape.Small,
- // TODO(connieshi): add examples.
- /**
- * Shape used by medium components.
- */
- val medium: CornerBasedShape = Shape.Medium,
- // TODO(connieshi): add examples.
- /**
- * Shape used by large components.
- */
- val large: CornerBasedShape = Shape.Large
-) {
-
- /**
- * Returns a copy of this Shapes, optionally overriding some of the values.
- */
- fun copy(
- small: CornerBasedShape = this.small,
- medium: CornerBasedShape = this.medium,
- large: CornerBasedShape = this.large
- ): Shapes = Shapes(
- small = small,
- medium = medium,
- large = large
- )
-
- override fun equals(other: Any?): Boolean {
- if (this === other) return true
- if (other !is Shapes) return false
-
- if (small != other.small) return false
- if (medium != other.medium) return false
- if (large != other.large) return false
-
- return true
- }
-
- override fun hashCode(): Int {
- var result = small.hashCode()
- result = 31 * result + medium.hashCode()
- result = 31 * result + large.hashCode()
- return result
- }
-
- override fun toString(): String {
- return "Shapes(small=$small, medium=$medium, large=$large)"
- }
-}
-
-/**
- * CompositionLocal used to specify the default shapes for the surfaces.
- */
-internal val LocalShapes = staticCompositionLocalOf { Shapes() }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
new file mode 100644
index 0000000..c050df3
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Surface.kt
@@ -0,0 +1,259 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import androidx.compose.foundation.BorderStroke
+import androidx.compose.foundation.Indication
+import androidx.compose.foundation.LocalIndication
+import androidx.compose.foundation.background
+import androidx.compose.foundation.border
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.interaction.Interaction
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.PressInteraction
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.compositionLocalOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.clip
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.RectangleShape
+import androidx.compose.ui.graphics.Shape
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.semantics.Role
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+
+// TODO(b/197880751): Add url to spec on Material.io.
+// TODO(b/193431107): Add sample.
+/**
+ * Material surface is the central metaphor in material design. Each surface exists at a given
+ * elevation, which influences how that piece of surface visually relates to other surfaces and how
+ * that surface is modified by tonal variance.
+ *
+ * If you want to have a [Surface] that handles clicks, consider using another overload.
+ *
+ * The [Surface] is responsible for:
+ *
+ * 1) Clipping: Surface clips its children to the shape specified by [shape]
+ *
+ * 2) Borders: If [shape] has a border, then it will also be drawn.
+ *
+ * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
+ * [ColorScheme.surface] a color overlay will be applied. The color of the overlay depends on the
+ * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any
+ * parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than
+ * its ancestors, by summing the elevation of all previous Surfaces.
+ *
+ * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
+ * this surface - this is used by the [Text] and [Icon] components as a default color.
+ *
+ * If no [contentColor] is set, this surface will try and match its background color to a color
+ * defined in the theme [ColorScheme], and return the corresponding content color. For example, if
+ * the
+ * [color] of this surface is [ColorScheme.surface], [contentColor] will be set to
+ * [ColorScheme.onSurface]. If [color] is not part of the theme palette, [contentColor] will keep
+ * the same value set above this Surface.
+ *
+ * To modify these default style values used by text, use [ProvideTextStyle] or explicitly pass a
+ * new [TextStyle] to your text.
+ *
+ * To manually retrieve the content color inside a surface, use [LocalContentColor].
+ *
+ * 5) Blocking touch propagation behind the surface.
+ *
+ * @param modifier Modifier to be applied to the layout corresponding to the surface
+ * @param shape Defines the surface's shape as well its shadow.
+ * @param color The background color. Use [Color.Transparent] to have no color.
+ * @param contentColor The preferred content color provided by this Surface to its children.
+ * Defaults to either the matching content color for [color], or if [color] is not a color from the
+ * theme, this will keep the same value set above this Surface.
+ * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation (surface
+ * blended with more primary) will result in a darker surface color in light theme and lighter color
+ * in dark theme.
+ * @param border Optional border to draw on top of the surface
+ */
+@Composable
+fun Surface(
+ modifier: Modifier = Modifier,
+ shape: Shape = RectangleShape,
+ color: Color = MaterialTheme.colorScheme.surface,
+ contentColor: Color = contentColorFor(color),
+ tonalElevation: Dp = 0.dp,
+ border: BorderStroke? = null,
+ content: @Composable () -> Unit
+) {
+ Surface(
+ modifier = modifier,
+ shape = shape,
+ color = color,
+ contentColor = contentColor,
+ tonalElevation = tonalElevation,
+ border = border,
+ content = content,
+ clickAndSemanticsModifier =
+ Modifier.semantics(mergeDescendants = false) {}.pointerInput(Unit) {}
+ )
+}
+
+/**
+ * Material surface is the central metaphor in material design. Each surface exists at a given
+ * elevation, which influences how that piece of surface visually relates to other surfaces and how
+ * that surface is modified by tonal variance.
+ *
+ * This version of [Surface] is responsible for a click handling as well al everything else that a
+ * regular Surface does:
+ *
+ * This clickable [Surface] is responsible for:
+ *
+ * 1) Clipping: Surface clips its children to the shape specified by [shape]
+ *
+ * 2) Borders: If [shape] has a border, then it will also be drawn.
+ *
+ * 3) Background: Surface fills the shape specified by [shape] with the [color]. If [color] is
+ * [ColorScheme.surface] a color overlay may be applied. The color of the overlay depends on the
+ * [tonalElevation] of this Surface, and the [LocalAbsoluteTonalElevation] set by any
+ * parent surfaces. This ensures that a Surface never appears to have a lower elevation overlay than
+ * its ancestors, by summing the elevation of all previous Surfaces.
+ *
+ * 4) Content color: Surface uses [contentColor] to specify a preferred color for the content of
+ * this surface - this is used by the [Text] and [Icon] components as a default color. If no
+ * [contentColor] is set, this surface will try and match its background color to a color defined in
+ * the theme [ColorScheme], and return the corresponding content color. For example, if the [color]
+ * of this surface is [ColorScheme.surface], [contentColor] will be set to [ColorScheme.onSurface].
+ * If [color] is not part of the theme palette, [contentColor] will keep the same value set above
+ * this Surface.
+ *
+ * 6) Click handling. This version of surface will react to the clicks, calling [onClick] lambda,
+ * updating the [interactionSource] when [PressInteraction] occurs, and showing [indication] (if it
+ * is not `null) in response to press events. If you don't need click handling, consider using the
+ * version that doesn't require [onClick] param.
+ *
+ * 7) Semantics for clicks. Just like with [Modifier.clickable], clickable version of [Surface] will
+ * produce semantics to indicate that it is able to be clicked, with [onClickLabel] (if provided),
+ * announced by accessibility services.
+ *
+ * To modify these default style values used by text, use [ProvideTextStyle] or explicitly pass a
+ * new [TextStyle] to your text.
+ *
+ * To manually retrieve the content color inside a surface, use [LocalContentColor].
+ *
+ * @param onClick callback to be called when the surface is clicked
+ * @param modifier Modifier to be applied to the layout corresponding to the surface
+ * @param shape Defines the surface's shape as well its shadow. A shadow is only displayed if the
+ * [tonalElevation] is greater than zero.
+ * @param color The background color. Use [Color.Transparent] to have no color.
+ * @param contentColor The preferred content color provided by this Surface to its children.
+ * Defaults to either the matching content color for [color], or if [color] is not a color from the
+ * theme, this will keep the same value set above this Surface.
+ * @param border Optional border to draw on top of the surface
+ * @param tonalElevation When [color] is [ColorScheme.surface], a higher the elevation (surface
+ * blended with more primary) will result in a darker surface color in light theme and lighter color
+ * in dark theme.
+ * @param interactionSource the [MutableInteractionSource] representing the stream of [Interaction]s
+ * for this Surface. You can create and pass in your own remembered [MutableInteractionSource] if
+ * you want to observe [Interaction]s and customize the appearance / behavior of this Surface in
+ * different [Interaction]s.
+ * @param indication indication to be shown when surface is pressed. By default, indication from
+ * [LocalIndication] will be used. Pass `null` to show no indication, or current value from
+ * [LocalIndication] to show theme default
+ * @param enabled Controls the enabled state of the surface. When `false`, this surface will not be
+ * clickable
+ * @param onClickLabel semantic / accessibility label for the [onClick] action
+ * @param role the type of user interface element. Accessibility services might use this to describe
+ * the element or do customizations
+ */
+@Composable
+fun Surface(
+ onClick: () -> Unit,
+ modifier: Modifier = Modifier,
+ shape: Shape = RectangleShape,
+ color: Color = MaterialTheme.colorScheme.surface,
+ contentColor: Color = contentColorFor(color),
+ tonalElevation: Dp = 0.dp,
+ border: BorderStroke? = null,
+ interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
+ indication: Indication? = LocalIndication.current,
+ enabled: Boolean = true,
+ onClickLabel: String? = null,
+ role: Role? = null,
+ content: @Composable () -> Unit
+) {
+ Surface(
+ modifier = modifier.minimumTouchTargetSize(),
+ shape = shape,
+ color = color,
+ contentColor = contentColor,
+ tonalElevation = tonalElevation,
+ border = border,
+ content = content,
+ clickAndSemanticsModifier =
+ Modifier.clickable(
+ interactionSource = interactionSource,
+ indication = indication,
+ enabled = enabled,
+ onClickLabel = onClickLabel,
+ role = role,
+ onClick = onClick
+ )
+ )
+}
+
+@Composable
+private fun Surface(
+ modifier: Modifier = Modifier,
+ shape: Shape = RectangleShape,
+ border: BorderStroke? = null,
+ color: Color = MaterialTheme.colorScheme.primary,
+ contentColor: Color = contentColorFor(color),
+ tonalElevation: Dp = 0.dp, // This will be used to compute surface tonal colors
+ clickAndSemanticsModifier: Modifier,
+ content: @Composable () -> Unit
+) {
+ val absoluteElevation = LocalAbsoluteTonalElevation.current + tonalElevation
+ val backgroundColor =
+ if (color == MaterialTheme.colorScheme.surface) {
+ MaterialTheme.colorScheme.surfaceColorAtElevation(absoluteElevation)
+ } else {
+ color
+ }
+ CompositionLocalProvider(
+ LocalContentColor provides contentColor,
+ LocalAbsoluteTonalElevation provides absoluteElevation
+ ) {
+ Box(
+ modifier
+ .then(if (border != null) Modifier.border(border, shape) else Modifier)
+ .background(color = backgroundColor, shape = shape)
+ .clip(shape)
+ .then(clickAndSemanticsModifier),
+ propagateMinConstraints = true
+ ) { content() }
+ }
+}
+
+/**
+ * CompositionLocal containing the current absolute elevation provided by [Surface] components. This
+ * absolute elevation is a sum of all the previous elevations. Absolute elevation is only used for
+ * calculating surface tonal colors, and is *not* used for drawing the shadow in a [Surface].
+ */
+// TODO(b/179787782): Add sample after catalog app lands in aosp.
+val LocalAbsoluteTonalElevation = compositionLocalOf { 0.dp }
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TouchTarget.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TouchTarget.kt
new file mode 100644
index 0000000..d81521a
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/TouchTarget.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.material3
+
+import androidx.compose.runtime.ProvidableCompositionLocal
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.layout.LayoutModifier
+import androidx.compose.ui.layout.Measurable
+import androidx.compose.ui.layout.MeasureResult
+import androidx.compose.ui.layout.MeasureScope
+import androidx.compose.ui.platform.LocalViewConfiguration
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.DpSize
+import kotlin.math.roundToInt
+
+@OptIn(ExperimentalMaterial3Api::class)
+@Suppress("ModifierInspectorInfo")
+internal fun Modifier.minimumTouchTargetSize(): Modifier = composed {
+ if (LocalMinimumTouchTargetEnforcement.current) {
+ // TODO: consider using a hardcoded value of 48.dp instead to avoid inconsistent UI if the
+ // LocalViewConfiguration changes across devices / during runtime.
+ val size = LocalViewConfiguration.current.minimumTouchTargetSize
+ MinimumTouchTargetModifier(size)
+ } else {
+ Modifier
+ }
+}
+
+/**
+ * CompositionLocal that configures whether Material components that have a visual size that is
+ * lower than the minimum touch target size for accessibility (such as Button) will include
+ * extra space outside the component to ensure that they are accessible. If set to false there
+ * will be no extra space, and so it is possible that if the component is placed near the edge of
+ * a layout / near to another component without any padding, there will not be enough space for
+ * an accessible touch target.
+ */
+@Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+@get:ExperimentalMaterial3Api
+@ExperimentalMaterial3Api
+val LocalMinimumTouchTargetEnforcement: ProvidableCompositionLocal<Boolean> =
+ staticCompositionLocalOf { true }
+
+private class MinimumTouchTargetModifier(val size: DpSize) : LayoutModifier {
+ override fun MeasureScope.measure(
+ measurable: Measurable,
+ constraints: Constraints
+ ): MeasureResult {
+
+ val placeable = measurable.measure(constraints)
+
+ // Be at least as big as the minimum dimension in both dimensions
+ val width = maxOf(placeable.width, size.width.roundToPx())
+ val height = maxOf(placeable.height, size.height.roundToPx())
+
+ return layout(width, height) {
+ val centerX = ((width - placeable.width) / 2f).roundToInt()
+ val centerY = ((height - placeable.height) / 2f).roundToInt()
+ placeable.place(centerX, centerY)
+ }
+ }
+
+ override fun equals(other: Any?): Boolean {
+ val otherModifier = other as? MinimumTouchTargetModifier ?: return false
+ return size == otherModifier.size
+ }
+
+ override fun hashCode(): Int {
+ return size.hashCode()
+ }
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt
index 2476e8e..0594940 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/Typography.kt
@@ -16,10 +16,11 @@
package androidx.compose.material3
-import androidx.compose.material3.tokens.TypeScale
+import androidx.compose.material3.tokens.TypographyKey
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.staticCompositionLocalOf
import androidx.compose.ui.text.TextStyle
+import androidx.compose.material3.tokens.Typography as TypographyStyleTokens
// TODO(b/197880751): Update description after spec draft is available.
/**
@@ -32,18 +33,18 @@
* @property displayLarge displayLarge is the largest display text.
* @property displayMedium displayMedium is the second largest display text.
* @property displaySmall displaySmall is the smallest display text.
- * @property headlineLarge headlineLarge is the largest headline, reserved for short, important
- * text or numerals. For headlines, you can choose an expressive font, such as a display,
- * handwritten, or script style. These unconventional font designs have details and intricacy
- * that help attract the eye.
+ * @property headlineLarge headlineLarge is the largest headline, reserved for short, important text
+ * or numerals. For headlines, you can choose an expressive font, such as a display, handwritten, or
+ * script style. These unconventional font designs have details and intricacy that help attract the
+ * eye.
* @property headlineMedium headlineMedium is the second largest headline, reserved for short,
- * important text or numerals. For headlines, you can choose an expressive font, such as a
- * display, handwritten, or script style. These unconventional font designs have details and
- * intricacy that help attract the eye.
- * @property headlineSmall headlineSmall is the smallest headline, reserved for short, important text or
- * numerals. For headlines, you can choose an expressive font, such as a display, handwritten, or
- * script style. These unconventional font designs have details and intricacy that help attract
- * the eye.
+ * important text or numerals. For headlines, you can choose an expressive font, such as a display,
+ * handwritten, or script style. These unconventional font designs have details and intricacy that
+ * help attract the eye.
+ * @property headlineSmall headlineSmall is the smallest headline, reserved for short, important
+ * text or numerals. For headlines, you can choose an expressive font, such as a display,
+ * handwritten, or script style. These unconventional font designs have details and intricacy that
+ * help attract the eye.
* @property titleLarge titleLarge is the largest title, and is typically reserved for
* medium-emphasis text that is shorter in length. Serif or sans serif typefaces work well for
* subtitles.
@@ -62,8 +63,8 @@
* @property bodySmall bodySmall is the smallest body, and is typically used for long-form writing
* as it works well for small text sizes. For longer sections of text, a serif or sans serif
* typeface is recommended.
- * @property labelLarge labelLarge text is a call to action used in different types of buttons
- * (such as text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
+ * @property labelLarge labelLarge text is a call to action used in different types of buttons (such
+ * as text, outlined and contained buttons) and in tabs, dialogs, and cards. Button text is
* typically sans serif, using all caps text.
* @property labelMedium labelMedium is one of the smallest font sizes. It is used sparingly to
* annotate imagery or to introduce a headline.
@@ -72,25 +73,24 @@
*/
@Immutable
class Typography(
- val displayLarge: TextStyle = DefaultDisplayLarge,
- val displayMedium: TextStyle = DefaultDisplayMedium,
- val displaySmall: TextStyle = DefaultDisplaySmall,
- val headlineLarge: TextStyle = DefaultHeadlineLarge,
- val headlineMedium: TextStyle = DefaultHeadlineMedium,
- val headlineSmall: TextStyle = DefaultHeadlineSmall,
- val titleLarge: TextStyle = DefaultTitleLarge,
- val titleMedium: TextStyle = DefaultTitleMedium,
- val titleSmall: TextStyle = DefaultTitleSmall,
- val bodyLarge: TextStyle = DefaultBodyLarge,
- val bodyMedium: TextStyle = DefaultBodyMedium,
- val bodySmall: TextStyle = DefaultBodySmall,
- val labelLarge: TextStyle = DefaultLabelLarge,
- val labelMedium: TextStyle = DefaultLabelMedium,
- val labelSmall: TextStyle = DefaultLabelSmall,
+ val displayLarge: TextStyle = TypographyStyleTokens.DisplayLarge,
+ val displayMedium: TextStyle = TypographyStyleTokens.DisplayMedium,
+ val displaySmall: TextStyle = TypographyStyleTokens.DisplaySmall,
+ val headlineLarge: TextStyle = TypographyStyleTokens.HeadlineLarge,
+ val headlineMedium: TextStyle = TypographyStyleTokens.HeadlineMedium,
+ val headlineSmall: TextStyle = TypographyStyleTokens.HeadlineSmall,
+ val titleLarge: TextStyle = TypographyStyleTokens.TitleLarge,
+ val titleMedium: TextStyle = TypographyStyleTokens.TitleMedium,
+ val titleSmall: TextStyle = TypographyStyleTokens.TitleSmall,
+ val bodyLarge: TextStyle = TypographyStyleTokens.BodyLarge,
+ val bodyMedium: TextStyle = TypographyStyleTokens.BodyMedium,
+ val bodySmall: TextStyle = TypographyStyleTokens.BodySmall,
+ val labelLarge: TextStyle = TypographyStyleTokens.LabelLarge,
+ val labelMedium: TextStyle = TypographyStyleTokens.LabelMedium,
+ val labelSmall: TextStyle = TypographyStyleTokens.LabelSmall,
) {
- /**
- * Returns a copy of this Typography, optionally overriding some of the values.
- */
+
+ /** Returns a copy of this Typography, optionally overriding some of the values. */
fun copy(
displayLarge: TextStyle = this.displayLarge,
displayMedium: TextStyle = this.displayMedium,
@@ -107,23 +107,24 @@
labelLarge: TextStyle = this.labelLarge,
labelMedium: TextStyle = this.labelMedium,
labelSmall: TextStyle = this.labelSmall,
- ): Typography = Typography(
- displayLarge = displayLarge,
- displayMedium = displayMedium,
- displaySmall = displaySmall,
- headlineLarge = headlineLarge,
- headlineMedium = headlineMedium,
- headlineSmall = headlineSmall,
- titleLarge = titleLarge,
- titleMedium = titleMedium,
- titleSmall = titleSmall,
- bodyLarge = bodyLarge,
- bodyMedium = bodyMedium,
- bodySmall = bodySmall,
- labelLarge = labelLarge,
- labelMedium = labelMedium,
- labelSmall = labelSmall
- )
+ ): Typography =
+ Typography(
+ displayLarge = displayLarge,
+ displayMedium = displayMedium,
+ displaySmall = displaySmall,
+ headlineLarge = headlineLarge,
+ headlineMedium = headlineMedium,
+ headlineSmall = headlineSmall,
+ titleLarge = titleLarge,
+ titleMedium = titleMedium,
+ titleSmall = titleSmall,
+ bodyLarge = bodyLarge,
+ bodyMedium = bodyMedium,
+ bodySmall = bodySmall,
+ labelLarge = labelLarge,
+ labelMedium = labelMedium,
+ labelSmall = labelSmall
+ )
override fun equals(other: Any?): Boolean {
if (this === other) return true
@@ -177,124 +178,27 @@
}
}
-private val DefaultDisplayLarge = TextStyle(
- fontFamily = TypeScale.DisplayLargeFont,
- fontWeight = TypeScale.DisplayLargeWeight,
- fontSize = TypeScale.DisplayLargeSizePoints,
- lineHeight = TypeScale.DisplayLargeLineHeightPoints,
- letterSpacing = TypeScale.DisplayLargeTrackingPoints
-)
-
-private val DefaultDisplayMedium = TextStyle(
- fontFamily = TypeScale.DisplayMediumFont,
- fontWeight = TypeScale.DisplayMediumWeight,
- fontSize = TypeScale.DisplayMediumSizePoints,
- lineHeight = TypeScale.DisplayMediumLineHeightPoints,
- letterSpacing = TypeScale.DisplayMediumTrackingPoints
-)
-
-private val DefaultDisplaySmall = TextStyle(
- fontFamily = TypeScale.DisplaySmallFont,
- fontWeight = TypeScale.DisplaySmallWeight,
- fontSize = TypeScale.DisplaySmallSizePoints,
- lineHeight = TypeScale.DisplaySmallLineHeightPoints,
- letterSpacing = TypeScale.DisplaySmallTrackingPoints
-)
-
-private val DefaultHeadlineLarge = TextStyle(
- fontFamily = TypeScale.HeadlineLargeFont,
- fontWeight = TypeScale.HeadlineLargeWeight,
- fontSize = TypeScale.HeadlineLargeSizePoints,
- lineHeight = TypeScale.HeadlineLargeLineHeightPoints,
- letterSpacing = TypeScale.HeadlineLargeTrackingPoints
-)
-
-private val DefaultHeadlineMedium = TextStyle(
- fontFamily = TypeScale.HeadlineMediumFont,
- fontWeight = TypeScale.HeadlineMediumWeight,
- fontSize = TypeScale.HeadlineMediumSizePoints,
- lineHeight = TypeScale.HeadlineMediumLineHeightPoints,
- letterSpacing = TypeScale.HeadlineMediumTrackingPoints
-)
-
-private val DefaultHeadlineSmall = TextStyle(
- fontFamily = TypeScale.HeadlineSmallFont,
- fontWeight = TypeScale.HeadlineSmallWeight,
- fontSize = TypeScale.HeadlineSmallSizePoints,
- lineHeight = TypeScale.HeadlineSmallLineHeightPoints,
- letterSpacing = TypeScale.HeadlineSmallTrackingPoints
-)
-
-private val DefaultTitleLarge = TextStyle(
- fontFamily = TypeScale.TitleLargeFont,
- fontWeight = TypeScale.TitleLargeWeight,
- fontSize = TypeScale.TitleLargeSizePoints,
- lineHeight = TypeScale.TitleLargeLineHeightPoints,
- letterSpacing = TypeScale.TitleLargeTrackingPoints
-)
-
-private val DefaultTitleMedium = TextStyle(
- fontFamily = TypeScale.TitleMediumFont,
- fontWeight = TypeScale.TitleMediumWeight,
- fontSize = TypeScale.TitleMediumSizePoints,
- lineHeight = TypeScale.TitleMediumLineHeightPoints,
- letterSpacing = TypeScale.TitleMediumTrackingPoints
-)
-
-private val DefaultTitleSmall = TextStyle(
- fontFamily = TypeScale.TitleSmallFont,
- fontWeight = TypeScale.TitleSmallWeight,
- fontSize = TypeScale.TitleSmallSizePoints,
- lineHeight = TypeScale.TitleSmallLineHeightPoints,
- letterSpacing = TypeScale.TitleSmallTrackingPoints
-)
-
-private val DefaultBodyLarge = TextStyle(
- fontFamily = TypeScale.BodyLargeFont,
- fontWeight = TypeScale.BodyLargeWeight,
- fontSize = TypeScale.BodyLargeSizePoints,
- lineHeight = TypeScale.BodyLargeLineHeightPoints,
- letterSpacing = TypeScale.BodyLargeTrackingPoints
-)
-
-private val DefaultBodyMedium = TextStyle(
- fontFamily = TypeScale.BodyMediumFont,
- fontWeight = TypeScale.BodyMediumWeight,
- fontSize = TypeScale.BodyMediumSizePoints,
- lineHeight = TypeScale.BodyMediumLineHeightPoints,
- letterSpacing = TypeScale.BodyMediumTrackingPoints
-)
-
-private val DefaultBodySmall = TextStyle(
- fontFamily = TypeScale.BodySmallFont,
- fontWeight = TypeScale.BodySmallWeight,
- fontSize = TypeScale.BodySmallSizePoints,
- lineHeight = TypeScale.BodySmallLineHeightPoints,
- letterSpacing = TypeScale.BodySmallTrackingPoints
-)
-
-private val DefaultLabelLarge = TextStyle(
- fontFamily = TypeScale.LabelLargeFont,
- fontWeight = TypeScale.LabelLargeWeight,
- fontSize = TypeScale.LabelLargeSizePoints,
- lineHeight = TypeScale.LabelLargeLineHeightPoints,
- letterSpacing = TypeScale.LabelLargeTrackingPoints
-)
-
-private val DefaultLabelMedium = TextStyle(
- fontFamily = TypeScale.LabelMediumFont,
- fontWeight = TypeScale.LabelMediumWeight,
- fontSize = TypeScale.LabelMediumSizePoints,
- lineHeight = TypeScale.LabelMediumLineHeightPoints,
- letterSpacing = TypeScale.LabelMediumTrackingPoints
-)
-
-private val DefaultLabelSmall = TextStyle(
- fontFamily = TypeScale.LabelSmallFont,
- fontWeight = TypeScale.LabelSmallWeight,
- fontSize = TypeScale.LabelSmallSizePoints,
- lineHeight = TypeScale.LabelSmallLineHeightPoints,
- letterSpacing = TypeScale.LabelSmallTrackingPoints
-)
+/**
+ * Helper function for component typography tokens.
+ */
+internal fun Typography.fromToken(value: TypographyKey): TextStyle {
+ return when (value) {
+ TypographyKey.DisplayLarge -> displayLarge
+ TypographyKey.DisplayMedium -> displayMedium
+ TypographyKey.DisplaySmall -> displaySmall
+ TypographyKey.HeadlineLarge -> headlineLarge
+ TypographyKey.HeadlineMedium -> headlineMedium
+ TypographyKey.HeadlineSmall -> headlineSmall
+ TypographyKey.TitleLarge -> titleLarge
+ TypographyKey.TitleMedium -> titleMedium
+ TypographyKey.TitleSmall -> titleSmall
+ TypographyKey.BodyLarge -> bodyLarge
+ TypographyKey.BodyMedium -> bodyMedium
+ TypographyKey.BodySmall -> bodySmall
+ TypographyKey.LabelLarge -> labelLarge
+ TypographyKey.LabelMedium -> labelMedium
+ TypographyKey.LabelSmall -> labelSmall
+ }
+}
internal val LocalTypography = staticCompositionLocalOf { Typography() }
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorDark.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorDark.kt
index 650c19f..3ebe5e6 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorDark.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorDark.kt
@@ -19,14 +19,12 @@
internal object ColorDark {
val Background = Palette.Neutral10
- val Disabled = Palette.Neutral20
val Error = Palette.Error80
val ErrorContainer = Palette.Error30
val InverseOnSurface = Palette.Neutral20
val InversePrimary = Palette.Primary40
val InverseSurface = Palette.Neutral90
val OnBackground = Palette.Neutral90
- val OnDisabled = Palette.NeutralVariant60
val OnError = Palette.Error20
val OnErrorContainer = Palette.Error80
val OnPrimary = Palette.Primary20
@@ -42,7 +40,6 @@
val PrimaryContainer = Palette.Primary30
val Secondary = Palette.Secondary80
val SecondaryContainer = Palette.Secondary30
- val Shadow = Palette.Neutral0
val Surface = Palette.Neutral10
val SurfaceVariant = Palette.NeutralVariant30
val Tertiary = Palette.Tertiary80
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorLight.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorLight.kt
index 4072df1..fdaa91e 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorLight.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorLight.kt
@@ -19,14 +19,12 @@
internal object ColorLight {
val Background = Palette.Neutral99
- val Disabled = Palette.Neutral95
val Error = Palette.Error40
val ErrorContainer = Palette.Error90
val InverseOnSurface = Palette.Neutral95
val InversePrimary = Palette.Primary80
val InverseSurface = Palette.Neutral20
val OnBackground = Palette.Neutral10
- val OnDisabled = Palette.NeutralVariant50
val OnError = Palette.Error100
val OnErrorContainer = Palette.Error10
val OnPrimary = Palette.Primary100
@@ -42,7 +40,6 @@
val PrimaryContainer = Palette.Primary90
val Secondary = Palette.Secondary40
val SecondaryContainer = Palette.Secondary90
- val Shadow = Palette.Neutral0
val Surface = Palette.Neutral99
val SurfaceVariant = Palette.NeutralVariant90
val Tertiary = Palette.Tertiary40
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorSchemeKey.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorSchemeKey.kt
index c2c25da..ad6e665 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorSchemeKey.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ColorSchemeKey.kt
@@ -19,14 +19,12 @@
internal enum class ColorSchemeKey {
Background,
- Disabled,
Error,
ErrorContainer,
InverseOnSurface,
InversePrimary,
InverseSurface,
OnBackground,
- OnDisabled,
OnError,
OnErrorContainer,
OnPrimary,
@@ -46,9 +44,4 @@
SurfaceVariant,
Tertiary,
TertiaryContainer,
- Surface1,
- Surface2,
- Surface3,
- Surface4,
- Surface5,
}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButton.kt
new file mode 100644
index 0000000..1981872
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/ElevatedButton.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object ElevatedButton {
+ val ContainerColor = ColorSchemeKey.Surface
+ val ContainerElevation = Elevation.Level1
+ val ContainerHeight = 40.0.dp
+ val ContainerShape = RoundedCornerShape(20.0.dp)
+ val DisabledContainerColor = ColorSchemeKey.OnSurface
+ val DisabledContainerElevation = Elevation.Level0
+ const val DisabledContainerOpacity = 0.12f
+ val DisabledLabelTextColor = ColorSchemeKey.OnSurface
+ const val DisabledLabelTextOpacity = 0.38f
+ val FocusContainerElevation = Elevation.Level1
+ val HoverContainerElevation = Elevation.Level2
+ val LabelTextColor = ColorSchemeKey.Primary
+ val LabelTextFont = TypographyKey.LabelLarge
+ val PressedContainerElevation = Elevation.Level1
+ val WithIconDisabledIconColor = ColorSchemeKey.OnSurface
+ const val WithIconDisabledIconOpacity = 0.38f
+ val IconColor = ColorSchemeKey.Primary
+ val IconSize = 18.0.dp
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButton.kt
new file mode 100644
index 0000000..0ccc137
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButton.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object FilledButton {
+ val ContainerColor = ColorSchemeKey.Primary
+ val ContainerElevation = Elevation.Level0
+ val ContainerHeight = 40.0.dp
+ val ContainerShape = RoundedCornerShape(20.0.dp)
+ val DisabledContainerColor = ColorSchemeKey.OnSurface
+ val DisabledContainerElevation = Elevation.Level0
+ const val DisabledContainerOpacity = 0.12f
+ val DisabledLabelTextColor = ColorSchemeKey.OnSurface
+ const val DisabledLabelTextOpacity = 0.38f
+ val DraggedContainerElevation = Elevation.Level3
+ val FocusContainerElevation = Elevation.Level0
+ val HoverContainerElevation = Elevation.Level1
+ val LabelTextColor = ColorSchemeKey.OnPrimary
+ val LabelTextFont = TypographyKey.LabelLarge
+ val PressedContainerElevation = Elevation.Level0
+ val DisabledIconColor = ColorSchemeKey.OnSurface
+ const val DisabledIconOpacity = 0.38f
+ val IconColor = ColorSchemeKey.OnPrimary
+ val IconSize = 18.0.dp
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTonal.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTonal.kt
new file mode 100644
index 0000000..4ddd946
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/FilledButtonTonal.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object FilledButtonTonal {
+ val TonalContainerColor = ColorSchemeKey.SecondaryContainer
+ val TonalContainerElevation = Elevation.Level0
+ val TonalContainerHeight = 40.0.dp
+ val TonalContainerShape = RoundedCornerShape(20.0.dp)
+ val TonalDisabledContainerColor = ColorSchemeKey.OnSurface
+ const val TonalDisabledContainerOpacity = 0.12f
+ val TonalDisabledLabelTextColor = ColorSchemeKey.OnSurface
+ const val TonalDisabledLabelTextOpacity = 0.38f
+ val TonalFocusContainerElevation = Elevation.Level0
+ val TonalFocusLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+ val TonalFocusStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+ val TonalHoverContainerElevation = Elevation.Level1
+ val TonalHoverLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+ val TonalHoverStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+ val TonalLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+ val TonalLabelTextFont = TypographyKey.LabelLarge
+ val TonalPressedContainerElevation = Elevation.Level0
+ val TonalPressedLabelTextColor = ColorSchemeKey.OnSecondaryContainer
+ val TonalPressedStateLayerColor = ColorSchemeKey.OnSecondaryContainer
+ val DisabledIconColor = ColorSchemeKey.OnSurface
+ const val DisabledIconOpacity = 0.38f
+ val FocusIconColor = ColorSchemeKey.OnSecondaryContainer
+ val HoverIconColor = ColorSchemeKey.OnSecondaryContainer
+ val IconColor = ColorSchemeKey.OnSecondary
+ val IconSize = 18.0.dp
+ val PressedIconColor = ColorSchemeKey.OnSecondaryContainer
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBar.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBar.kt
new file mode 100644
index 0000000..92bbe5d
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationBar.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object NavigationBar {
+ val ActiveFocusIconColor = ColorSchemeKey.OnSecondary
+ val ActiveFocusLabelTextColor = ColorSchemeKey.OnSurface
+ val ActiveFocusStateLayerColor = ColorSchemeKey.OnSurface
+ val ActiveHoverIconColor = ColorSchemeKey.OnSecondary
+ val ActiveHoverLabelTextColor = ColorSchemeKey.OnSurface
+ val ActiveHoverStateLayerColor = ColorSchemeKey.OnSurface
+ val ActiveIconColor = ColorSchemeKey.OnSecondaryContainer
+ val ActiveIndicatorColor = ColorSchemeKey.SecondaryContainer
+ val ActiveIndicatorHeight = 32.0.dp
+ val ActiveIndicatorShape = RoundedCornerShape(16.0.dp)
+ val ActiveIndicatorWidth = 64.0.dp
+ val ActiveLabelTextColor = ColorSchemeKey.OnSurface
+ val ActivePressedIconColor = ColorSchemeKey.OnSecondary
+ val ActivePressedLabelTextColor = ColorSchemeKey.OnSurface
+ val ActivePressedStateLayerColor = ColorSchemeKey.OnSurface
+ val BadgeColor = ColorSchemeKey.Error
+ val BadgeShape = RoundedCornerShape(3.0.dp)
+ val BadgeSize = 6.0.dp
+ val ContainerColor = ColorSchemeKey.Surface
+ val ContainerElevation = Elevation.Level2
+ val ContainerHeight = 80.0.dp
+ val IconSize = 24.0.dp
+ val InactiveFocusIconColor = ColorSchemeKey.OnSurface
+ val InactiveFocusLabelTextColor = ColorSchemeKey.OnSurface
+ val InactiveFocusStateLayerColor = ColorSchemeKey.OnSurface
+ val InactiveHoverIconColor = ColorSchemeKey.OnSurface
+ val InactiveHoverLabelTextColor = ColorSchemeKey.OnSurface
+ val InactiveHoverStateLayerColor = ColorSchemeKey.OnSurface
+ val InactiveIconColor = ColorSchemeKey.OnSurfaceVariant
+ val InactiveLabelTextColor = ColorSchemeKey.OnSurfaceVariant
+ val InactivePressedIconColor = ColorSchemeKey.OnSurface
+ val InactivePressedLabelTextColor = ColorSchemeKey.OnSurface
+ val InactivePressedStateLayerColor = ColorSchemeKey.OnSurface
+ val LabelTextFont = TypographyKey.LabelMedium
+ val LargeBadgeColor = ColorSchemeKey.Error
+ val LargeBadgeLabelColor = ColorSchemeKey.OnError
+ val LargeBadgeLabelFontFamily = TypographyKey.LabelSmall
+ val LargeBadgeShape = RoundedCornerShape(8.0.dp)
+ val LargeBadgeSize = 16.0.dp
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRail.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRail.kt
new file mode 100644
index 0000000..2d051aa
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/NavigationRail.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object NavigationRail {
+ val ActiveFocusIconColor = ColorSchemeKey.OnSecondary
+ val ActiveFocusLabelTextColor = ColorSchemeKey.OnSurface
+ val ActiveFocusStateLayerColor = ColorSchemeKey.OnSurface
+ val ActiveHoverIconColor = ColorSchemeKey.OnSecondary
+ val ActiveHoverLabelTextColor = ColorSchemeKey.OnSurface
+ val ActiveHoverStateLayerColor = ColorSchemeKey.OnSurface
+ val ActiveIconColor = ColorSchemeKey.OnSecondaryContainer
+ val ActiveIndicatorColor = ColorSchemeKey.SecondaryContainer
+ val ActiveIndicatorHeight = 32.0.dp
+ val ActiveIndicatorShape = RoundedCornerShape(16.0.dp)
+ val ActiveIndicatorWidth = 56.0.dp
+ val ActiveLabelTextColor = ColorSchemeKey.OnSurface
+ val ActivePressedIconColor = ColorSchemeKey.OnSecondary
+ val ActivePressedLabelTextColor = ColorSchemeKey.OnSurface
+ val ActivePressedStateLayerColor = ColorSchemeKey.OnSurface
+ val BadgeColor = ColorSchemeKey.Error
+ val BadgeShape = RoundedCornerShape(3.0.dp)
+ val BadgeSize = 6.0.dp
+ val ContainerColor = ColorSchemeKey.Surface
+ val ContainerElevation = Elevation.Level0
+ val ContainerWidth = 80.0.dp
+ val IconSize = 24.0.dp
+ val InactiveFocusIconColor = ColorSchemeKey.OnSurface
+ val InactiveFocusLabelTextColor = ColorSchemeKey.OnSurface
+ val InactiveFocusStateLayerColor = ColorSchemeKey.OnSurface
+ val InactiveHoverIconColor = ColorSchemeKey.OnSurface
+ val InactiveHoverLabelTextColor = ColorSchemeKey.OnSurface
+ val InactiveHoverStateLayerColor = ColorSchemeKey.OnSurface
+ val InactiveIconColor = ColorSchemeKey.OnSurfaceVariant
+ val InactiveLabelTextColor = ColorSchemeKey.OnSurfaceVariant
+ val InactivePressedIconColor = ColorSchemeKey.OnSurface
+ val InactivePressedLabelTextColor = ColorSchemeKey.OnSurface
+ val InactivePressedStateLayerColor = ColorSchemeKey.OnSurface
+ val LabelTextFont = TypographyKey.LabelMedium
+ val LargeBadgeColor = ColorSchemeKey.Error
+ val LargeBadgeLabelColor = ColorSchemeKey.OnError
+ val LargeBadgeLabelFont = TypographyKey.LabelSmall
+ val LargeBadgeShape = RoundedCornerShape(8.0.dp)
+ val LargeBadgeSize = 16.0.dp
+ val MenuFocusIconColor = ColorSchemeKey.OnSurface
+ val MenuFocusStateLayerColor = ColorSchemeKey.OnSurface
+ val MenuHoverIconColor = ColorSchemeKey.OnSurface
+ val MenuHoverStateLayerColor = ColorSchemeKey.OnSurface
+ val MenuIconColor = ColorSchemeKey.OnSurfaceVariant
+ val MenuIconSize = 24.0.dp
+ val MenuPressedIconColor = ColorSchemeKey.OnSurface
+ val MenuPressedStateLayerColor = ColorSchemeKey.OnSurface
+ val NoLabelActiveIndicatorHeight = 56.0.dp
+ val NoLabelActiveIndicatorShape = RoundedCornerShape(28.0.dp)
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButton.kt
new file mode 100644
index 0000000..fafb7a6
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/OutlinedButton.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object OutlinedButton {
+ val ContainerElevation = Elevation.Level0
+ val ContainerHeight = 40.0.dp
+ val ContainerShape = RoundedCornerShape(20.0.dp)
+ val DisabledLabelTextColor = ColorSchemeKey.OnSurface
+ const val DisabledLabelTextOpacity = 0.38f
+ val DisabledOutlineColor = ColorSchemeKey.OnSurface
+ const val DisabledOutlineOpacity = 0.12f
+ val FocusLabelTextColor = ColorSchemeKey.Primary
+ val FocusOutlineColor = ColorSchemeKey.Primary
+ val FocusStateLayerColor = ColorSchemeKey.Primary
+ val HoverLabelTextColor = ColorSchemeKey.Primary
+ val HoverOutlineColor = ColorSchemeKey.Outline
+ val HoverStateLayerColor = ColorSchemeKey.Primary
+ val LabelTextColor = ColorSchemeKey.Primary
+ val LabelTextFont = TypographyKey.LabelLarge
+ val OutlineColor = ColorSchemeKey.Outline
+ val OutlineWidth = 1.0.dp
+ val PressedLabelTextColor = ColorSchemeKey.Primary
+ val PressedOutlineColor = ColorSchemeKey.Outline
+ val PressedStateLayerColor = ColorSchemeKey.Primary
+ val DisabledIconColor = ColorSchemeKey.OnSurface
+ const val DisabledIconOpacity = 0.38f
+ val FocusIconColor = ColorSchemeKey.Primary
+ val HoverIconColor = ColorSchemeKey.Primary
+ val IconColor = ColorSchemeKey.Primary
+ val IconSize = 18.0.dp
+ val PressedIconColor = ColorSchemeKey.Primary
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButton.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButton.kt
new file mode 100644
index 0000000..1281bc74
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TextButton.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object TextButton {
+ val ContainerElevation = Elevation.Level0
+ val ContainerHeight = 40.0.dp
+ val ContainerShape = RoundedCornerShape(20.0.dp)
+ val DisabledContainerColor = ColorSchemeKey.OnSurface
+ const val DisabledContainerOpacity = 0.12f
+ val DisabledLabelTextColor = ColorSchemeKey.OnSurface
+ const val DisabledLabelTextOpacity = 0.38f
+ val FocusLabelTextColor = ColorSchemeKey.Primary
+ val FocusStateLayerColor = ColorSchemeKey.Primary
+ val HoverLabelTextColor = ColorSchemeKey.Primary
+ val HoverStateLayerColor = ColorSchemeKey.Primary
+ val LabelTextColor = ColorSchemeKey.Primary
+ val LabelTextFont = TypographyKey.LabelLarge
+ val PressedLabelTextColor = ColorSchemeKey.Primary
+ val PressedStateLayerColor = ColorSchemeKey.Primary
+ val DisabledIconColor = ColorSchemeKey.OnSurface
+ const val DisabledIconOpacity = 0.38f
+ val FocusIconColor = ColorSchemeKey.Primary
+ val HoverIconColor = ColorSchemeKey.Primary
+ val IconColor = ColorSchemeKey.Primary
+ val IconSize = 18.0.dp
+ val PressedIconColor = ColorSchemeKey.Primary
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLarge.kt
similarity index 60%
copy from compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
copy to compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLarge.kt
index 7d09b6d..c1b7f61 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarLarge.kt
@@ -17,11 +17,16 @@
package androidx.compose.material3.tokens
-import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.ui.unit.dp
-internal object Shape {
- val Large = RoundedCornerShape(8.0.dp)
- val Medium = RoundedCornerShape(8.0.dp)
- val Small = RoundedCornerShape(4.0.dp)
+internal object TopAppBarLarge {
+ val LargeContainerColor = ColorSchemeKey.Surface
+ val LargeContainerElevation = Elevation.Level0
+ val LargeContainerHeight = 152.0.dp
+ val LargeHeadlineColor = ColorSchemeKey.OnSurface
+ val LargeHeadlineFont = TypographyKey.HeadlineMedium
+ val LargeLeadingIconColor = ColorSchemeKey.OnSurface
+ val LargeLeadingIconSize = 24.0.dp
+ val LargeTrailingIconColor = ColorSchemeKey.OnSurfaceVariant
+ val LargeTrailingIconSize = 24.0.dp
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMedium.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMedium.kt
new file mode 100644
index 0000000..106bcd2
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarMedium.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.ui.unit.dp
+
+internal object TopAppBarMedium {
+ val MediumContainerColor = ColorSchemeKey.Surface
+ val MediumContainerElevation = Elevation.Level0
+ val MediumContainerHeight = 112.0.dp
+ val MediumHeadlineColor = ColorSchemeKey.OnSurface
+ val MediumHeadlineFont = TypographyKey.HeadlineSmall
+ val MediumLeadingIconColor = ColorSchemeKey.OnSurface
+ val MediumLeadingIconSize = 24.0.dp
+ val MediumTrailingIconColor = ColorSchemeKey.OnSurfaceVariant
+ val MediumTrailingIconSize = 24.0.dp
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmall.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmall.kt
new file mode 100644
index 0000000..215f9dc
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmall.kt
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.ui.unit.dp
+
+internal object TopAppBarSmall {
+ val SmallContainerColor = ColorSchemeKey.Surface
+ val SmallContainerElevation = Elevation.Level0
+ val SmallContainerHeight = 64.0.dp
+ val SmallHeadlineColor = ColorSchemeKey.OnSurface
+ val SmallHeadlineFont = TypographyKey.TitleLarge
+ val SmallLeadingIconColor = ColorSchemeKey.OnSurface
+ val SmallLeadingIconSize = 24.0.dp
+ val SmallOnScrollContainerElevation = Elevation.Level2
+ val SmallTrailingIconColor = ColorSchemeKey.OnSurfaceVariant
+ val SmallTrailingIconSize = 24.0.dp
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCentered.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCentered.kt
new file mode 100644
index 0000000..4c4f433
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TopAppBarSmallCentered.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.foundation.shape.RoundedCornerShape
+import androidx.compose.ui.unit.dp
+
+internal object TopAppBarSmallCentered {
+ val SmallCenteredAvatarShape = RoundedCornerShape(15.0.dp)
+ val SmallCenteredAvatarSize = 30.0.dp
+ val SmallCenteredContainerColor = ColorSchemeKey.Surface
+ val SmallCenteredContainerElevation = Elevation.Level0
+ val SmallCenteredContainerHeight = 64.0.dp
+ val SmallCenteredHeadlineColor = ColorSchemeKey.OnSurface
+ val SmallCenteredHeadlineFont = TypographyKey.TitleLarge
+ val SmallCenteredLeadingIconColor = ColorSchemeKey.OnSurface
+ val SmallCenteredLeadingIconSize = 24.0.dp
+ val SmallCenteredOnScrollContainerElevation = Elevation.Level2
+ val SmallCenteredTrailingIconColor = ColorSchemeKey.OnSurfaceVariant
+ val SmallCenteredTrailingIconSize = 24.0.dp
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScale.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScale.kt
index f2092fa..654de64 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScale.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypeScale.kt
@@ -21,78 +21,78 @@
internal object TypeScale {
val BodyLargeFont = Typeface.PlainRegular
- val BodyLargeLineHeightPoints = 24.0.sp
- val BodyLargeSizePoints = 16.sp
- val BodyLargeTrackingPoints = 0.5.sp
+ val BodyLargeLineHeight = 24.0.sp
+ val BodyLargeSize = 16.sp
+ val BodyLargeTracking = 0.5.sp
val BodyLargeWeight = Typeface.WeightRegular
val BodyMediumFont = Typeface.PlainRegular
- val BodyMediumLineHeightPoints = 20.0.sp
- val BodyMediumSizePoints = 14.sp
- val BodyMediumTrackingPoints = 0.2.sp
+ val BodyMediumLineHeight = 20.0.sp
+ val BodyMediumSize = 14.sp
+ val BodyMediumTracking = 0.2.sp
val BodyMediumWeight = Typeface.WeightRegular
val BodySmallFont = Typeface.PlainRegular
- val BodySmallLineHeightPoints = 16.0.sp
- val BodySmallSizePoints = 12.sp
- val BodySmallTrackingPoints = 0.4.sp
+ val BodySmallLineHeight = 16.0.sp
+ val BodySmallSize = 12.sp
+ val BodySmallTracking = 0.4.sp
val BodySmallWeight = Typeface.WeightRegular
val DisplayLargeFont = Typeface.BrandRegular
- val DisplayLargeLineHeightPoints = 64.0.sp
- val DisplayLargeSizePoints = 57.sp
- val DisplayLargeTrackingPoints = -0.2.sp
+ val DisplayLargeLineHeight = 64.0.sp
+ val DisplayLargeSize = 57.sp
+ val DisplayLargeTracking = -0.2.sp
val DisplayLargeWeight = Typeface.WeightRegular
val DisplayMediumFont = Typeface.BrandRegular
- val DisplayMediumLineHeightPoints = 52.0.sp
- val DisplayMediumSizePoints = 45.sp
- val DisplayMediumTrackingPoints = 0.0.sp
+ val DisplayMediumLineHeight = 52.0.sp
+ val DisplayMediumSize = 45.sp
+ val DisplayMediumTracking = 0.0.sp
val DisplayMediumWeight = Typeface.WeightRegular
val DisplaySmallFont = Typeface.BrandRegular
- val DisplaySmallLineHeightPoints = 44.0.sp
- val DisplaySmallSizePoints = 36.sp
- val DisplaySmallTrackingPoints = 0.0.sp
+ val DisplaySmallLineHeight = 44.0.sp
+ val DisplaySmallSize = 36.sp
+ val DisplaySmallTracking = 0.0.sp
val DisplaySmallWeight = Typeface.WeightRegular
val HeadlineLargeFont = Typeface.BrandRegular
- val HeadlineLargeLineHeightPoints = 40.0.sp
- val HeadlineLargeSizePoints = 32.sp
- val HeadlineLargeTrackingPoints = 0.0.sp
+ val HeadlineLargeLineHeight = 40.0.sp
+ val HeadlineLargeSize = 32.sp
+ val HeadlineLargeTracking = 0.0.sp
val HeadlineLargeWeight = Typeface.WeightRegular
val HeadlineMediumFont = Typeface.BrandRegular
- val HeadlineMediumLineHeightPoints = 36.0.sp
- val HeadlineMediumSizePoints = 28.sp
- val HeadlineMediumTrackingPoints = 0.0.sp
+ val HeadlineMediumLineHeight = 36.0.sp
+ val HeadlineMediumSize = 28.sp
+ val HeadlineMediumTracking = 0.0.sp
val HeadlineMediumWeight = Typeface.WeightRegular
val HeadlineSmallFont = Typeface.BrandRegular
- val HeadlineSmallLineHeightPoints = 32.0.sp
- val HeadlineSmallSizePoints = 24.sp
- val HeadlineSmallTrackingPoints = 0.0.sp
+ val HeadlineSmallLineHeight = 32.0.sp
+ val HeadlineSmallSize = 24.sp
+ val HeadlineSmallTracking = 0.0.sp
val HeadlineSmallWeight = Typeface.WeightRegular
val LabelLargeFont = Typeface.PlainMedium
- val LabelLargeLineHeightPoints = 20.0.sp
- val LabelLargeSizePoints = 14.sp
- val LabelLargeTrackingPoints = 0.1.sp
+ val LabelLargeLineHeight = 20.0.sp
+ val LabelLargeSize = 14.sp
+ val LabelLargeTracking = 0.1.sp
val LabelLargeWeight = Typeface.WeightMedium
val LabelMediumFont = Typeface.PlainMedium
- val LabelMediumLineHeightPoints = 16.0.sp
- val LabelMediumSizePoints = 12.sp
- val LabelMediumTrackingPoints = 0.5.sp
+ val LabelMediumLineHeight = 16.0.sp
+ val LabelMediumSize = 12.sp
+ val LabelMediumTracking = 0.5.sp
val LabelMediumWeight = Typeface.WeightMedium
val LabelSmallFont = Typeface.PlainMedium
- val LabelSmallLineHeightPoints = 16.0.sp
- val LabelSmallSizePoints = 11.sp
- val LabelSmallTrackingPoints = 0.5.sp
+ val LabelSmallLineHeight = 16.0.sp
+ val LabelSmallSize = 11.sp
+ val LabelSmallTracking = 0.5.sp
val LabelSmallWeight = Typeface.WeightMedium
val TitleLargeFont = Typeface.BrandRegular
- val TitleLargeLineHeightPoints = 28.0.sp
- val TitleLargeSizePoints = 22.sp
- val TitleLargeTrackingPoints = 0.0.sp
+ val TitleLargeLineHeight = 28.0.sp
+ val TitleLargeSize = 22.sp
+ val TitleLargeTracking = 0.0.sp
val TitleLargeWeight = Typeface.WeightRegular
val TitleMediumFont = Typeface.PlainMedium
- val TitleMediumLineHeightPoints = 24.0.sp
- val TitleMediumSizePoints = 16.sp
- val TitleMediumTrackingPoints = 0.2.sp
+ val TitleMediumLineHeight = 24.0.sp
+ val TitleMediumSize = 16.sp
+ val TitleMediumTracking = 0.2.sp
val TitleMediumWeight = Typeface.WeightMedium
val TitleSmallFont = Typeface.PlainMedium
- val TitleSmallLineHeightPoints = 20.0.sp
- val TitleSmallSizePoints = 14.sp
- val TitleSmallTrackingPoints = 0.1.sp
+ val TitleSmallLineHeight = 20.0.sp
+ val TitleSmallSize = 14.sp
+ val TitleSmallTracking = 0.1.sp
val TitleSmallWeight = Typeface.WeightMedium
}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typeface.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typeface.kt
index 06b1d9f..631525b 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typeface.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typeface.kt
@@ -21,12 +21,10 @@
import androidx.compose.ui.text.font.FontWeight
internal object Typeface {
- val BrandDisplayRegular = FontFamily.SansSerif
val BrandMedium = FontFamily.SansSerif
val BrandRegular = FontFamily.SansSerif
val PlainMedium = FontFamily.SansSerif
val PlainRegular = FontFamily.SansSerif
-
val WeightBold = FontWeight.Bold
val WeightMedium = FontWeight.Medium
val WeightRegular = FontWeight.Normal
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typography.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typography.kt
new file mode 100644
index 0000000..8e943a5
--- /dev/null
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Typography.kt
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+// GENERATED CODE - DO NOT MODIFY BY HAND
+
+package androidx.compose.material3.tokens
+
+import androidx.compose.ui.text.TextStyle
+
+internal object Typography {
+ val BodyLarge = TextStyle(
+ fontFamily = TypeScale.BodyLargeFont,
+ fontWeight = TypeScale.BodyLargeWeight,
+ fontSize = TypeScale.BodyLargeSize,
+ lineHeight = TypeScale.BodyLargeLineHeight,
+ letterSpacing = TypeScale.BodyLargeTracking,
+ )
+ val BodyMedium = TextStyle(
+ fontFamily = TypeScale.BodyMediumFont,
+ fontWeight = TypeScale.BodyMediumWeight,
+ fontSize = TypeScale.BodyMediumSize,
+ lineHeight = TypeScale.BodyMediumLineHeight,
+ letterSpacing = TypeScale.BodyMediumTracking,
+ )
+ val BodySmall = TextStyle(
+ fontFamily = TypeScale.BodySmallFont,
+ fontWeight = TypeScale.BodySmallWeight,
+ fontSize = TypeScale.BodySmallSize,
+ lineHeight = TypeScale.BodySmallLineHeight,
+ letterSpacing = TypeScale.BodySmallTracking,
+ )
+ val DisplayLarge = TextStyle(
+ fontFamily = TypeScale.DisplayLargeFont,
+ fontWeight = TypeScale.DisplayLargeWeight,
+ fontSize = TypeScale.DisplayLargeSize,
+ lineHeight = TypeScale.DisplayLargeLineHeight,
+ letterSpacing = TypeScale.DisplayLargeTracking,
+ )
+ val DisplayMedium = TextStyle(
+ fontFamily = TypeScale.DisplayMediumFont,
+ fontWeight = TypeScale.DisplayMediumWeight,
+ fontSize = TypeScale.DisplayMediumSize,
+ lineHeight = TypeScale.DisplayMediumLineHeight,
+ letterSpacing = TypeScale.DisplayMediumTracking,
+ )
+ val DisplaySmall = TextStyle(
+ fontFamily = TypeScale.DisplaySmallFont,
+ fontWeight = TypeScale.DisplaySmallWeight,
+ fontSize = TypeScale.DisplaySmallSize,
+ lineHeight = TypeScale.DisplaySmallLineHeight,
+ letterSpacing = TypeScale.DisplaySmallTracking,
+ )
+ val HeadlineLarge = TextStyle(
+ fontFamily = TypeScale.HeadlineLargeFont,
+ fontWeight = TypeScale.HeadlineLargeWeight,
+ fontSize = TypeScale.HeadlineLargeSize,
+ lineHeight = TypeScale.HeadlineLargeLineHeight,
+ letterSpacing = TypeScale.HeadlineLargeTracking,
+ )
+ val HeadlineMedium = TextStyle(
+ fontFamily = TypeScale.HeadlineMediumFont,
+ fontWeight = TypeScale.HeadlineMediumWeight,
+ fontSize = TypeScale.HeadlineMediumSize,
+ lineHeight = TypeScale.HeadlineMediumLineHeight,
+ letterSpacing = TypeScale.HeadlineMediumTracking,
+ )
+ val HeadlineSmall = TextStyle(
+ fontFamily = TypeScale.HeadlineSmallFont,
+ fontWeight = TypeScale.HeadlineSmallWeight,
+ fontSize = TypeScale.HeadlineSmallSize,
+ lineHeight = TypeScale.HeadlineSmallLineHeight,
+ letterSpacing = TypeScale.HeadlineSmallTracking,
+ )
+ val LabelLarge = TextStyle(
+ fontFamily = TypeScale.LabelLargeFont,
+ fontWeight = TypeScale.LabelLargeWeight,
+ fontSize = TypeScale.LabelLargeSize,
+ lineHeight = TypeScale.LabelLargeLineHeight,
+ letterSpacing = TypeScale.LabelLargeTracking,
+ )
+ val LabelMedium = TextStyle(
+ fontFamily = TypeScale.LabelMediumFont,
+ fontWeight = TypeScale.LabelMediumWeight,
+ fontSize = TypeScale.LabelMediumSize,
+ lineHeight = TypeScale.LabelMediumLineHeight,
+ letterSpacing = TypeScale.LabelMediumTracking,
+ )
+ val LabelSmall = TextStyle(
+ fontFamily = TypeScale.LabelSmallFont,
+ fontWeight = TypeScale.LabelSmallWeight,
+ fontSize = TypeScale.LabelSmallSize,
+ lineHeight = TypeScale.LabelSmallLineHeight,
+ letterSpacing = TypeScale.LabelSmallTracking,
+ )
+ val TitleLarge = TextStyle(
+ fontFamily = TypeScale.TitleLargeFont,
+ fontWeight = TypeScale.TitleLargeWeight,
+ fontSize = TypeScale.TitleLargeSize,
+ lineHeight = TypeScale.TitleLargeLineHeight,
+ letterSpacing = TypeScale.TitleLargeTracking,
+ )
+ val TitleMedium = TextStyle(
+ fontFamily = TypeScale.TitleMediumFont,
+ fontWeight = TypeScale.TitleMediumWeight,
+ fontSize = TypeScale.TitleMediumSize,
+ lineHeight = TypeScale.TitleMediumLineHeight,
+ letterSpacing = TypeScale.TitleMediumTracking,
+ )
+ val TitleSmall = TextStyle(
+ fontFamily = TypeScale.TitleSmallFont,
+ fontWeight = TypeScale.TitleSmallWeight,
+ fontSize = TypeScale.TitleSmallSize,
+ lineHeight = TypeScale.TitleSmallLineHeight,
+ letterSpacing = TypeScale.TitleSmallTracking,
+ )
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKey.kt
similarity index 70%
rename from compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
rename to compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKey.kt
index 7d09b6d..933fdd3 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
+++ b/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/TypographyKey.kt
@@ -17,11 +17,20 @@
package androidx.compose.material3.tokens
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.unit.dp
-
-internal object Shape {
- val Large = RoundedCornerShape(8.0.dp)
- val Medium = RoundedCornerShape(8.0.dp)
- val Small = RoundedCornerShape(4.0.dp)
+internal enum class TypographyKey {
+ BodyLarge,
+ BodyMedium,
+ BodySmall,
+ DisplayLarge,
+ DisplayMedium,
+ DisplaySmall,
+ HeadlineLarge,
+ HeadlineMedium,
+ HeadlineSmall,
+ LabelLarge,
+ LabelMedium,
+ LabelSmall,
+ TitleLarge,
+ TitleMedium,
+ TitleSmall,
}
diff --git a/compose/runtime/runtime-livedata/build.gradle b/compose/runtime/runtime-livedata/build.gradle
index 0ae4cea..2742f61 100644
--- a/compose/runtime/runtime-livedata/build.gradle
+++ b/compose/runtime/runtime-livedata/build.gradle
@@ -39,6 +39,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(projectOrArtifact(":compose:runtime:runtime-livedata:runtime-livedata-samples"))
}
androidx {
diff --git a/compose/runtime/runtime-rxjava2/build.gradle b/compose/runtime/runtime-rxjava2/build.gradle
index 0b781ff..98b9cf0 100644
--- a/compose/runtime/runtime-rxjava2/build.gradle
+++ b/compose/runtime/runtime-rxjava2/build.gradle
@@ -38,6 +38,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(projectOrArtifact(":compose:runtime:runtime-rxjava2:runtime-rxjava2-samples"))
}
androidx {
diff --git a/compose/runtime/runtime-rxjava3/build.gradle b/compose/runtime/runtime-rxjava3/build.gradle
index f63fc46..21ed40a 100644
--- a/compose/runtime/runtime-rxjava3/build.gradle
+++ b/compose/runtime/runtime-rxjava3/build.gradle
@@ -38,6 +38,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(projectOrArtifact(":compose:runtime:runtime-rxjava3:runtime-rxjava3-samples"))
}
androidx {
diff --git a/compose/runtime/runtime-saveable/build.gradle b/compose/runtime/runtime-saveable/build.gradle
index b88b9e0..54d6c7e 100644
--- a/compose/runtime/runtime-saveable/build.gradle
+++ b/compose/runtime/runtime-saveable/build.gradle
@@ -59,6 +59,8 @@
androidTestImplementation(libs.mockitoCore)
lintPublish(project(":compose:runtime:runtime-saveable-lint"))
+
+ samples(projectOrArtifact(":compose:runtime:runtime-saveable:runtime-saveable-samples"))
}
}
diff --git a/compose/runtime/runtime/api/current.txt b/compose/runtime/runtime/api/current.txt
index 13fa4c7..7d8cb00 100644
--- a/compose/runtime/runtime/api/current.txt
+++ b/compose/runtime/runtime/api/current.txt
@@ -301,13 +301,15 @@
method public void cancel();
method public void close();
method public long getChangeCount();
+ method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
method public boolean getHasPendingWork();
- method public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+ method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
property public final long changeCount;
+ property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
property public final boolean hasPendingWork;
- property public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+ property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
field public static final androidx.compose.runtime.Recomposer.Companion Companion;
}
diff --git a/compose/runtime/runtime/api/public_plus_experimental_current.txt b/compose/runtime/runtime/api/public_plus_experimental_current.txt
index b2c5255..2936a7aa 100644
--- a/compose/runtime/runtime/api/public_plus_experimental_current.txt
+++ b/compose/runtime/runtime/api/public_plus_experimental_current.txt
@@ -318,14 +318,16 @@
method public void cancel();
method public void close();
method public long getChangeCount();
+ method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
method public boolean getHasPendingWork();
- method public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+ method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method @androidx.compose.runtime.ExperimentalComposeApi public suspend Object? runRecomposeConcurrentlyAndApplyChanges(kotlin.coroutines.CoroutineContext recomposeCoroutineContext, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
property public final long changeCount;
+ property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
property public final boolean hasPendingWork;
- property public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+ property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
field public static final androidx.compose.runtime.Recomposer.Companion Companion;
}
diff --git a/compose/runtime/runtime/api/restricted_current.txt b/compose/runtime/runtime/api/restricted_current.txt
index cb3b5bd..a007eed 100644
--- a/compose/runtime/runtime/api/restricted_current.txt
+++ b/compose/runtime/runtime/api/restricted_current.txt
@@ -327,13 +327,15 @@
method public void cancel();
method public void close();
method public long getChangeCount();
+ method public kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> getCurrentState();
method public boolean getHasPendingWork();
- method public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
+ method @Deprecated public kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> getState();
method public suspend Object? join(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method public suspend Object? runRecomposeAndApplyChanges(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
property public final long changeCount;
+ property public final kotlinx.coroutines.flow.StateFlow<androidx.compose.runtime.Recomposer.State> currentState;
property public final boolean hasPendingWork;
- property public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
+ property @Deprecated public final kotlinx.coroutines.flow.Flow<androidx.compose.runtime.Recomposer.State> state;
field public static final androidx.compose.runtime.Recomposer.Companion Companion;
}
diff --git a/compose/runtime/runtime/build.gradle b/compose/runtime/runtime/build.gradle
index 4a85e73..f3fa175 100644
--- a/compose/runtime/runtime/build.gradle
+++ b/compose/runtime/runtime/build.gradle
@@ -56,6 +56,8 @@
lintChecks(projectOrArtifact(":compose:runtime:runtime-lint"))
lintPublish(projectOrArtifact(":compose:runtime:runtime-lint"))
+
+ samples(projectOrArtifact(":compose:runtime:runtime:runtime-samples"))
}
}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
index 1a0e7f6..a7132b2 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/ComposeVersion.kt
@@ -28,5 +28,5 @@
* IMPORTANT: Whenever updating this value, please make sure to also update `versionTable` and
* `minimumRuntimeVersionInt` in `VersionChecker.kt` of the compiler.
*/
- const val version: Int = 4400
+ const val version: Int = 4500
}
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
index 9c9a6cc..871a8dc 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/Recomposer.kt
@@ -78,6 +78,8 @@
/**
* The current [State] of the [Recomposer]. See each [State] value for its meaning.
*/
+ // TODO: Mirror the currentState/StateFlow API change here once we can safely add
+ // default interface methods. https://youtrack.jetbrains.com/issue/KT-47000
val state: Flow<Recomposer.State>
/**
@@ -288,14 +290,21 @@
/**
* The current [State] of this [Recomposer]. See each [State] value for its meaning.
*/
+ @Deprecated("Replaced by currentState as a StateFlow", ReplaceWith("currentState"))
public val state: Flow<State>
+ get() = currentState
+
+ /**
+ * The current [State] of this [Recomposer], available synchronously.
+ */
+ public val currentState: StateFlow<State>
get() = _state
// A separate private object to avoid the temptation of casting a RecomposerInfo
// to a Recomposer if Recomposer itself were to implement RecomposerInfo.
private inner class RecomposerInfoImpl : RecomposerInfo {
override val state: Flow<State>
- get() = this@Recomposer.state
+ get() = this@Recomposer.currentState
override val hasPendingWork: Boolean
get() = this@Recomposer.hasPendingWork
override val changeCount: Long
@@ -686,14 +695,26 @@
}
/**
- * Permanently shut down this [Recomposer] for future use. All ongoing recompositions will stop,
- * new composer invalidations with this [Recomposer] at the root will no longer occur,
- * and any [LaunchedEffect]s currently running in compositions managed by this [Recomposer]
- * will be cancelled. Any [rememberCoroutineScope] scopes from compositions managed by this
- * [Recomposer] will also be cancelled. See [join] to await the completion of all of these
- * outstanding tasks.
+ * Permanently shut down this [Recomposer] for future use. [currentState] will immediately
+ * reflect [State.ShuttingDown] (or a lower state) before this call returns.
+ * All ongoing recompositions will stop, new composer invalidations with this [Recomposer] at
+ * the root will no longer occur, and any [LaunchedEffect]s currently running in compositions
+ * managed by this [Recomposer] will be cancelled. Any [rememberCoroutineScope] scopes from
+ * compositions managed by this [Recomposer] will also be cancelled. See [join] to await the
+ * completion of all of these outstanding tasks.
*/
fun cancel() {
+ // Move to State.ShuttingDown immediately rather than waiting for effectJob to join
+ // if we're cancelling to shut down the Recomposer. This permits other client code
+ // to use `state.first { it < State.Idle }` or similar to reliably and immediately detect
+ // that the recomposer can no longer be used.
+ // It looks like a CAS loop would be more appropriate here, but other occurrences
+ // of taking stateLock assume that the state cannot change without holding it.
+ synchronized(stateLock) {
+ if (_state.value >= State.Idle) {
+ _state.value = State.ShuttingDown
+ }
+ }
effectJob.cancel()
}
@@ -715,7 +736,7 @@
* Await the completion of a [cancel] operation.
*/
suspend fun join() {
- state.first { it == State.ShutDown }
+ currentState.first { it == State.ShutDown }
}
internal override fun composeInitial(
@@ -834,7 +855,7 @@
* and this method will not suspend.
*/
suspend fun awaitIdle() {
- state.takeWhile { it > State.Idle }.collect()
+ currentState.takeWhile { it > State.Idle }.collect()
}
// Recomposer always starts with a constant compound hash
diff --git a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
index db17a59..b2dcb4e 100644
--- a/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
+++ b/compose/runtime/runtime/src/commonMain/kotlin/androidx/compose/runtime/snapshots/Snapshot.kt
@@ -1064,7 +1064,7 @@
}
override fun recordModified(state: StateObject) {
- error("Cannot modify a state object in a read-only snapshot")
+ reportReadonlySnapshotWrite()
}
}
@@ -1106,7 +1106,7 @@
override val modified: HashSet<StateObject>? get() = null
override val writeObserver: ((Any) -> Unit)? get() = null
- override fun recordModified(state: StateObject) = parent.recordModified(state)
+ override fun recordModified(state: StateObject) = reportReadonlySnapshotWrite()
override fun nestedDeactivated(snapshot: Snapshot) = unsupported()
override fun nestedActivated(snapshot: Snapshot) = unsupported()
@@ -1750,6 +1750,10 @@
return result
}
+private fun reportReadonlySnapshotWrite(): Nothing {
+ error("Cannot modify a state object in a read-only snapshot")
+}
+
/**
* Returns the current record without notifying any read observers.
*/
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/RecomposerTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/RecomposerTests.kt
index 845e672..788103c 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/RecomposerTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/RecomposerTests.kt
@@ -23,10 +23,12 @@
import androidx.compose.runtime.mock.expectNoChanges
import androidx.compose.runtime.snapshots.Snapshot
import kotlinx.coroutines.CoroutineName
+import kotlinx.coroutines.CoroutineStart
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.Job
import kotlinx.coroutines.ObsoleteCoroutinesApi
+import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
@@ -83,7 +85,7 @@
Snapshot.withMutableSnapshot { state = 2 }
assertNotNull(
withTimeoutOrNull(3_000) {
- recomposer.state.first { it <= Recomposer.State.PendingWork }
+ recomposer.currentState.first { it <= Recomposer.State.PendingWork }
},
"timed out waiting for recomposer to not have active pending work"
)
@@ -115,7 +117,11 @@
withTimeoutOrNull(5_000) { recomposer.join() },
"Expected recomposer join"
)
- assertEquals(Recomposer.State.ShutDown, recomposer.state.first(), "recomposer state")
+ assertEquals(
+ Recomposer.State.ShutDown,
+ recomposer.currentState.first(),
+ "recomposer state"
+ )
assertNotNull(
withTimeoutOrNull(5_000) { runner.join() },
"Expected runner join"
@@ -394,6 +400,31 @@
"child did not inherit parent recomposeCoroutineContext"
)
}
+
+ @Test
+ fun recomposerCancelReportsShuttingDownImmediately() = runBlocking(AutoTestFrameClock()) {
+ val recomposer = Recomposer(coroutineContext)
+ launch(start = CoroutineStart.UNDISPATCHED) {
+ recomposer.runRecomposeAndApplyChanges()
+ }
+
+ // Create a composition with a LaunchedEffect that will need to be resumed for cancellation
+ // before the recomposer can fully join.
+ Composition(UnitApplier(), recomposer).setContent {
+ LaunchedEffect(Unit) {
+ awaitCancellation()
+ }
+ }
+
+ recomposer.cancel()
+ // runBlocking will not dispatch resumed continuations for cancellation yet;
+ // read the current state immediately.
+ val state = recomposer.currentState.value
+ assertTrue(
+ state <= Recomposer.State.ShuttingDown,
+ "recomposer state $state but expected <= ShuttingDown"
+ )
+ }
}
private class UnitApplier : Applier<Unit> {
diff --git a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
index 6ec7593..14bf4b8 100644
--- a/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
+++ b/compose/runtime/runtime/src/test/kotlin/androidx/compose/runtime/snapshots/SnapshotTests.kt
@@ -724,6 +724,29 @@
assertEquals(0, state.value)
}
+ // Regression test for b/199921314
+ // This test lifted directly from the bug reported by chrnie@foxmail.com, modified and formatted
+ // to avoid lint warnings.
+ @Test(expected = IllegalStateException::class)
+ fun testTakeSnapshotNested() {
+ Snapshot.withMutableSnapshot {
+ val expectReadonlySnapshot = Snapshot.takeSnapshot()
+ try {
+ expectReadonlySnapshot.enter {
+ var state by mutableStateOf(0)
+
+ // expect throw IllegalStateException:Cannot modify a state object in a
+ // read-only snapshot
+ state = 1
+
+ assertEquals(1, state)
+ }
+ } finally {
+ expectReadonlySnapshot.dispose()
+ }
+ }
+ }
+
private var count = 0
@BeforeTest
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
similarity index 64%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
index 2ab52fb..933f5aaf 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/compose/test-utils/src/commonMain/kotlin/androidx/compose/testutils/ModifierTestUtils.kt
@@ -14,7 +14,14 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.compose.testutils
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import android.annotation.SuppressLint
+import androidx.compose.ui.Modifier
+
+fun Modifier.toList(): List<Modifier.Element> =
+ foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
+
+@SuppressLint("ModifierFactoryReturnType")
+fun Modifier.first(): Modifier.Element =
+ toList().first()
diff --git a/compose/ui/ui-graphics/build.gradle b/compose/ui/ui-graphics/build.gradle
index 43f2863..a2690fc 100644
--- a/compose/ui/ui-graphics/build.gradle
+++ b/compose/ui/ui-graphics/build.gradle
@@ -56,6 +56,8 @@
androidTestImplementation(libs.truth)
lintPublish(project(":compose:ui:ui-graphics-lint"))
+
+ samples(projectOrArtifact(":compose:ui:ui-graphics:ui-graphics-samples"))
}
}
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
index 14f77ec..5e79774 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidPath.android.kt
@@ -23,7 +23,7 @@
actual fun Path(): Path = AndroidPath()
/**
- * Convert the [android.graphics.Path] instance into a compose compatible Path
+ * Convert the [android.graphics.Path] instance into a Compose-compatible Path
*/
fun android.graphics.Path.asComposePath(): Path = AndroidPath(this)
diff --git a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt
index 82ee794..efa9067 100644
--- a/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt
+++ b/compose/ui/ui-graphics/src/androidMain/kotlin/androidx/compose/ui/graphics/AndroidRenderEffect.android.kt
@@ -22,7 +22,7 @@
import androidx.compose.ui.geometry.Offset
/**
- * Convert the [android.graphics.RenderEffect] instance into a compose compatible [RenderEffect]
+ * Convert the [android.graphics.RenderEffect] instance into a Compose-compatible [RenderEffect]
*/
fun android.graphics.RenderEffect.asComposeRenderEffect(): RenderEffect =
AndroidRenderEffect(this)
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
index 5fe9454..c5fb5ce 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopCanvas.desktop.kt
@@ -18,7 +18,6 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
-import androidx.compose.ui.geometry.RoundRect
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
@@ -30,7 +29,6 @@
import org.jetbrains.skia.Matrix44
import org.jetbrains.skia.MipmapMode
import org.jetbrains.skia.SamplingMode
-import org.jetbrains.skia.impl.getPtr
import org.jetbrains.skia.ClipMode as SkiaClipMode
import org.jetbrains.skia.RRect as SkiaRRect
import org.jetbrains.skia.Rect as SkiaRect
@@ -38,16 +36,21 @@
actual typealias NativeCanvas = org.jetbrains.skia.Canvas
internal actual fun ActualCanvas(image: ImageBitmap): Canvas {
- val skiaBitmap = image.asDesktopBitmap()
+ val skiaBitmap = image.asSkiaBitmap()
require(!skiaBitmap.isImmutable) {
"Cannot draw on immutable ImageBitmap"
}
return DesktopCanvas(org.jetbrains.skia.Canvas(skiaBitmap))
}
+/**
+ * Convert the [org.jetbrains.skia.Canvas] instance into a Compose-compatible Canvas
+ */
+fun org.jetbrains.skia.Canvas.asComposeCanvas(): Canvas = DesktopCanvas(this)
+
actual val Canvas.nativeCanvas: NativeCanvas get() = (this as DesktopCanvas).skia
-class DesktopCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
+internal class DesktopCanvas(val skia: org.jetbrains.skia.Canvas) : Canvas {
private val Paint.skia get() = (this as DesktopPaint).skia
override fun save() {
@@ -95,14 +98,9 @@
skia.clipRect(SkiaRect.makeLTRB(left, top, right, bottom), clipOp.toSkia(), antiAlias)
}
- fun clipRoundRect(rect: RoundRect, clipOp: ClipOp = ClipOp.Intersect) {
- val antiAlias = true
- skia.clipRRect(rect.toSkiaRRect(), clipOp.toSkia(), antiAlias)
- }
-
override fun clipPath(path: Path, clipOp: ClipOp) {
val antiAlias = true
- skia.clipPath(path.asDesktopPath(), clipOp.toSkia(), antiAlias)
+ skia.clipPath(path.asSkiaPath(), clipOp.toSkia(), antiAlias)
}
override fun drawLine(p1: Offset, p2: Offset, paint: Paint) {
@@ -166,7 +164,7 @@
}
override fun drawPath(path: Path, paint: Paint) {
- skia.drawPath(path.asDesktopPath(), paint.skia)
+ skia.drawPath(path.asSkiaPath(), paint.skia)
}
override fun drawImage(image: ImageBitmap, topLeftOffset: Offset, paint: Paint) {
@@ -201,7 +199,7 @@
dstSize: Size,
paint: Paint
) {
- val bitmap = image.asDesktopBitmap()
+ val bitmap = image.asSkiaBitmap()
Image.makeFromBitmap(bitmap).use { skiaImage ->
skia.drawImageRect(
skiaImage,
@@ -338,15 +336,14 @@
}
override fun drawVertices(vertices: Vertices, blendMode: BlendMode, paint: Paint) {
- org.jetbrains.skia.Canvas._nDrawVertices(
- skia._ptr,
- vertices.vertexMode.toDesktopVertexMode(),
+ skia.drawVertices(
+ vertices.vertexMode.toSkiaVertexMode(),
vertices.positions,
vertices.colors,
vertices.textureCoordinates,
vertices.indices,
- blendMode.toSkia().ordinal,
- getPtr(paint.asFrameworkPaint())
+ blendMode.toSkia(),
+ paint.asFrameworkPaint()
)
}
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
index e8e5edf..8612ddf 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopColorFilter.desktop.kt
@@ -23,10 +23,22 @@
/**
* Obtain a reference to the desktop ColorFilter type
*/
+@Deprecated("Use asSkiaColorFilter()", replaceWith = ReplaceWith("asSkiaColorFilter()"))
fun ColorFilter.asDesktopColorFilter(): SkiaColorFilter = nativeColorFilter
+/**
+ * Obtain a [org.jetbrains.skia.ColorFilter] instance from this [ColorFilter]
+ */
+fun ColorFilter.asSkiaColorFilter(): SkiaColorFilter = nativeColorFilter
+
+@Deprecated("Use asComposeColorFilter()", replaceWith = ReplaceWith("asComposeColorFilter()"))
fun org.jetbrains.skia.ColorFilter.toComposeColorFilter(): ColorFilter = ColorFilter(this)
+/**
+ * Create a [ColorFilter] from the given [org.jetbrains.skia.ColorFilter] instance
+ */
+fun org.jetbrains.skia.ColorFilter.asComposeColorFilter(): ColorFilter = ColorFilter(this)
+
internal actual fun actualTintColorFilter(color: Color, blendMode: BlendMode): ColorFilter =
ColorFilter(SkiaColorFilter.makeBlend(color.toArgb(), blendMode.toSkia()))
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
index 457a3fb..7099247 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageAsset.desktop.kt
@@ -33,13 +33,27 @@
* not create a copy of the original [Bitmap] and changes to it
* will modify the returned [ImageBitmap]
*/
+@Deprecated("Use asComposeImageBitmap", replaceWith = ReplaceWith("asComposeImageBitmap()"))
fun Bitmap.asImageBitmap(): ImageBitmap = DesktopImageBitmap(this)
/**
* Create an [ImageBitmap] from the given [Image].
*/
+@Deprecated("Use toComposeImageBitmap", replaceWith = ReplaceWith("toComposeImageBitmap()"))
fun Image.asImageBitmap(): ImageBitmap = DesktopImageBitmap(toBitmap())
+/**
+ * Create an [ImageBitmap] from the given [Bitmap]. Note this does
+ * not create a copy of the original [Bitmap] and changes to it
+ * will modify the returned [ImageBitmap]
+ */
+fun Bitmap.asComposeImageBitmap(): ImageBitmap = DesktopImageBitmap(this)
+
+/**
+ * Create an [ImageBitmap] from the given [Image].
+ */
+fun Image.toComposeImageBitmap(): ImageBitmap = DesktopImageBitmap(toBitmap())
+
private fun Image.toBitmap(): Bitmap {
val bitmap = Bitmap()
bitmap.allocPixels(ImageInfo.makeN32(width, height, ColorAlphaType.PREMUL))
@@ -67,34 +81,19 @@
}
/**
- * Create an [ImageBitmap] from an image file stored in resources for the application
- *
- * @param path path to the image file
- *
- * @return Loaded image file represented as an [ImageBitmap]
- */
-@Deprecated(
- "Use useResource(path, ::loadImageBitmap)",
- replaceWith = ReplaceWith(
- "useResource(path) { loadImageBitmap(it) }",
- "androidx.compose.ui.res.useResource",
- "androidx.compose.ui.res.loadImageBitmap"
- )
-)
-fun imageFromResource(path: String): ImageBitmap =
- Image.makeFromEncoded(loadResource(path)).asImageBitmap()
-
-private fun loadResource(path: String): ByteArray {
- val resource = Thread.currentThread().contextClassLoader.getResource(path)
- requireNotNull(resource) { "Resource $path not found" }
- return resource.readBytes()
-}
-
-/**
* @Throws UnsupportedOperationException if this [ImageBitmap] is not backed by an
* org.jetbrains.skia.Image
*/
-fun ImageBitmap.asDesktopBitmap(): Bitmap =
+@Deprecated("Use asSkiaBitmap()", replaceWith = ReplaceWith("asSkiaBitmap()"))
+fun ImageBitmap.asDesktopBitmap(): Bitmap = asSkiaBitmap()
+
+/**
+ * Obtain a reference to the [org.jetbrains.skia.Bitmap]
+ *
+ * @Throws UnsupportedOperationException if this [ImageBitmap] is not backed by an
+ * org.jetbrains.skia.Image
+ */
+fun ImageBitmap.asSkiaBitmap(): Bitmap =
when (this) {
is DesktopImageBitmap -> bitmap
else -> throw UnsupportedOperationException("Unable to obtain org.jetbrains.skia.Image")
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
index 92678db..14426cc 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopImageConverters.desktop.kt
@@ -46,10 +46,18 @@
* functions. Don't mutate [BufferedImage] after converting it to [Painter], it will lead to
* undefined behavior.
*/
+@Deprecated("Use toPainter", replaceWith = ReplaceWith("toPainter()"))
fun BufferedImage.asPainter(): Painter = BufferedImagePainter(this)
+/**
+ * Convert AWT [BufferedImage] to Compose [Painter], so it would be possible to pass it to Compose
+ * functions. Don't mutate [BufferedImage] after converting it to [Painter], because
+ * [BufferedImage] can be reused to avoid unnecessary conversions.
+ */
+fun BufferedImage.toPainter(): Painter = BufferedImagePainter(this)
+
private class BufferedImagePainter(val image: BufferedImage) : Painter() {
- private val bitmap by lazy { image.toComposeBitmap() }
+ private val bitmap by lazy { image.toComposeImageBitmap() }
override val intrinsicSize = Size(image.width.toFloat(), image.height.toFloat())
@@ -72,10 +80,33 @@
*
* @param size the size of the [Image]
*/
+@Deprecated(
+ "Use toAwtImage",
+ replaceWith = ReplaceWith("toAwtImage(density, layoutDirection, size)")
+)
fun Painter.asAwtImage(
density: Density,
layoutDirection: LayoutDirection,
size: Size = intrinsicSize
+): Image = toAwtImage(density, layoutDirection, size)
+
+/**
+ * Convert Compose [Painter] to AWT [Image]. The result will not be rasterized right now, it
+ * will be rasterized when AWT will request the image with needed width and height, by calling
+ * [AbstractMultiResolutionImage.getResolutionVariant] on Windows/Linux, or
+ * [AbstractMultiResolutionImage.getResolutionVariants] on macOs.
+ *
+ * At the rasterization moment, [density] and [layoutDirection] will be passed to the painter.
+ * Usually most painters don't use them. Like the painters for svg/xml/raster resources:
+ * they don't use absolute '.dp' values to draw, they use values which are relative
+ * to their viewport.
+ *
+ * @param size the size of the [Image]
+ */
+fun Painter.toAwtImage(
+ density: Density,
+ layoutDirection: LayoutDirection,
+ size: Size = intrinsicSize
): Image {
require(size.isSpecified) {
"Cannot convert Painter with unspecified size. Please set size explicitly."
@@ -112,7 +143,7 @@
) {
painter.image
} else {
- asBitmap(width, height).asAwtImage()
+ asBitmap(width, height).toAwtImage()
}
}
@@ -147,10 +178,10 @@
// optimizations to avoid unnecessary rasterizations
when (painter) {
is BufferedImagePainter -> listOf(painter.image)
- is BitmapPainter -> listOf(asBitmap(width, height).asAwtImage())
+ is BitmapPainter -> listOf(asBitmap(width, height).toAwtImage())
else -> listOf(
- asBitmap(width, height).asAwtImage(), // for usual displays
- asBitmap(width * 2, height * 2).asAwtImage(), // for retina displays
+ asBitmap(width, height).toAwtImage(), // for usual displays
+ asBitmap(width * 2, height * 2).toAwtImage(), // for retina displays
)
}
}
@@ -164,7 +195,14 @@
/**
* Convert Compose [ImageBitmap] to AWT [BufferedImage]
*/
-fun ImageBitmap.asAwtImage(): BufferedImage {
+
+@Deprecated("use toAwtImage", replaceWith = ReplaceWith("toAwtImage"))
+fun ImageBitmap.asAwtImage(): BufferedImage = toAwtImage()
+
+/**
+ * Convert Compose [ImageBitmap] to AWT [BufferedImage]
+ */
+fun ImageBitmap.toAwtImage(): BufferedImage {
// TODO(demin): use asDesktopBitmap().toBufferedImage() from skiko, when we fix it. Currently
// some images convert with graphical artifacts
@@ -185,7 +223,13 @@
/**
* Convert AWT [BufferedImage] to Compose [ImageBitmap]
*/
-fun BufferedImage.toComposeBitmap(): ImageBitmap {
+@Deprecated("use toComposeImageBitmap()", replaceWith = ReplaceWith("toComposeImageBitmap()"))
+fun BufferedImage.toComposeBitmap(): ImageBitmap = toComposeImageBitmap()
+
+/**
+ * Convert AWT [BufferedImage] to Compose [ImageBitmap]
+ */
+fun BufferedImage.toComposeImageBitmap(): ImageBitmap {
// TODO(demin): use toBitmap().asImageBitmap() from skiko, when we fix its performance
// (it is 40x slower)
@@ -210,5 +254,5 @@
val bitmap = Bitmap()
bitmap.allocPixels(ImageInfo.makeS32(width, height, ColorAlphaType.UNPREMUL))
bitmap.installPixels(pixels)
- return bitmap.asImageBitmap()
+ return bitmap.asComposeImageBitmap()
}
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
index efed256..0d61dc0 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPaint.desktop.kt
@@ -24,9 +24,14 @@
actual fun Paint(): Paint = DesktopPaint()
-class DesktopPaint : Paint {
- internal val skia = org.jetbrains.skia.Paint()
+/**
+ * Convert the [org.jetbrains.skia.Paint] instance into a Compose-compatible Paint
+ */
+fun org.jetbrains.skia.Paint.asComposePaint(): Paint = DesktopPaint(this)
+internal class DesktopPaint(
+ val skia: org.jetbrains.skia.Paint = org.jetbrains.skia.Paint()
+) : Paint {
override fun asFrameworkPaint(): NativePaint = skia
override var alpha: Float
@@ -93,13 +98,13 @@
override var colorFilter: ColorFilter? = null
set(value) {
- skia.colorFilter = value?.asDesktopColorFilter()
+ skia.colorFilter = value?.asSkiaColorFilter()
field = value
}
override var pathEffect: PathEffect? = null
set(value) {
- skia.pathEffect = (value as DesktopPathEffect?)?.asDesktopPathEffect()
+ skia.pathEffect = (value as DesktopPathEffect?)?.asSkiaPathEffect()
field = value
}
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
index b79abce..d0c6172 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPath.desktop.kt
@@ -27,17 +27,27 @@
actual fun Path(): Path = DesktopPath()
/**
+ * Convert the [org.jetbrains.skia.Path] instance into a Compose-compatible Path
+ */
+fun org.jetbrains.skia.Path.asComposePath(): Path = DesktopPath(this)
+
+@Suppress("NOTHING_TO_INLINE")
+@Deprecated("Use asSkiaPath()", replaceWith = ReplaceWith("asSkiaPath()"))
+inline fun Path.asDesktopPath(): org.jetbrains.skia.Path = asSkiaPath()
+
+/**
+ * Obtain a reference to the [org.jetbrains.skia.Path]
+ *
* @Throws UnsupportedOperationException if this Path is not backed by an org.jetbrains.skia.Path
*/
-@Suppress("NOTHING_TO_INLINE")
-inline fun Path.asDesktopPath(): org.jetbrains.skia.Path =
+fun Path.asSkiaPath(): org.jetbrains.skia.Path =
if (this is DesktopPath) {
internalPath
} else {
throw UnsupportedOperationException("Unable to obtain org.jetbrains.skia.Path")
}
-class DesktopPath(
+internal class DesktopPath(
internalPath: org.jetbrains.skia.Path = org.jetbrains.skia.Path()
) : Path {
var internalPath = internalPath
@@ -143,7 +153,7 @@
}
override fun addPath(path: Path, offset: Offset) {
- internalPath.addPath(path.asDesktopPath(), offset.x, offset.y)
+ internalPath.addPath(path.asSkiaPath(), offset.x, offset.y)
}
override fun close() {
@@ -178,8 +188,8 @@
operation: PathOperation
): Boolean {
val path = org.jetbrains.skia.Path.makeCombining(
- path1.asDesktopPath(),
- path2.asDesktopPath(),
+ path1.asSkiaPath(),
+ path2.asSkiaPath(),
operation.toSkiaOperation()
)
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
index 566a243..22d5e8f 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathEffect.desktop.kt
@@ -21,9 +21,20 @@
internal class DesktopPathEffect(val nativePathEffect: SkiaPathEffect) : PathEffect
/**
+ * Convert the [org.jetbrains.skia.PathEffect] instance into a Compose-compatible PathEffect
+ */
+fun SkiaPathEffect.asComposePathEffect(): PathEffect = DesktopPathEffect(this)
+
+/**
* Obtain a reference to the desktop PathEffect type
*/
-fun PathEffect.asDesktopPathEffect(): SkiaPathEffect =
+@Deprecated("Use asSkiaPathEffect()", replaceWith = ReplaceWith("asSkiaPathEffect()"))
+fun PathEffect.asDesktopPathEffect(): SkiaPathEffect = asSkiaPathEffect()
+
+/**
+ * Obtain a reference to the desktop PathEffect type
+ */
+fun PathEffect.asSkiaPathEffect(): SkiaPathEffect =
(this as DesktopPathEffect).nativePathEffect
internal actual fun actualCornerPathEffect(radius: Float): PathEffect =
@@ -35,7 +46,7 @@
): PathEffect = DesktopPathEffect(SkiaPathEffect.makeDash(intervals, phase))
internal actual fun actualChainPathEffect(outer: PathEffect, inner: PathEffect): PathEffect =
- DesktopPathEffect(outer.asDesktopPathEffect().makeCompose(inner.asDesktopPathEffect()))
+ DesktopPathEffect(outer.asSkiaPathEffect().makeCompose(inner.asSkiaPathEffect()))
internal actual fun actualStampedPathEffect(
shape: Path,
@@ -45,7 +56,7 @@
): PathEffect =
DesktopPathEffect(
SkiaPathEffect.makePath1D(
- shape.asDesktopPath(),
+ shape.asSkiaPath(),
advance,
phase,
style.toSkiaStampedPathEffectStyle()
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt
index 4f279e0..f348407 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopPathMeasure.desktop.kt
@@ -16,11 +16,23 @@
package androidx.compose.ui.graphics
-internal class DesktopPathMeasure : PathMeasure {
- private val skia = org.jetbrains.skia.PathMeasure()
+/**
+ * Convert the [org.jetbrains.skia.PathMeasure] instance into a Compose-compatible PathMeasure
+ */
+fun org.jetbrains.skia.PathMeasure.asComposePathEffect(): PathMeasure = DesktopPathMeasure(this)
+
+/**
+ * Obtain a reference to the desktop PathMeasure type
+ */
+fun PathMeasure.asSkiaPathMeasure(): org.jetbrains.skia.PathMeasure =
+ (this as DesktopPathMeasure).skia
+
+internal class DesktopPathMeasure(
+ internal val skia: org.jetbrains.skia.PathMeasure = org.jetbrains.skia.PathMeasure()
+) : PathMeasure {
override fun setPath(path: Path?, forceClosed: Boolean) {
- skia.setPath(path?.asDesktopPath(), forceClosed)
+ skia.setPath(path?.asSkiaPath(), forceClosed)
}
override fun getSegment(
@@ -31,7 +43,7 @@
) = skia.getSegment(
startDistance,
stopDistance,
- destination.asDesktopPath(),
+ destination.asSkiaPath(),
startWithMoveTo
)
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
index 5afb3c5..856aab6 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopShader.desktop.kt
@@ -31,7 +31,7 @@
validateColorStops(colors, colorStops)
return Shader.makeLinearGradient(
from.x, from.y, to.x, to.y, colors.toIntArray(), colorStops?.toFloatArray(),
- GradientStyle(tileMode.toDesktopTileMode(), true, identityMatrix33())
+ GradientStyle(tileMode.toSkiaTileMode(), true, identityMatrix33())
)
}
@@ -49,7 +49,7 @@
radius,
colors.toIntArray(),
colorStops?.toFloatArray(),
- GradientStyle(tileMode.toDesktopTileMode(), true, identityMatrix33())
+ GradientStyle(tileMode.toSkiaTileMode(), true, identityMatrix33())
)
}
@@ -72,9 +72,9 @@
tileModeX: TileMode,
tileModeY: TileMode
): Shader {
- return image.asDesktopBitmap().makeShader(
- tileModeX.toDesktopTileMode(),
- tileModeY.toDesktopTileMode()
+ return image.asSkiaBitmap().makeShader(
+ tileModeX.toSkiaTileMode(),
+ tileModeY.toSkiaTileMode()
)
}
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
index a4ead37..af07c79 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopTileMode.desktop.kt
@@ -20,19 +20,10 @@
actual fun TileMode.isSupported(): Boolean = true
-fun TileMode.toDesktopTileMode(): FilterTileMode = when (this) {
+internal fun TileMode.toSkiaTileMode(): FilterTileMode = when (this) {
TileMode.Clamp -> FilterTileMode.CLAMP
TileMode.Repeated -> FilterTileMode.REPEAT
TileMode.Mirror -> FilterTileMode.MIRROR
TileMode.Decal -> FilterTileMode.DECAL
else -> FilterTileMode.CLAMP
}
-
-fun FilterTileMode.toComposeTileMode(): TileMode =
- when (this) {
- FilterTileMode.CLAMP -> TileMode.Clamp
- FilterTileMode.MIRROR -> TileMode.Mirror
- FilterTileMode.REPEAT -> TileMode.Repeated
- FilterTileMode.DECAL -> TileMode.Decal
- else -> TileMode.Clamp
- }
\ No newline at end of file
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt
index 42e53a4..55d4c50 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/DesktopVertexMode.desktop.kt
@@ -16,9 +16,11 @@
package androidx.compose.ui.graphics
-fun VertexMode.toDesktopVertexMode(): Int = when (this) {
- VertexMode.Triangles -> 0
- VertexMode.TriangleStrip -> 1
- VertexMode.TriangleFan -> 2
- else -> 0
-}
\ No newline at end of file
+import org.jetbrains.skia.VertexMode as SkVertexMode
+
+internal fun VertexMode.toSkiaVertexMode(): SkVertexMode = when (this) {
+ VertexMode.Triangles -> SkVertexMode.TRIANGLES
+ VertexMode.TriangleStrip -> SkVertexMode.TRIANGLE_STRIP
+ VertexMode.TriangleFan -> SkVertexMode.TRIANGLE_FAN
+ else -> SkVertexMode.TRIANGLES
+}
diff --git a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt
index 1843b5a..fea46c1 100644
--- a/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt
+++ b/compose/ui/ui-graphics/src/desktopMain/kotlin/androidx/compose/ui/graphics/RenderEffect.desktop.kt
@@ -21,7 +21,7 @@
import org.jetbrains.skia.ImageFilter
/**
- * Convert the [ImageFilter] instance into a compose compatible [RenderEffect]
+ * Convert the [ImageFilter] instance into a Compose-compatible [RenderEffect]
*/
fun ImageFilter.asComposeRenderEffect(): RenderEffect =
DesktopRenderEffect(this)
@@ -36,7 +36,10 @@
private var internalImageFilter: ImageFilter? = null
- fun asDesktopImageFilter(): ImageFilter =
+ @Deprecated("Use asSkiaImageFilter()", replaceWith = ReplaceWith("asSkiaImageFilter()"))
+ fun asDesktopImageFilter(): ImageFilter = asSkiaImageFilter()
+
+ fun asSkiaImageFilter(): ImageFilter =
internalImageFilter ?: createImageFilter().also { internalImageFilter = it }
protected abstract fun createImageFilter(): ImageFilter
@@ -68,14 +71,14 @@
ImageFilter.makeBlur(
convertRadiusToSigma(radiusX),
convertRadiusToSigma(radiusY),
- edgeTreatment.toDesktopTileMode()
+ edgeTreatment.toSkiaTileMode()
)
} else {
ImageFilter.makeBlur(
convertRadiusToSigma(radiusX),
convertRadiusToSigma(radiusY),
- edgeTreatment.toDesktopTileMode(),
- renderEffect.asDesktopImageFilter(),
+ edgeTreatment.toSkiaTileMode(),
+ renderEffect.asSkiaImageFilter(),
null
)
}
@@ -129,7 +132,7 @@
) : RenderEffect() {
override fun createImageFilter(): ImageFilter =
- ImageFilter.makeOffset(offset.x, offset.y, renderEffect?.asDesktopImageFilter(), null)
+ ImageFilter.makeOffset(offset.x, offset.y, renderEffect?.asSkiaImageFilter(), null)
override fun equals(other: Any?): Boolean {
if (this === other) return true
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
index 278473f..e894d93 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopGraphicsTest.kt
@@ -16,11 +16,13 @@
package androidx.compose.ui.graphics
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
import org.jetbrains.skia.Surface
import org.junit.After
import org.junit.Rule
+@OptIn(InternalTestApi::class)
abstract class DesktopGraphicsTest {
@get:Rule
val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/graphics")
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt
index 9ceb092..22b40fb 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopImageBitmapTest.kt
@@ -18,11 +18,13 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.colorspace.ColorSpaces
+import androidx.compose.ui.test.InternalTestApi
import com.google.common.truth.Truth.assertThat
import org.junit.Assert.assertEquals
import org.junit.Assert.assertTrue
import org.junit.Test
+@OptIn(InternalTestApi::class)
class DesktopImageBitmapTest : DesktopGraphicsTest() {
private val canvas: Canvas = initCanvas(widthPx = 16, heightPx = 16)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
index 1f16302..7a95a48 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPaintTest.kt
@@ -17,12 +17,14 @@
package androidx.compose.ui.graphics
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import org.junit.Assert.assertEquals
import org.junit.Assume.assumeTrue
import org.junit.Test
+@OptIn(InternalTestApi::class)
class DesktopPaintTest : DesktopGraphicsTest() {
private val canvas: Canvas = initCanvas(widthPx = 16, heightPx = 16)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt
index 06f4f36..0cd3bbb 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/DesktopPathTest.kt
@@ -18,9 +18,11 @@
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.geometry.RoundRect
+import androidx.compose.ui.test.InternalTestApi
import org.junit.Assert.assertEquals
import org.junit.Test
+@OptIn(InternalTestApi::class)
class DesktopPathTest : DesktopGraphicsTest() {
private val canvas: Canvas = initCanvas(widthPx = 16, heightPx = 16)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt
index a826c5d..c4c48e4 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasPointsTest.kt
@@ -23,8 +23,10 @@
import androidx.compose.ui.graphics.Paint
import androidx.compose.ui.graphics.PointMode
import androidx.compose.ui.graphics.StrokeCap
+import androidx.compose.ui.test.InternalTestApi
import org.junit.Test
+@OptIn(InternalTestApi::class)
class DesktopCanvasPointsTest : DesktopGraphicsTest() {
private val canvas: Canvas = initCanvas(widthPx = 16, heightPx = 16)
diff --git a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt
index 7168204..007d840 100644
--- a/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt
+++ b/compose/ui/ui-graphics/src/desktopTest/kotlin/androidx/compose/ui/graphics/canvas/DesktopCanvasTest.kt
@@ -32,10 +32,12 @@
import androidx.compose.ui.graphics.loadResourceBitmap
import androidx.compose.ui.graphics.withSave
import androidx.compose.ui.graphics.withSaveLayer
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.unit.IntOffset
import androidx.compose.ui.unit.IntSize
import org.junit.Test
+@OptIn(InternalTestApi::class)
class DesktopCanvasTest : DesktopGraphicsTest() {
private val canvas: Canvas = initCanvas(widthPx = 16, heightPx = 16)
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
index 26e6ac8..ff2d19e 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/DesktopComposeTestRule.desktop.kt
@@ -43,9 +43,10 @@
import javax.swing.SwingUtilities.invokeAndWait
import javax.swing.SwingUtilities.isEventDispatchThread
+@OptIn(InternalTestApi::class)
actual fun createComposeRule(): ComposeContentTestRule = DesktopComposeTestRule()
-@OptIn(InternalTestApi::class)
+@InternalTestApi
class DesktopComposeTestRule : ComposeContentTestRule {
override val density: Density
@@ -91,6 +92,8 @@
!window.hasInvalidations()
override fun waitForIdle() {
+ // always check even if we are idle
+ uncaughtExceptionHandler.throwUncaught()
while (!isIdle()) {
Thread.sleep(10)
uncaughtExceptionHandler.throwUncaught()
@@ -98,6 +101,8 @@
}
override suspend fun awaitIdle() {
+ // always check even if we are idle
+ uncaughtExceptionHandler.throwUncaught()
while (!isIdle()) {
delay(10)
uncaughtExceptionHandler.throwUncaught()
diff --git a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
index a843ecb..bc82a1a 100644
--- a/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
+++ b/compose/ui/ui-test-junit4/src/desktopMain/kotlin/androidx/compose/ui/test/junit4/SkiaTest.desktop.kt
@@ -15,6 +15,8 @@
*/
package androidx.compose.ui.test.junit4
+import org.jetbrains.skia.Image
+import androidx.compose.ui.test.InternalTestApi
import org.jetbrains.skia.Surface
import org.junit.rules.TestRule
import org.junit.runner.Description
@@ -23,7 +25,10 @@
import java.security.MessageDigest
import java.util.LinkedList
+// TODO(https://github.com/JetBrains/compose-jb/issues/1041): refactor API
+
// TODO: replace with androidx.test.screenshot.proto.ScreenshotResultProto after MPP
+@InternalTestApi
data class ScreenshotResultProto(
val result: Status,
val comparisonStatistics: String,
@@ -42,18 +47,24 @@
}
}
+@InternalTestApi
data class GoldenConfig(
val fsGoldenPath: String,
val repoGoldenPath: String,
val modulePrefix: String
)
+@InternalTestApi
class SkiaTestAlbum(val config: GoldenConfig) {
data class Report(val screenshots: Map<String, ScreenshotResultProto>)
private val screenshots: MutableMap<String, ScreenshotResultProto> = mutableMapOf()
private val report = Report(screenshots)
fun snap(surface: Surface, id: String) {
+ write(surface.makeImageSnapshot(), id)
+ }
+
+ fun write(image: Image, id: String) {
if (!id.matches("^[A-Za-z0-9_-]+$".toRegex())) {
throw IllegalArgumentException(
"The given golden identifier '$id' does not satisfy the naming " +
@@ -61,7 +72,7 @@
)
}
- val actual = surface.makeImageSnapshot().encodeToData()!!.bytes
+ val actual = image.encodeToData()!!.bytes
val expected = readExpectedImage(id)
if (expected == null) {
@@ -155,6 +166,7 @@
}
}
+@InternalTestApi
fun DesktopScreenshotTestRule(
modulePath: String,
fsGoldenPath: String = System.getProperty("GOLDEN_PATH"),
@@ -163,6 +175,7 @@
return ScreenshotTestRule(GoldenConfig(fsGoldenPath, repoGoldenPath, modulePath))
}
+@InternalTestApi
class ScreenshotTestRule internal constructor(val config: GoldenConfig) : TestRule {
private lateinit var testIdentifier: String
private lateinit var album: SkiaTestAlbum
@@ -189,8 +202,12 @@
}
fun snap(surface: Surface, idSuffix: String? = null) {
+ write(surface.makeImageSnapshot(), idSuffix)
+ }
+
+ fun write(image: Image, idSuffix: String? = null) {
val id = testIdentifier + if (idSuffix != null) "_$idSuffix" else ""
- album.snap(surface, id)
+ album.write(image, id)
}
private fun handleReport(report: SkiaTestAlbum.Report) {
diff --git a/compose/ui/ui-test/api/current.txt b/compose/ui/ui-test/api/current.txt
index ad83610..02b9fd7 100644
--- a/compose/ui/ui-test/api/current.txt
+++ b/compose/ui/ui-test/api/current.txt
@@ -8,6 +8,7 @@
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+ method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
method public static void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
@@ -95,6 +96,7 @@
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+ method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
@@ -182,8 +184,10 @@
property public abstract boolean isIdleNow;
}
- public interface InjectionScope {
+ public interface InjectionScope extends androidx.compose.ui.unit.Density {
method public void advanceEventTime(optional long durationMillis);
+ method public void dispose();
+ method public void flush();
method public default float getBottom();
method public default long getBottomCenter();
method public default long getBottomLeft();
@@ -201,6 +205,7 @@
method public default long getTopCenter();
method public default long getTopLeft();
method public default long getTopRight();
+ method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
method public long getVisibleSize();
method public default int getWidth();
method public default long percentOffset(optional float x, optional float y);
@@ -221,6 +226,7 @@
property public default long topCenter;
property public default long topLeft;
property public default long topRight;
+ property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
property public abstract long visibleSize;
property public default int width;
}
@@ -243,13 +249,9 @@
public final class MouseInjectionScopeKt {
}
- public final class MultiModalInjectionScope implements androidx.compose.ui.test.InjectionScope {
- ctor public MultiModalInjectionScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
- method public void advanceEventTime(long durationMillis);
+ public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
method public androidx.compose.ui.test.TouchInjectionScope getTouch();
- method public long getVisibleSize();
- property public final androidx.compose.ui.test.TouchInjectionScope Touch;
- property public long visibleSize;
+ property public abstract androidx.compose.ui.test.TouchInjectionScope Touch;
}
public final class OutputKt {
diff --git a/compose/ui/ui-test/api/public_plus_experimental_current.txt b/compose/ui/ui-test/api/public_plus_experimental_current.txt
index 4ce70833..fa90531 100644
--- a/compose/ui/ui-test/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui-test/api/public_plus_experimental_current.txt
@@ -9,6 +9,7 @@
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+ method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
method public static void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
@@ -99,6 +100,7 @@
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+ method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
@@ -191,8 +193,10 @@
property public abstract boolean isIdleNow;
}
- public interface InjectionScope {
+ public interface InjectionScope extends androidx.compose.ui.unit.Density {
method public void advanceEventTime(optional long durationMillis);
+ method public void dispose();
+ method public void flush();
method public default float getBottom();
method public default long getBottomCenter();
method public default long getBottomLeft();
@@ -210,6 +214,7 @@
method public default long getTopCenter();
method public default long getTopLeft();
method public default long getTopRight();
+ method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
method public long getVisibleSize();
method public default int getWidth();
method public default long percentOffset(optional float x, optional float y);
@@ -230,6 +235,7 @@
property public default long topCenter;
property public default long topLeft;
property public default long topRight;
+ property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
property public abstract long visibleSize;
property public default int width;
}
@@ -295,15 +301,11 @@
method @androidx.compose.ui.test.ExperimentalTestApi public static void tripleClick(androidx.compose.ui.test.MouseInjectionScope, optional long position);
}
- public final class MultiModalInjectionScope implements androidx.compose.ui.test.InjectionScope {
- ctor public MultiModalInjectionScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
- method public void advanceEventTime(long durationMillis);
+ public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
method @androidx.compose.ui.test.ExperimentalTestApi public androidx.compose.ui.test.MouseInjectionScope getMouse();
method public androidx.compose.ui.test.TouchInjectionScope getTouch();
- method public long getVisibleSize();
- property @androidx.compose.ui.test.ExperimentalTestApi public final androidx.compose.ui.test.MouseInjectionScope Mouse;
- property public final androidx.compose.ui.test.TouchInjectionScope Touch;
- property public long visibleSize;
+ property @androidx.compose.ui.test.ExperimentalTestApi public abstract androidx.compose.ui.test.MouseInjectionScope Mouse;
+ property public abstract androidx.compose.ui.test.TouchInjectionScope Touch;
}
public final class OutputKt {
@@ -444,6 +446,8 @@
method public default void moveBy(long delta, optional long delayMillis);
method public default void moveTo(int pointerId, long position, optional long delayMillis);
method public default void moveTo(long position, optional long delayMillis);
+ method @androidx.compose.ui.test.ExperimentalTestApi public default void moveWithHistory(java.util.List<java.lang.Long> relativeHistoricalTimes, java.util.List<androidx.compose.ui.geometry.Offset> historicalCoordinates, optional long delayMillis);
+ method @androidx.compose.ui.test.ExperimentalTestApi public void moveWithHistoryMultiPointer(java.util.List<java.lang.Long> relativeHistoricalTimes, java.util.List<? extends java.util.List<androidx.compose.ui.geometry.Offset>> historicalCoordinates, optional long delayMillis);
method public void up(optional int pointerId);
method public default void updatePointerBy(int pointerId, long delta);
method public void updatePointerTo(int pointerId, long position);
diff --git a/compose/ui/ui-test/api/restricted_current.txt b/compose/ui/ui-test/api/restricted_current.txt
index eb314c73..73dd1b3d 100644
--- a/compose/ui/ui-test/api/restricted_current.txt
+++ b/compose/ui/ui-test/api/restricted_current.txt
@@ -8,6 +8,7 @@
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollTo(androidx.compose.ui.test.SemanticsNodeInteraction);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToIndex(androidx.compose.ui.test.SemanticsNodeInteraction, int index);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToKey(androidx.compose.ui.test.SemanticsNodeInteraction, Object key);
+ method public static androidx.compose.ui.test.SemanticsNodeInteraction performScrollToNode(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.test.SemanticsMatcher matcher);
method public static <T extends kotlin.Function<? extends java.lang.Boolean>> void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<T>> key, kotlin.jvm.functions.Function1<? super T,kotlin.Unit> invocation);
method public static void performSemanticsAction(androidx.compose.ui.test.SemanticsNodeInteraction, androidx.compose.ui.semantics.SemanticsPropertyKey<androidx.compose.ui.semantics.AccessibilityAction<kotlin.jvm.functions.Function0<java.lang.Boolean>>> key);
method public static androidx.compose.ui.test.SemanticsNodeInteraction performTouchInput(androidx.compose.ui.test.SemanticsNodeInteraction, kotlin.jvm.functions.Function1<? super androidx.compose.ui.test.TouchInjectionScope,kotlin.Unit> block);
@@ -95,6 +96,7 @@
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToIndexAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToKeyAction();
+ method public static androidx.compose.ui.test.SemanticsMatcher hasScrollToNodeAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasSetTextAction();
method public static androidx.compose.ui.test.SemanticsMatcher hasStateDescription(String value);
method public static androidx.compose.ui.test.SemanticsMatcher hasTestTag(String testTag);
@@ -183,8 +185,10 @@
property public abstract boolean isIdleNow;
}
- public interface InjectionScope {
+ public interface InjectionScope extends androidx.compose.ui.unit.Density {
method public void advanceEventTime(optional long durationMillis);
+ method public void dispose();
+ method public void flush();
method public default float getBottom();
method public default long getBottomCenter();
method public default long getBottomLeft();
@@ -202,6 +206,7 @@
method public default long getTopCenter();
method public default long getTopLeft();
method public default long getTopRight();
+ method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
method public long getVisibleSize();
method public default int getWidth();
method public default long percentOffset(optional float x, optional float y);
@@ -222,6 +227,7 @@
property public default long topCenter;
property public default long topLeft;
property public default long topRight;
+ property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
property public abstract long visibleSize;
property public default int width;
}
@@ -244,13 +250,9 @@
public final class MouseInjectionScopeKt {
}
- public final class MultiModalInjectionScope implements androidx.compose.ui.test.InjectionScope {
- ctor public MultiModalInjectionScope(androidx.compose.ui.semantics.SemanticsNode node, androidx.compose.ui.test.TestContext testContext);
- method public void advanceEventTime(long durationMillis);
+ public sealed interface MultiModalInjectionScope extends androidx.compose.ui.test.InjectionScope {
method public androidx.compose.ui.test.TouchInjectionScope getTouch();
- method public long getVisibleSize();
- property public final androidx.compose.ui.test.TouchInjectionScope Touch;
- property public long visibleSize;
+ property public abstract androidx.compose.ui.test.TouchInjectionScope Touch;
}
public final class OutputKt {
diff --git a/compose/ui/ui-test/build.gradle b/compose/ui/ui-test/build.gradle
index 47d9aec..6643dba 100644
--- a/compose/ui/ui-test/build.gradle
+++ b/compose/ui/ui-test/build.gradle
@@ -27,6 +27,13 @@
AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project)
android {
+ if (!AndroidXComposePlugin.isMultiplatformEnabled(project)) {
+ sourceSets {
+ test.java.srcDirs += "src/androidCommonTest/kotlin"
+ androidTest.java.srcDirs += "src/androidCommonTest/kotlin"
+ }
+ }
+
lintOptions {
disable("InvalidPackage")
}
@@ -50,6 +57,12 @@
implementation("androidx.annotation:annotation:1.1.0")
implementation(libs.espressoCore)
+ testImplementation(project(":compose:test-utils"))
+ testImplementation(libs.truth)
+ testImplementation(libs.robolectric)
+ testImplementation(libs.mockitoCore)
+ testImplementation(libs.mockitoKotlin)
+
androidTestImplementation("androidx.activity:activity-compose:1.3.1")
androidTestImplementation(project(":compose:material:material"))
androidTestImplementation(project(":compose:test-utils"))
@@ -91,17 +104,24 @@
implementation(libs.espressoCore)
}
- androidAndroidTest.dependencies {
- implementation(project(":compose:material:material"))
+ androidCommonTest.dependencies {
implementation(project(":compose:test-utils"))
- implementation(project(":compose:ui:ui-test-junit4"))
- implementation("androidx.activity:activity-compose:1.3.1")
implementation(libs.truth)
implementation(libs.mockitoCore)
- implementation(libs.dexmakerMockito)
implementation(libs.mockitoKotlin)
}
+ androidTest.dependencies {
+ implementation(libs.robolectric)
+ }
+
+ androidAndroidTest.dependencies {
+ implementation(project(":compose:material:material"))
+ implementation(project(":compose:ui:ui-test-junit4"))
+ implementation("androidx.activity:activity-compose:1.3.1")
+ implementation(libs.dexmakerMockito)
+ }
+
desktopMain.dependencies {
implementation(libs.junit)
implementation(libs.truth)
@@ -111,6 +131,10 @@
androidMain.dependsOn(jvmMain)
desktopMain.dependsOn(jvmMain)
jvmMain.dependsOn(commonMain)
+
+ androidCommonTest.dependsOn(commonTest)
+ androidTest.dependsOn(androidCommonTest)
+ androidAndroidTest.dependsOn(androidCommonTest)
}
}
}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt
new file mode 100644
index 0000000..3d178ab
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/actions/ScrollToNodeTest.kt
@@ -0,0 +1,266 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.test.actions
+
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.lazy.LazyColumn
+import androidx.compose.foundation.lazy.LazyListScope
+import androidx.compose.foundation.lazy.LazyListState
+import androidx.compose.foundation.lazy.LazyRow
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.testutils.expectError
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.actions.ScrollToNodeTest.Orientation.HorizontalRtl
+import androidx.compose.ui.test.actions.ScrollToNodeTest.Orientation.Vertical
+import androidx.compose.ui.test.actions.ScrollToNodeTest.StartPosition.FullyAfter
+import androidx.compose.ui.test.actions.ScrollToNodeTest.StartPosition.FullyBefore
+import androidx.compose.ui.test.actions.ScrollToNodeTest.StartPosition.NotInList
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.getBoundsInRoot
+import androidx.compose.ui.test.getUnclippedBoundsInRoot
+import androidx.compose.ui.test.hasTestTag
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performScrollToNode
+import androidx.compose.ui.test.util.ClickableTestBox
+import androidx.compose.ui.test.util.ClickableTestBox.defaultTag
+import androidx.compose.ui.unit.DpRect
+import androidx.compose.ui.unit.LayoutDirection
+import com.google.common.truth.Truth.assertWithMessage
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+class ScrollToNodeTest(private val config: TestConfig) {
+ data class TestConfig(
+ val orientation: Orientation,
+ val reverseLayout: Boolean,
+ val viewportSize: ViewportSize,
+ val targetPosition: StartPosition
+ ) {
+ val viewportSizePx: Int get() = viewportSize.sizePx
+
+ private val initialScrollIndexWithoutReverseLayout: Int = when (viewportSize) {
+ ViewportSize.SmallerThanItem -> targetPosition.indexForSmallViewport
+ ViewportSize.BiggerThenItem -> targetPosition.indexForBigViewport
+ }
+
+ private val initialScrollOffsetWithoutReverseLayout: Int = when (viewportSize) {
+ ViewportSize.SmallerThanItem -> targetPosition.offsetForSmallViewport
+ ViewportSize.BiggerThenItem -> targetPosition.offsetForBigViewport
+ }
+
+ val initialScrollIndex: Int
+ get() {
+ val index = initialScrollIndexWithoutReverseLayout
+ if (!reverseLayout) return index
+ // Need to invert the index/offset pair for reverseScrolling so the target
+ // is on the correct side of the viewport according to the [StartPosition]
+ val offset = initialScrollOffsetWithoutReverseLayout
+ val totalOffset = index * itemSizePx + offset
+ val range = (2 * itemsAround + 1) * itemSizePx - viewportSizePx
+ // For the index, how many items fit in the inverted totalOffset?
+ return (range - totalOffset) / itemSizePx
+ }
+
+ val initialScrollOffset: Int
+ get() {
+ val offset = initialScrollOffsetWithoutReverseLayout
+ if (!reverseLayout) return offset
+ // Need to invert the index/offset pair for reverseScrolling so the target
+ // is on the correct side of the viewport according to the [StartPosition]
+ val index = initialScrollIndexWithoutReverseLayout
+ val totalOffset = index * itemSizePx + offset
+ val range = (2 * itemsAround + 1) * itemSizePx - viewportSizePx
+ // For the offset, how many pixels are left in the inverted totalOffset?
+ return (range - totalOffset) % itemSizePx
+ }
+
+ override fun toString(): String = "orientation=$orientation, " +
+ "reverseScrolling=$reverseLayout, " +
+ "viewport=$viewportSize, " +
+ "targetIs=" +
+ when (targetPosition) {
+ NotInList -> "$targetPosition"
+ else -> "${targetPosition}Viewport"
+ }
+ }
+
+ companion object {
+ private const val containerTag = "container"
+ private const val itemTag = "target"
+ private const val itemsAround = 5
+ private const val itemSizePx = 100
+ private const val bigViewport = 150
+ private const val smallViewport = 80
+
+ @JvmStatic
+ @Parameterized.Parameters(name = "{0}")
+ fun params() = mutableListOf<TestConfig>().apply {
+ for (orientation in Orientation.values()) {
+ for (reverseScrolling in listOf(false, true)) {
+ for (viewportSize in ViewportSize.values()) {
+ for (targetPosition in StartPosition.values()) {
+ TestConfig(
+ orientation = orientation,
+ reverseLayout = reverseScrolling,
+ viewportSize = viewportSize,
+ targetPosition = targetPosition
+ ).also { add(it) }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun scrollToTarget() {
+ val state = LazyListState(config.initialScrollIndex, config.initialScrollOffset)
+ val isRtl = config.orientation == HorizontalRtl
+ val isVertical = config.orientation == Vertical
+
+ // Some boxes in a row/col with a specific initialScrollOffset so that the target we want
+ // to bring into view is either before, partially before, in, partially after or after
+ // the viewport.
+ rule.setContent {
+ val direction = if (isRtl) LayoutDirection.Rtl else LayoutDirection.Ltr
+ CompositionLocalProvider(LocalLayoutDirection provides direction) {
+ if (isVertical) {
+ LazyColumn(columnModifier(), state, reverseLayout = config.reverseLayout) {
+ Boxes()
+ }
+ } else {
+ LazyRow(rowModifier(), state, reverseLayout = config.reverseLayout) {
+ Boxes()
+ }
+ }
+ }
+ }
+
+ if (config.targetPosition in listOf(FullyAfter, FullyBefore, NotInList)) {
+ rule.onNodeWithTag(itemTag).assertDoesNotExist()
+ } else {
+ rule.onNodeWithTag(itemTag).assertIsDisplayed()
+ }
+
+ // If the target is not in the list at all we should check
+ // that an exception is thrown, and stop the test after that
+ expectError<AssertionError>(
+ expectError = config.targetPosition == NotInList,
+ expectedMessage = "No node found that matches TestTag = 'target' in scrollable " +
+ "container.*"
+ ) {
+ rule.onNodeWithTag(containerTag).performScrollToNode(hasTestTag(itemTag))
+ }
+ if (config.targetPosition == NotInList) {
+ return
+ }
+
+ rule.onNodeWithTag(itemTag).assertIsDisplayed()
+
+ val viewportBounds = rule.onNodeWithTag(containerTag).getBoundsInRoot().toPx()
+ val targetBounds = rule.onNodeWithTag(itemTag).getUnclippedBoundsInRoot().toPx()
+
+ if (config.viewportSize == ViewportSize.SmallerThanItem) {
+ assertWithMessage("item needs to cover the whole viewport")
+ .that(targetBounds.leftOrTop).isAtMost(viewportBounds.leftOrTop)
+ assertWithMessage("item needs to cover the whole viewport")
+ .that(targetBounds.rightOrBottom).isAtLeast(viewportBounds.rightOrBottom)
+ } else {
+ assertWithMessage("item needs to be fully inside the viewport")
+ .that(targetBounds.leftOrTop).isAtLeast(viewportBounds.leftOrTop)
+ assertWithMessage("item needs to be fully inside the viewport")
+ .that(targetBounds.rightOrBottom).isAtMost(viewportBounds.rightOrBottom)
+ }
+ }
+
+ private val Rect.leftOrTop: Float
+ get() = if (config.orientation == Vertical) top else left
+ private val Rect.rightOrBottom: Float
+ get() = if (config.orientation == Vertical) right else bottom
+
+ private fun DpRect.toPx(): Rect = with(rule.density) { toRect() }
+
+ private fun rowModifier(): Modifier = Modifier.composed {
+ with(LocalDensity.current) {
+ Modifier
+ .testTag(containerTag)
+ .requiredSize(config.viewportSizePx.toDp(), itemSizePx.toDp())
+ }
+ }
+
+ private fun columnModifier(): Modifier = Modifier.composed {
+ with(LocalDensity.current) {
+ Modifier
+ .testTag(containerTag)
+ .requiredSize(itemSizePx.toDp(), config.viewportSizePx.toDp())
+ }
+ }
+
+ private fun LazyListScope.Boxes() {
+ items(itemsAround) {
+ ClickableTestBox(color = if (it % 2 == 0) Color.Blue else Color.Red)
+ }
+ item {
+ ClickableTestBox(
+ color = Color.Yellow,
+ // Don't add the tag if the test says there is no target in the list
+ tag = if (config.targetPosition != NotInList) itemTag else defaultTag
+ )
+ }
+ items(itemsAround) {
+ ClickableTestBox(color = if (it % 2 == 0) Color.Green else Color.Cyan)
+ }
+ }
+
+ enum class Orientation {
+ HorizontalLtr,
+ HorizontalRtl,
+ Vertical
+ }
+
+ enum class ViewportSize(val sizePx: Int) {
+ SmallerThanItem(smallViewport),
+ BiggerThenItem(bigViewport)
+ }
+
+ enum class StartPosition(
+ val indexForSmallViewport: Int,
+ val offsetForSmallViewport: Int,
+ val indexForBigViewport: Int,
+ val offsetForBigViewport: Int
+ ) {
+ FullyAfter(0, 0, 0, 0),
+ PartiallyAfter(itemsAround - 1, 50, itemsAround - 1, 0),
+ CenterAlignedIn(itemsAround, 10, itemsAround - 1, 75),
+ PartiallyBefore(itemsAround, 70, itemsAround, 50),
+ FullyBefore(2 * itemsAround, 20, 2 * itemsAround - 1, 50),
+ NotInList(0, 0, 0, 0)
+ }
+}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt
index 9758dc7..513789a 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/gesturescope/SendSwipeVelocityTest.kt
@@ -22,12 +22,12 @@
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.performGesture
import androidx.compose.ui.test.swipeWithVelocity
import androidx.compose.ui.test.util.ClickableTestBox
-import androidx.compose.ui.test.util.InputDispatcherTestRule
import androidx.compose.ui.test.util.SinglePointerInputRecorder
import androidx.compose.ui.test.util.assertOnlyLastEventIsUp
import androidx.compose.ui.test.util.assertTimestampsAreIncreasing
@@ -39,7 +39,6 @@
import com.google.common.truth.Truth.assertThat
import org.junit.Rule
import org.junit.Test
-import org.junit.rules.TestRule
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
import kotlin.math.max
@@ -53,8 +52,7 @@
data class TestConfig(
val direction: Direction,
val durationMillis: Long,
- val velocity: Float,
- val eventPeriod: Long
+ val velocity: Float
)
enum class Direction(val from: Offset, val to: Offset) {
@@ -69,19 +67,10 @@
@Parameterized.Parameters(name = "{0}")
fun createTestSet(): List<TestConfig> {
return mutableListOf<TestConfig>().apply {
- for (period in listOf(10L, 7L, 16L)) {
- for (direction in Direction.values()) {
- for (duration in listOf(100, 500, 1000)) {
- for (velocity in listOf(79f, 200f, 1500f, 4691f)) {
- add(
- TestConfig(
- direction,
- duration.toLong(),
- velocity,
- period
- )
- )
- }
+ for (direction in Direction.values()) {
+ for (duration in listOf(100, 500, 1000)) {
+ for (velocity in listOf(79f, 200f, 1500f, 4691f)) {
+ add(TestConfig(direction, duration.toLong(), velocity))
}
}
}
@@ -100,7 +89,6 @@
private val end get() = config.direction.to
private val duration get() = config.durationMillis
private val velocity get() = config.velocity
- private val eventPeriod get() = config.eventPeriod
private val expectedXVelocity = when (config.direction) {
Direction.LeftToRight -> velocity
@@ -117,9 +105,6 @@
@get:Rule
val rule = createComposeRule()
- @get:Rule
- val inputDispatcherRule: TestRule = InputDispatcherTestRule(eventPeriodOverride = eventPeriod)
-
private val recorder = SinglePointerInputRecorder()
@Test
@@ -138,7 +123,7 @@
rule.runOnIdle {
recorder.run {
val durationMs = duration
- val minimumEventSize = max(2, (durationMs / eventPeriod).toInt())
+ val minimumEventSize = max(2, (durationMs / eventPeriodMillis).toInt())
assertThat(events.size).isAtLeast(minimumEventSize)
assertOnlyLastEventIsUp()
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt
new file mode 100644
index 0000000..9c8a713
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/PositionsTest.kt
@@ -0,0 +1,168 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.test.injectionscope
+
+import androidx.compose.foundation.horizontalScroll
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.center
+import androidx.compose.ui.test.height
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performGesture
+import androidx.compose.ui.test.performMultiModalInput
+import androidx.compose.ui.test.topLeft
+import androidx.compose.ui.test.util.ClickableTestBox
+import androidx.compose.ui.test.util.ClickableTestBox.defaultTag
+import androidx.compose.ui.test.width
+import androidx.compose.ui.unit.Density
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+
+@MediumTest
+class PositionsTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun testCornersEdgesAndCenter() {
+ rule.setContent { ClickableTestBox(width = 3f, height = 100f) }
+
+ rule.onNodeWithTag(defaultTag).performMultiModalInput {
+ assertThat(width).isEqualTo(3)
+ assertThat(height).isEqualTo(100)
+
+ assertThat(left).isEqualTo(0f)
+ assertThat(centerX).isEqualTo(1.5f)
+ assertThat(right).isEqualTo(2f)
+
+ assertThat(top).isEqualTo(0f)
+ assertThat(centerY).isEqualTo(50f)
+ assertThat(bottom).isEqualTo(99f)
+
+ assertThat(topLeft).isEqualTo(Offset(0f, 0f))
+ assertThat(topCenter).isEqualTo(Offset(1.5f, 0f))
+ assertThat(topRight).isEqualTo(Offset(2f, 0f))
+ assertThat(centerLeft).isEqualTo(Offset(0f, 50f))
+ assertThat(center).isEqualTo(Offset(1.5f, 50f))
+ assertThat(centerRight).isEqualTo(Offset(2f, 50f))
+ assertThat(bottomLeft).isEqualTo(Offset(0f, 99f))
+ assertThat(bottomCenter).isEqualTo(Offset(1.5f, 99f))
+ assertThat(bottomRight).isEqualTo(Offset(2f, 99f))
+ }
+ }
+
+ @Test
+ fun testRelativeOffset() {
+ rule.setContent { ClickableTestBox() }
+
+ rule.onNodeWithTag(defaultTag).performMultiModalInput {
+ assertThat(percentOffset(.1f, .1f)).isEqualTo(Offset(10f, 10f))
+ assertThat(percentOffset(-.2f, 0f)).isEqualTo(Offset(-20f, 0f))
+ assertThat(percentOffset(.25f, -.5f)).isEqualTo(Offset(25f, -50f))
+ assertThat(percentOffset(0f, .5f)).isEqualTo(Offset(0f, 50f))
+ assertThat(percentOffset(2f, -2f)).isEqualTo(Offset(200f, -200f))
+ }
+ }
+
+ @Test
+ fun testDensity() {
+ val expectedDensity = Density(0.8238974f, 0.923457f) // random value
+ rule.setContent {
+ CompositionLocalProvider(
+ LocalDensity provides expectedDensity
+ ) {
+ ClickableTestBox(width = 3f, height = 100f)
+ }
+ }
+ rule.onNodeWithTag(defaultTag).performMultiModalInput {
+ assertThat(this.density).isEqualTo(expectedDensity.density)
+ assertThat(this.fontScale).isEqualTo(expectedDensity.fontScale)
+ }
+ }
+
+ @Test
+ fun testSizeInViewport_column_startAtStart() {
+ testPositionsInViewport(isVertical = true, reverseScrollDirection = false)
+ }
+
+ @Test
+ fun testSizeInViewport_column_startAtEnd() {
+ testPositionsInViewport(isVertical = true, reverseScrollDirection = true)
+ }
+
+ @Test
+ fun testSizeInViewport_row_startAtStart() {
+ testPositionsInViewport(isVertical = false, reverseScrollDirection = false)
+ }
+
+ @Test
+ fun testSizeInViewport_row_startAtEnd() {
+ testPositionsInViewport(isVertical = false, reverseScrollDirection = true)
+ }
+
+ private fun testPositionsInViewport(isVertical: Boolean, reverseScrollDirection: Boolean) {
+ rule.setContent {
+ with(LocalDensity.current) {
+ if (isVertical) {
+ Column(
+ Modifier.requiredSize(100.toDp())
+ .testTag("viewport")
+ .verticalScroll(
+ rememberScrollState(),
+ reverseScrolling = reverseScrollDirection
+ )
+ ) {
+ ClickableTestBox(width = 200f, height = 200f)
+ ClickableTestBox(width = 200f, height = 200f)
+ }
+ } else {
+ Row(
+ Modifier.requiredSize(100.toDp())
+ .testTag("viewport")
+ .horizontalScroll(
+ rememberScrollState(),
+ reverseScrolling = reverseScrollDirection
+ )
+ ) {
+ ClickableTestBox(width = 200f, height = 200f)
+ ClickableTestBox(width = 200f, height = 200f)
+ }
+ }
+ }
+ }
+
+ @Suppress("DEPRECATION")
+ rule.onNodeWithTag("viewport").performGesture {
+ assertThat(width).isEqualTo(100)
+ assertThat(height).isEqualTo(100)
+ assertThat(center).isEqualTo(Offset(50f, 50f))
+ assertThat(topLeft).isEqualTo(Offset.Zero)
+ }
+ }
+}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt
index da26409..c9023dd 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/CancelTest.kt
@@ -19,12 +19,12 @@
import androidx.compose.testutils.expectError
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.TouchInjectionScope
-import androidx.compose.ui.test.injectionscope.touch.Common.performMultiModalInput
import androidx.compose.ui.test.injectionscope.touch.Common.performTouchInput
-import androidx.compose.ui.test.inputdispatcher.verifyNoTouchGestureInProgress
import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.util.ClickableTestBox
import androidx.compose.ui.test.util.MultiPointerInputRecorder
+import androidx.compose.ui.test.util.assertNoTouchGestureInProgress
import androidx.compose.ui.test.util.assertTimestampsAreIncreasing
import androidx.test.filters.MediumTest
import com.google.common.truth.Truth.assertThat
@@ -70,7 +70,7 @@
}
// And no gesture is in progress
- rule.performMultiModalInput { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(ClickableTestBox.defaultTag).assertNoTouchGestureInProgress()
}
@Test
@@ -89,7 +89,7 @@
}
// And no gesture is in progress
- rule.performMultiModalInput { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(ClickableTestBox.defaultTag).assertNoTouchGestureInProgress()
}
@Test
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt
index 0399a72..3fa462e 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/ClickTest.kt
@@ -20,6 +20,7 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.TouchInjectionScope
import androidx.compose.ui.test.click
import androidx.compose.ui.test.junit4.ComposeTestRule
@@ -101,8 +102,8 @@
val id = events[0].id
events[0].verify(t0 + 0, id, true, position)
- events[1].verify(t0 + 10, id, true, position)
- events[2].verify(t0 + 10, id, false, position)
+ events[1].verify(t0 + eventPeriodMillis, id, true, position)
+ events[2].verify(t0 + eventPeriodMillis, id, false, position)
}
private fun ComposeTestRule.click(tag: String) {
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt
index 8dce6e9..c0cf1da 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/DoubleClickTest.kt
@@ -17,9 +17,12 @@
package androidx.compose.ui.test.injectionscope.touch
import androidx.compose.foundation.gestures.detectTapGestures
+import androidx.compose.testutils.TestViewConfiguration
+import androidx.compose.testutils.WithViewConfiguration
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.TouchInjectionScope
import androidx.compose.ui.test.doubleClick
import androidx.compose.ui.test.junit4.createComposeRule
@@ -46,6 +49,14 @@
data class TestConfig(val position: Offset?, val delayMillis: Long?)
companion object {
+ private const val DoubleTapMin = 40L
+ private const val DoubleTapMax = 200L
+ private const val DefaultDoubleTapTimeMillis = (DoubleTapMin + DoubleTapMax) / 2
+ private val testViewConfiguration = TestViewConfiguration(
+ doubleTapMinTimeMillis = DoubleTapMin,
+ doubleTapTimeoutMillis = DoubleTapMax
+ )
+
@JvmStatic
@Parameterized.Parameters(name = "{0}")
fun createTestSet(): List<TestConfig> {
@@ -65,7 +76,7 @@
private val expectedClickPosition =
config.position ?: Offset(defaultSize / 2, defaultSize / 2)
- private val expectedDelay = config.delayMillis ?: 145L
+ private val expectedDelay = config.delayMillis ?: DefaultDoubleTapTimeMillis
private fun recordDoubleClick(position: Offset) {
recordedDoubleClicks.add(position)
@@ -76,11 +87,13 @@
// Given some content
val recorder = SinglePointerInputRecorder()
rule.setContent {
- ClickableTestBox(
- Modifier
- .pointerInput(Unit) { detectTapGestures(onDoubleTap = ::recordDoubleClick) }
- .then(recorder)
- )
+ WithViewConfiguration(testViewConfiguration) {
+ ClickableTestBox(
+ Modifier
+ .pointerInput(Unit) { detectTapGestures(onDoubleTap = ::recordDoubleClick) }
+ .then(recorder)
+ )
+ }
}
// When we inject a double click
@@ -111,14 +124,14 @@
val id0 = events[0].id
events[0].verify(t0 + 0, id0, true, position)
- events[1].verify(t0 + 10, id0, true, position)
- events[2].verify(t0 + 10, id0, false, position)
+ events[1].verify(t0 + eventPeriodMillis, id0, true, position)
+ events[2].verify(t0 + eventPeriodMillis, id0, false, position)
val t1 = events[2].timestamp + expectedDelay
val id1 = events[3].id
events[3].verify(t1 + 0, id1, true, position)
- events[4].verify(t1 + 10, id1, true, position)
- events[5].verify(t1 + 10, id1, false, position)
+ events[4].verify(t1 + eventPeriodMillis, id1, true, position)
+ events[5].verify(t1 + eventPeriodMillis, id1, false, position)
}
}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt
index d9e73cdb..a46802d 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/LongClickTest.kt
@@ -20,10 +20,13 @@
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.testutils.TestViewConfiguration
+import androidx.compose.testutils.WithViewConfiguration
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.TouchInjectionScope
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.longClick
@@ -37,12 +40,13 @@
import androidx.compose.ui.test.util.verify
import androidx.test.filters.MediumTest
import com.google.common.truth.Truth.assertThat
-import com.google.common.truth.Truth.assertWithMessage
-import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
+import kotlin.math.max
+import kotlin.math.roundToInt
+import kotlin.math.roundToLong
/**
* Tests [TouchInjectionScope.longClick] with arguments. Verifies that the click is in the middle
@@ -55,6 +59,11 @@
data class TestConfig(val position: Offset?, val durationMillis: Long?)
companion object {
+ private const val LongPressTimeoutMillis = 300L
+ private val testViewConfiguration = TestViewConfiguration(
+ longPressTimeoutMillis = LongPressTimeoutMillis
+ )
+
@JvmStatic
@Parameterized.Parameters(name = "{0}")
fun createTestSet(): List<TestConfig> {
@@ -73,33 +82,27 @@
private val recordedLongClicks = mutableListOf<Offset>()
private val expectedClickPosition =
config.position ?: Offset(defaultSize / 2, defaultSize / 2)
- private val expectedDuration = config.durationMillis ?: 600L
+ private val expectedDuration = config.durationMillis ?: LongPressTimeoutMillis + 100L
private fun recordLongPress(position: Offset) {
recordedLongClicks.add(position)
}
- @Before
- fun checkDuration() {
- assertWithMessage(
- "Test must either use a duration that is a multiple of 10, or the assertion needs to " +
- "be rewritten to support arbitrary durations"
- ).that(expectedDuration % 10).isEqualTo(0)
- }
-
@Test
fun longClick() {
// Given some content
val recorder = SinglePointerInputRecorder()
rule.setContent {
- Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
- ClickableTestBox(
- Modifier
- .pointerInput(Unit) {
- detectTapGestures(onLongPress = ::recordLongPress)
- }
- .then(recorder)
- )
+ WithViewConfiguration(testViewConfiguration) {
+ Box(Modifier.fillMaxSize().wrapContentSize(Alignment.BottomEnd)) {
+ ClickableTestBox(
+ Modifier
+ .pointerInput(Unit) {
+ detectTapGestures(onLongPress = ::recordLongPress)
+ }
+ .then(recorder)
+ )
+ }
}
}
@@ -127,12 +130,15 @@
}
private fun SinglePointerInputRecorder.assertIsLongClick(position: Offset) {
- assertThat(events.size).isAtLeast(2)
+ val steps = max(1, (expectedDuration / eventPeriodMillis.toDouble()).roundToInt())
val t0 = events[0].timestamp
val id = events[0].id
+ assertThat(events).hasSize(steps + 2)
events.dropLast(1).forEachIndexed { i, event ->
- event.verify(t0 + i * 10, id, true, position)
+ // Don't check the timestamp
+ val t = t0 + (expectedDuration * i / steps.toDouble()).roundToLong()
+ event.verify(t, id, true, position)
}
events.last().verify(t0 + expectedDuration, id, false, position)
}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt
index be92d7f..17b77cd 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveByTest.kt
@@ -19,6 +19,7 @@
import android.os.SystemClock.sleep
import androidx.compose.testutils.expectError
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.TouchInjectionScope
import androidx.compose.ui.test.injectionscope.touch.Common.performTouchInput
import androidx.compose.ui.test.junit4.createComposeRule
@@ -73,7 +74,7 @@
var t = events[0].getPointer(0).timestamp
val pointerId = events[0].getPointer(0).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[1].pointerCount).isEqualTo(1)
events[1].getPointer(0).verify(t, pointerId, true, downPosition1 + delta1)
}
@@ -98,12 +99,12 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, downPosition1 + delta1)
events[2].getPointer(1).verify(t, pointerId2, true, downPosition2)
- t += 10
+ t += eventPeriodMillis
assertThat(events[3].pointerCount).isEqualTo(2)
events[3].getPointer(0).verify(t, pointerId1, true, downPosition1 + delta1)
events[3].getPointer(1).verify(t, pointerId2, true, downPosition2 + delta2)
@@ -131,7 +132,7 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, downPosition1 + delta1)
events[2].getPointer(1).verify(t, pointerId2, true, downPosition2 + delta2)
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt
index 371064e..cd5158d 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveToTest.kt
@@ -19,6 +19,7 @@
import android.os.SystemClock.sleep
import androidx.compose.testutils.expectError
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.TouchInjectionScope
import androidx.compose.ui.test.injectionscope.touch.Common.performTouchInput
import androidx.compose.ui.test.junit4.createComposeRule
@@ -73,7 +74,7 @@
var t = events[0].getPointer(0).timestamp
val pointerId = events[0].getPointer(0).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[1].pointerCount).isEqualTo(1)
events[1].getPointer(0).verify(t, pointerId, true, moveToPosition1)
}
@@ -98,12 +99,12 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, moveToPosition1)
events[2].getPointer(1).verify(t, pointerId2, true, downPosition2)
- t += 10
+ t += eventPeriodMillis
assertThat(events[3].pointerCount).isEqualTo(2)
events[3].getPointer(0).verify(t, pointerId1, true, moveToPosition1)
events[3].getPointer(1).verify(t, pointerId2, true, moveToPosition2)
@@ -131,7 +132,7 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, moveToPosition1)
events[2].getPointer(1).verify(t, pointerId2, true, moveToPosition2)
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt
new file mode 100644
index 0000000..9e60740
--- /dev/null
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/MoveWithHistoryTest.kt
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.test.injectionscope.touch
+
+import androidx.compose.foundation.ScrollState
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.WithTouchSlop
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.ExperimentalTestApi
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.test.util.ClickableTestBox
+import androidx.compose.ui.test.util.SinglePointerInputRecorder
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import kotlin.math.roundToInt
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class MoveWithHistoryTest {
+ companion object {
+ private const val tag = "widget"
+ }
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ private val recorder = SinglePointerInputRecorder()
+
+ @Composable
+ fun Ui(alignment: Alignment) {
+ Box(Modifier.fillMaxSize().wrapContentSize(alignment)) {
+ ClickableTestBox(modifier = recorder, tag = tag)
+ }
+ }
+
+ @Test
+ fun flingScrollableWithHistorical() {
+ val scrollState = ScrollState(initial = 0)
+
+ flingScrollableImpl(scrollState, useHistoricalEvents = true)
+
+ // Scrolled a large amount after the fling animation (caused by historical events) ends.
+ Truth.assertThat(scrollState.value).isGreaterThan(500)
+ }
+
+ @Test
+ fun flingScrollableWithoutHistorical() {
+ val scrollState = ScrollState(initial = 0)
+
+ flingScrollableImpl(scrollState, useHistoricalEvents = false)
+
+ // We expect only finger-distance scrolling for this sequence without historical events.
+ // This test is intended as a verification that the flingScrollableWithHistorical
+ // is actually testing historical events plumbing instead of accidentally passing
+ // due to fling velocity tracker implementation details.
+ Truth.assertThat(scrollState.value).isLessThan(101)
+ }
+
+ fun flingScrollableImpl(scrollState: ScrollState, useHistoricalEvents: Boolean) {
+ val touchSlop = 18f
+ rule.setContent {
+ WithTouchSlop(touchSlop) {
+ with(LocalDensity.current) {
+ // Scrollable with a viewport the size of 10 boxes
+ Column(
+ Modifier
+ .testTag("scrollable")
+ .requiredSize(100.toDp(), 1000.toDp())
+ .verticalScroll(scrollState)
+ ) {
+ repeat(100) {
+ ClickableTestBox()
+ }
+ }
+ }
+ }
+ }
+
+ Truth.assertThat(scrollState.value).isEqualTo(0)
+ // numBoxes * boxHeight - viewportHeight = 100 * 100 - 1000
+ Truth.assertThat(scrollState.maxValue).isEqualTo(9000)
+
+ val swipeDistance = 20f - touchSlop
+ rule.onNodeWithTag("scrollable").performTouchInput {
+ // Simulate a rapid back and forth gesture which only moves 20px in 100ms if you
+ // only compare beginning and end, but much faster (70px in 16ms) when the intermediate
+ // historical events are included.
+ val from = topCenter + Offset(0f, 120f)
+ val to = topCenter + Offset(0f, 100f)
+
+ val historicalTimes = listOf(-16L, -8L)
+ val historicalCoordinates = listOf(to + Offset(0f, 70f), to + Offset(0f, 35f))
+ val delayMillis = 100L
+
+ down(from)
+ updatePointerTo(0, to)
+ if (useHistoricalEvents) {
+ @OptIn(ExperimentalTestApi::class)
+ moveWithHistory(historicalTimes, historicalCoordinates, delayMillis)
+ } else {
+ move(delayMillis)
+ }
+ up()
+ }
+ // Equal to swipe distance before fling animation starts
+ Truth.assertThat(scrollState.value).isEqualTo(swipeDistance.roundToInt())
+
+ rule.waitForIdle()
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt
index 741ef39..cba8992 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/injectionscope/touch/UpTest.kt
@@ -20,12 +20,12 @@
import androidx.compose.testutils.expectError
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.TouchInjectionScope
-import androidx.compose.ui.test.injectionscope.touch.Common.performMultiModalInput
import androidx.compose.ui.test.injectionscope.touch.Common.performTouchInput
-import androidx.compose.ui.test.inputdispatcher.verifyNoTouchGestureInProgress
import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.util.ClickableTestBox
import androidx.compose.ui.test.util.MultiPointerInputRecorder
+import androidx.compose.ui.test.util.assertNoTouchGestureInProgress
import androidx.compose.ui.test.util.assertTimestampsAreIncreasing
import androidx.compose.ui.test.util.verify
import androidx.test.filters.MediumTest
@@ -79,7 +79,7 @@
}
// And no gesture is in progress
- rule.performMultiModalInput { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(ClickableTestBox.defaultTag).assertNoTouchGestureInProgress()
}
@Test
@@ -110,7 +110,7 @@
}
// And no gesture is in progress
- rule.performMultiModalInput { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(ClickableTestBox.defaultTag).assertNoTouchGestureInProgress()
}
@Test
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
deleted file mode 100644
index 0f3d066..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
-
-import androidx.compose.testutils.expectError
-import androidx.compose.ui.geometry.Offset
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-class BatchingTest : InputDispatcherTest() {
-
- companion object {
- private const val cannotEnqueueError = "Can't enqueue touch event \\(.*\\), " +
- "events have already been \\(or are being\\) dispatched or disposed"
- private const val cannotSendError = "Events have already " +
- "been \\(or are being\\) dispatched or disposed"
- }
-
- /**
- * Tests that enqueue doesn't send, send sends and dispose doesn't send anything else
- *
- * Happy path
- */
- @Test
- fun enqueueSendDispose() {
- subject.enqueueTouchDown(0, Offset.Zero)
- subject.enqueueTouchMove()
- subject.enqueueTouchMove()
- assertThat(recorder.events).isEmpty()
-
- subject.sendAllSynchronous()
- assertThat(recorder.events).hasSize(3)
-
- subject.dispose()
- assertThat(recorder.events).hasSize(3)
- }
-
- /**
- * Tests that enqueue doesn't send, send sends and subsequent enqueue fails
- */
- @Test
- fun enqueueSendEnqueue() {
- subject.enqueueTouchDown(0, Offset.Zero)
- subject.enqueueTouchMove()
- subject.enqueueTouchMove()
- assertThat(recorder.events).isEmpty()
-
- subject.sendAllSynchronous()
- assertThat(recorder.events).hasSize(3)
-
- expectError<IllegalStateException>(expectedMessage = cannotEnqueueError) {
- subject.enqueueTouchMove()
- }
- assertThat(recorder.events).hasSize(3)
-
- // Do final check to see if the failed enqueue really didn't enqueue an event
- expectError<IllegalStateException>(expectedMessage = cannotSendError) {
- subject.sendAllSynchronous()
- }
- assertThat(recorder.events).hasSize(3)
- }
-
- /**
- * Tests that enqueue doesn't send, send sends and subsequent send fails
- */
- @Test
- fun enqueueSendSend() {
- subject.enqueueTouchDown(0, Offset.Zero)
- subject.enqueueTouchMove()
- subject.enqueueTouchMove()
- assertThat(recorder.events).isEmpty()
-
- subject.sendAllSynchronous()
- assertThat(recorder.events).hasSize(3)
-
- expectError<IllegalStateException>(expectedMessage = cannotSendError) {
- subject.sendAllSynchronous()
- }
- assertThat(recorder.events).hasSize(3)
- }
-
- /**
- * Tests that enqueue doesn't send, dispose doesn't send anything and subsequent enqueue fails
- */
- @Test
- fun enqueueDisposeEnqueue() {
- subject.enqueueTouchDown(0, Offset.Zero)
- subject.enqueueTouchMove()
- subject.enqueueTouchMove()
- assertThat(recorder.events).isEmpty()
-
- subject.dispose()
- assertThat(recorder.events).isEmpty()
-
- expectError<IllegalStateException>(expectedMessage = cannotEnqueueError) {
- subject.enqueueTouchMove()
- }
- assertThat(recorder.events).isEmpty()
-
- // Do final check to see if the failed enqueue really didn't enqueue an event
- expectError<IllegalStateException>(expectedMessage = cannotSendError) {
- subject.sendAllSynchronous()
- }
- assertThat(recorder.events).isEmpty()
- }
-
- /**
- * Tests that enqueue doesn't send, dispose doesn't send anything and subsequent send fails
- */
- @Test
- fun enqueueDisposeSend() {
- subject.enqueueTouchDown(0, Offset.Zero)
- subject.enqueueTouchMove()
- subject.enqueueTouchMove()
- assertThat(recorder.events).isEmpty()
-
- subject.dispose()
- assertThat(recorder.events).isEmpty()
-
- expectError<IllegalStateException>(expectedMessage = cannotSendError) {
- subject.sendAllSynchronous()
- }
- assertThat(recorder.events).isEmpty()
- }
-
- /**
- * Tests that enqueue doesn't send, dispose doesn't send anything and subsequent dispose
- * doesn't do anything either
- */
- @Test
- fun enqueueDisposeDispose() {
- subject.enqueueTouchDown(0, Offset.Zero)
- subject.enqueueTouchMove()
- subject.enqueueTouchMove()
- assertThat(recorder.events).isEmpty()
-
- subject.dispose()
- assertThat(recorder.events).isEmpty()
-
- subject.dispose()
- assertThat(recorder.events).isEmpty()
- }
-}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchCancelTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchCancelTest.kt
deleted file mode 100644
index 61a35b0..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchCancelTest.kt
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
-
-import android.view.MotionEvent.ACTION_CANCEL
-import android.view.MotionEvent.ACTION_DOWN
-import android.view.MotionEvent.ACTION_POINTER_DOWN
-import androidx.compose.testutils.expectError
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.test.AndroidInputDispatcher
-import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
-import androidx.compose.ui.test.util.Finger
-import androidx.compose.ui.test.util.Touchscreen
-import androidx.compose.ui.test.util.assertHasValidEventTimes
-import androidx.compose.ui.test.util.verifyEvent
-import androidx.compose.ui.test.util.verifyPointer
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-/**
- * Tests if [AndroidInputDispatcher.enqueueTouchCancel] works
- */
-@SmallTest
-class TouchCancelTest : InputDispatcherTest() {
- companion object {
- // pointerIds
- private const val pointer1 = 11
- private const val pointer2 = 22
-
- // positions (used with corresponding pointerId: pointerX with positionX_Y)
- private val position1_1 = Offset(11f, 11f)
- private val position2_1 = Offset(21f, 21f)
- }
-
- private fun AndroidInputDispatcher.generateCancelAndCheckPointers(delay: Long? = null) {
- generateTouchCancelAndCheck(delay)
- assertThat(getCurrentTouchPosition(pointer1)).isNull()
- assertThat(getCurrentTouchPosition(pointer2)).isNull()
- }
-
- @Test
- fun onePointer() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.advanceEventTime()
- subject.generateCancelAndCheckPointers()
- subject.verifyNoTouchGestureInProgress()
- subject.sendAllSynchronous()
- recorder.assertHasValidEventTimes()
-
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(2)
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- t += eventPeriodMillis
- this[1].verifyEvent(1, ACTION_CANCEL, 0, t, Touchscreen)
- this[1].verifyPointer(pointer1, position1_1, Finger)
- }
- }
-
- @Test
- fun multiplePointers() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.advanceEventTime()
- subject.generateCancelAndCheckPointers()
- subject.verifyNoTouchGestureInProgress()
- subject.sendAllSynchronous()
- recorder.assertHasValidEventTimes()
-
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(3)
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_CANCEL, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_1, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
- }
- }
-
- @Test
- fun enqueueTouchCancel_withoutDown() {
- expectError<IllegalStateException> {
- subject.enqueueTouchCancel()
- }
- }
-
- @Test
- fun enqueueTouchCancel_afterUp() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchUp(pointer1)
- expectError<IllegalStateException> {
- subject.enqueueTouchCancel()
- }
- }
-
- @Test
- fun enqueueTouchCancel_afterCancel() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchCancel()
- expectError<IllegalStateException> {
- subject.enqueueTouchCancel()
- }
- }
-}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchDownTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchDownTest.kt
deleted file mode 100644
index 078e530..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchDownTest.kt
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
-
-import android.view.MotionEvent.ACTION_DOWN
-import android.view.MotionEvent.ACTION_MOVE
-import android.view.MotionEvent.ACTION_POINTER_DOWN
-import android.view.MotionEvent.ACTION_POINTER_UP
-import androidx.compose.testutils.expectError
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.test.AndroidInputDispatcher
-import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
-import androidx.compose.ui.test.util.Finger
-import androidx.compose.ui.test.util.Touchscreen
-import androidx.compose.ui.test.util.assertHasValidEventTimes
-import androidx.compose.ui.test.util.verifyEvent
-import androidx.compose.ui.test.util.verifyPointer
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-/**
- * Tests if [AndroidInputDispatcher.enqueueTouchDown] works
- */
-@SmallTest
-class TouchDownTest : InputDispatcherTest() {
- companion object {
- // Pointer ids
- private const val pointer1 = 11
- private const val pointer2 = 22
- private const val pointer3 = 33
- private const val pointer4 = 44
-
- // Positions (mostly used with corresponding pointerId: pointerX with positionX)
- private val position1 = Offset(1f, 1f)
- private val position2 = Offset(2f, 2f)
- private val position3 = Offset(3f, 3f)
- private val position4 = Offset(4f, 4f)
-
- // Single alternative for pointer1
- private val position1_2 = Offset(12f, 12f)
- }
-
- @Test
- fun onePointer() {
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.sendAllSynchronous()
-
- val t = 0L
- recorder.assertHasValidEventTimes()
- assertThat(recorder.events).hasSize(1)
- recorder.events[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- recorder.events[0].verifyPointer(pointer1, position1, Finger)
- }
-
- @Test
- fun twoPointers_ascending() {
- // 2 fingers, sent in ascending order of pointerId (matters for actionIndex)
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.generateTouchDownAndCheck(pointer2, position2)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- val t = 0L
- assertThat(this).hasSize(2)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1, Finger)
- this[1].verifyPointer(pointer2, position2, Finger)
- }
- }
-
- @Test
- fun twoPointers_descending() {
- // 2 fingers, sent in descending order of pointerId (matters for actionIndex)
- subject.generateTouchDownAndCheck(pointer2, position2)
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- val t = 0L
- assertThat(this).hasSize(2)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer2
- this[0].verifyPointer(pointer2, position2, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 0, t, Touchscreen) // pointer1
- this[1].verifyPointer(pointer1, position1, Finger)
- this[1].verifyPointer(pointer2, position2, Finger)
- }
- }
-
- @Test
- fun fourPointers() {
- // 4 fingers, sent in non-trivial order of pointerId (matters for actionIndex)
-
- subject.generateTouchDownAndCheck(pointer3, position3)
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.generateTouchDownAndCheck(pointer4, position4)
- subject.generateTouchDownAndCheck(pointer2, position2)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- val t = 0L
- assertThat(this).hasSize(4)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer3
- this[0].verifyPointer(pointer3, position3, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 0, t, Touchscreen) // pointer1
- this[1].verifyPointer(pointer1, position1, Finger)
- this[1].verifyPointer(pointer3, position3, Finger)
-
- this[2].verifyEvent(3, ACTION_POINTER_DOWN, 2, t, Touchscreen) // pointer4
- this[2].verifyPointer(pointer1, position1, Finger)
- this[2].verifyPointer(pointer3, position3, Finger)
- this[2].verifyPointer(pointer4, position4, Finger)
-
- this[3].verifyEvent(4, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[3].verifyPointer(pointer1, position1, Finger)
- this[3].verifyPointer(pointer2, position2, Finger)
- this[3].verifyPointer(pointer3, position3, Finger)
- this[3].verifyPointer(pointer4, position4, Finger)
- }
- }
-
- @Test
- fun staggeredDown() {
- // 4 fingers, going down at different times
-
- subject.generateTouchDownAndCheck(pointer3, position3)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.generateTouchDownAndCheck(pointer2, position2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchDownAndCheck(pointer4, position4)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(8)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer3
- this[0].verifyPointer(pointer3, position3, Finger)
-
- t += eventPeriodMillis
- this[1].verifyEvent(1, ACTION_MOVE, 0, t, Touchscreen)
- this[1].verifyPointer(pointer3, position3, Finger)
-
- this[2].verifyEvent(2, ACTION_POINTER_DOWN, 0, t, Touchscreen) // pointer1
- this[2].verifyPointer(pointer1, position1, Finger)
- this[2].verifyPointer(pointer3, position3, Finger)
-
- this[3].verifyEvent(3, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[3].verifyPointer(pointer1, position1, Finger)
- this[3].verifyPointer(pointer2, position2, Finger)
- this[3].verifyPointer(pointer3, position3, Finger)
-
- for (i in 4..6) {
- t += eventPeriodMillis
- this[i].verifyEvent(3, ACTION_MOVE, 0, t, Touchscreen)
- this[i].verifyPointer(pointer1, position1, Finger)
- this[i].verifyPointer(pointer2, position2, Finger)
- this[i].verifyPointer(pointer3, position3, Finger)
- }
-
- this[7].verifyEvent(4, ACTION_POINTER_DOWN, 3, t, Touchscreen) // pointer4
- this[7].verifyPointer(pointer1, position1, Finger)
- this[7].verifyPointer(pointer2, position2, Finger)
- this[7].verifyPointer(pointer3, position3, Finger)
- this[7].verifyPointer(pointer4, position4, Finger)
- }
- }
-
- @Test
- fun nonOverlappingPointers() {
- // 3 fingers, where the 1st finger goes up before the 3rd finger goes down (no overlap)
-
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.generateTouchDownAndCheck(pointer2, position2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchUpAndCheck(pointer1)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchDownAndCheck(pointer3, position3)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(6)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1, Finger)
- this[1].verifyPointer(pointer2, position2, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1, Finger)
- this[2].verifyPointer(pointer2, position2, Finger)
-
- this[3].verifyEvent(2, ACTION_POINTER_UP, 0, t, Touchscreen) // pointer1
- this[3].verifyPointer(pointer1, position1, Finger)
- this[3].verifyPointer(pointer2, position2, Finger)
-
- t += eventPeriodMillis
- this[4].verifyEvent(1, ACTION_MOVE, 0, t, Touchscreen)
- this[4].verifyPointer(pointer2, position2, Finger)
-
- this[5].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer3
- this[5].verifyPointer(pointer2, position2, Finger)
- this[5].verifyPointer(pointer3, position3, Finger)
- }
- }
-
- @Test
- fun pointerIdReuse() {
- // 3 fingers, where the 1st finger goes up before the 3rd finger goes down, and the 3rd
- // fingers reuses the pointerId of finger 1
-
- subject.generateTouchDownAndCheck(pointer1, position1)
- subject.generateTouchDownAndCheck(pointer2, position2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchUpAndCheck(pointer1)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchDownAndCheck(pointer1, position1_2)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(6)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1, Finger)
- this[1].verifyPointer(pointer2, position2, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1, Finger)
- this[2].verifyPointer(pointer2, position2, Finger)
-
- this[3].verifyEvent(2, ACTION_POINTER_UP, 0, t, Touchscreen) // pointer1
- this[3].verifyPointer(pointer1, position1, Finger)
- this[3].verifyPointer(pointer2, position2, Finger)
-
- t += eventPeriodMillis
- this[4].verifyEvent(1, ACTION_MOVE, 0, t, Touchscreen)
- this[4].verifyPointer(pointer2, position2, Finger)
-
- this[5].verifyEvent(2, ACTION_POINTER_DOWN, 0, t, Touchscreen) // pointer1
- this[5].verifyPointer(pointer1, position1_2, Finger)
- this[5].verifyPointer(pointer2, position2, Finger)
- }
- }
-
- @Test
- fun enqueueTouchDown_afterDown() {
- subject.enqueueTouchDown(pointer1, position1)
- expectError<IllegalArgumentException> {
- subject.enqueueTouchDown(pointer1, position2)
- }
- }
-}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchMoveTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchMoveTest.kt
deleted file mode 100644
index 2ed3929..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchMoveTest.kt
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
-
-import android.view.MotionEvent.ACTION_CANCEL
-import android.view.MotionEvent.ACTION_DOWN
-import android.view.MotionEvent.ACTION_MOVE
-import android.view.MotionEvent.ACTION_POINTER_DOWN
-import android.view.MotionEvent.ACTION_POINTER_UP
-import androidx.compose.testutils.expectError
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.test.AndroidInputDispatcher
-import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
-import androidx.compose.ui.test.util.Finger
-import androidx.compose.ui.test.util.Touchscreen
-import androidx.compose.ui.test.util.assertHasValidEventTimes
-import androidx.compose.ui.test.util.verifyEvent
-import androidx.compose.ui.test.util.verifyPointer
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-/**
- * Tests if [AndroidInputDispatcher.updateTouchPointer] and
- * [AndroidInputDispatcher.enqueueTouchMove] work
- */
-@SmallTest
-class TouchMoveTest : InputDispatcherTest() {
- companion object {
- // pointerIds
- private const val pointer1 = 11
- private const val pointer2 = 22
- private const val pointer3 = 33
-
- // positions (used with corresponding pointerId: pointerX with positionX_Y)
- private val position1_1 = Offset(11f, 11f)
- private val position2_1 = Offset(21f, 21f)
- private val position3_1 = Offset(31f, 31f)
-
- private val position1_2 = Offset(12f, 12f)
- private val position2_2 = Offset(22f, 22f)
-
- private val position1_3 = Offset(13f, 13f)
- }
-
- private fun AndroidInputDispatcher.generateCancelAndCheckPointers() {
- generateTouchCancelAndCheck()
- assertThat(getCurrentTouchPosition(pointer1)).isNull()
- assertThat(getCurrentTouchPosition(pointer2)).isNull()
- assertThat(getCurrentTouchPosition(pointer3)).isNull()
- }
-
- @Test
- fun onePointer() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.sendAllSynchronous()
-
- var t = 0L
- recorder.assertHasValidEventTimes()
- assertThat(recorder.events).hasSize(2)
- recorder.events[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- recorder.events[0].verifyPointer(pointer1, position1_1, Finger)
-
- t += eventPeriodMillis
- recorder.events[1].verifyEvent(1, ACTION_MOVE, 0, t, Touchscreen) // pointer1
- recorder.events[1].verifyPointer(pointer1, position1_2, Finger)
- }
-
- @Test
- fun twoPointers_downDownMoveMove() {
- // 2 fingers, both go down before they move
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.updateTouchPointerAndCheck(pointer2, position2_2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(4)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_2, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[3].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[3].verifyPointer(pointer1, position1_2, Finger)
- this[3].verifyPointer(pointer2, position2_2, Finger)
- }
- }
-
- @Test
- fun twoPointers_downMoveDownMove() {
- // 2 fingers, 1st finger moves before 2nd finger goes down and moves
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer2, position2_2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(4)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- t += eventPeriodMillis
- this[1].verifyEvent(1, ACTION_MOVE, 0, t, Touchscreen)
- this[1].verifyPointer(pointer1, position1_2, Finger)
-
- this[2].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[2].verifyPointer(pointer1, position1_2, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[3].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[3].verifyPointer(pointer1, position1_2, Finger)
- this[3].verifyPointer(pointer2, position2_2, Finger)
- }
- }
-
- @Test
- fun updateTouchPointer_oneMovePerPointer() {
- // 2 fingers, use [updateTouchPointer] and [enqueueTouchMove]
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.updateTouchPointerAndCheck(pointer2, position2_2)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(3)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_2, Finger)
- this[2].verifyPointer(pointer2, position2_2, Finger)
- }
- }
-
- @Test
- fun updateTouchPointer_multipleMovesPerPointer() {
- // 2 fingers, do several [updateTouchPointer]s and then [enqueueTouchMove]
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.updateTouchPointerAndCheck(pointer1, position1_3)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(3)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_3, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
- }
- }
-
- @Test
- fun enqueueTouchMove_withoutUpdateTouchPointer() {
- // 2 fingers, do [enqueueTouchMove] without [updateTouchPointer]
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.advanceEventTime()
- subject.enqueueTouchMove()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(3)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_1, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
- }
- }
-
- @Test
- fun enqueueTouchDown_flushesPointerMovement() {
- // Movement from [updateTouchPointer] that hasn't been sent will be sent when sending DOWN
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.updateTouchPointerAndCheck(pointer1, position1_3)
- subject.advanceEventTime()
- subject.generateTouchDownAndCheck(pointer3, position3_1)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(4)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_MOVE, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_3, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
-
- this[3].verifyEvent(3, ACTION_POINTER_DOWN, 2, t, Touchscreen) // pointer2
- this[3].verifyPointer(pointer1, position1_3, Finger)
- this[3].verifyPointer(pointer2, position2_1, Finger)
- this[3].verifyPointer(pointer3, position3_1, Finger)
- }
- }
-
- @Test
- fun enqueueTouchUp_flushesPointerMovement() {
- // Movement from [updateTouchPointer] that hasn't been sent will be sent when sending UP
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.updateTouchPointerAndCheck(pointer1, position1_3)
- subject.advanceEventTime()
- subject.generateTouchUpAndCheck(pointer1)
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(3)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_POINTER_UP, 0, t, Touchscreen) // pointer1
- this[2].verifyPointer(pointer1, position1_3, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
- }
- }
-
- @Test
- fun enqueueTouchCancel_doesNotFlushPointerMovement() {
- // 2 fingers, both with pending movement.
- // CANCEL doesn't force a MOVE, but _does_ reflect the latest positions
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.updateTouchPointerAndCheck(pointer1, position1_2)
- subject.updateTouchPointerAndCheck(pointer2, position2_2)
- subject.advanceEventTime()
- subject.generateCancelAndCheckPointers()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(3)
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- t += eventPeriodMillis
- this[2].verifyEvent(2, ACTION_CANCEL, 0, t, Touchscreen)
- this[2].verifyPointer(pointer1, position1_2, Finger)
- this[2].verifyPointer(pointer2, position2_2, Finger)
- }
- }
-
- @Test
- fun updateTouchPointer_withoutDown() {
- expectError<IllegalStateException> {
- subject.updateTouchPointer(pointer1, position1_1)
- }
- }
-
- @Test
- fun updateTouchPointer_wrongPointerId() {
- subject.enqueueTouchDown(pointer1, position1_1)
- expectError<IllegalArgumentException> {
- subject.updateTouchPointer(pointer2, position1_2)
- }
- }
-
- @Test
- fun updateTouchPointer_afterUp() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchUp(pointer1)
- expectError<IllegalStateException> {
- subject.updateTouchPointer(pointer1, position1_2)
- }
- }
-
- @Test
- fun updateTouchPointer_afterCancel() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchCancel()
- expectError<IllegalStateException> {
- subject.updateTouchPointer(pointer1, position1_2)
- }
- }
-
- @Test
- fun enqueueTouchMove_withoutDown() {
- expectError<IllegalStateException> {
- subject.enqueueTouchMove()
- }
- }
-
- @Test
- fun enqueueTouchMove_afterUp() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchUp(pointer1)
- expectError<IllegalStateException> {
- subject.enqueueTouchMove()
- }
- }
-
- @Test
- fun enqueueTouchMove_afterCancel() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchCancel()
- expectError<IllegalStateException> {
- subject.enqueueTouchMove()
- }
- }
-}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchUpTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchUpTest.kt
deleted file mode 100644
index 9fbfc86..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/TouchUpTest.kt
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
-
-import android.view.MotionEvent.ACTION_DOWN
-import android.view.MotionEvent.ACTION_POINTER_DOWN
-import android.view.MotionEvent.ACTION_POINTER_UP
-import android.view.MotionEvent.ACTION_UP
-import androidx.compose.testutils.expectError
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.test.AndroidInputDispatcher
-import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
-import androidx.compose.ui.test.util.Finger
-import androidx.compose.ui.test.util.Touchscreen
-import androidx.compose.ui.test.util.assertHasValidEventTimes
-import androidx.compose.ui.test.util.verifyEvent
-import androidx.compose.ui.test.util.verifyPointer
-import androidx.test.filters.SmallTest
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-
-/**
- * Tests if [AndroidInputDispatcher.enqueueTouchUp] works
- */
-@SmallTest
-class TouchUpTest : InputDispatcherTest() {
- companion object {
- // pointerIds
- private const val pointer1 = 11
- private const val pointer2 = 22
-
- // positions (used with corresponding pointerId: pointerX with positionX_Y)
- private val position1_1 = Offset(11f, 11f)
- private val position2_1 = Offset(21f, 21f)
- }
-
- @Test
- fun onePointer() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchUpAndCheck(pointer1)
- subject.verifyNoTouchGestureInProgress()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- val t = 0L
- assertThat(this).hasSize(2)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(1, ACTION_UP, 0, t, Touchscreen) // pointer1
- this[1].verifyPointer(pointer1, position1_1, Finger)
- }
- }
-
- @Test
- fun onePointerWithDelay() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchUpAndCheck(pointer1, 2 * eventPeriodMillis)
- subject.verifyNoTouchGestureInProgress()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- var t = 0L
- assertThat(this).hasSize(2)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- t += 2 * eventPeriodMillis
- this[1].verifyEvent(1, ACTION_UP, 0, t, Touchscreen) // pointer1
- this[1].verifyPointer(pointer1, position1_1, Finger)
- }
- }
-
- @Test
- fun multiplePointers_ascending() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.generateTouchUpAndCheck(pointer1)
- subject.generateTouchUpAndCheck(pointer2)
- subject.verifyNoTouchGestureInProgress()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- val t = 0L
- assertThat(this).hasSize(4)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- this[2].verifyEvent(2, ACTION_POINTER_UP, 0, t, Touchscreen) // pointer1
- this[2].verifyPointer(pointer1, position1_1, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
-
- this[3].verifyEvent(1, ACTION_UP, 0, t, Touchscreen) // pointer2
- this[3].verifyPointer(pointer2, position2_1, Finger)
- }
- }
-
- @Test
- fun multiplePointers_descending() {
- subject.generateTouchDownAndCheck(pointer1, position1_1)
- subject.generateTouchDownAndCheck(pointer2, position2_1)
- subject.generateTouchUpAndCheck(pointer2)
- subject.generateTouchUpAndCheck(pointer1)
- subject.verifyNoTouchGestureInProgress()
- subject.sendAllSynchronous()
-
- recorder.assertHasValidEventTimes()
- recorder.events.apply {
- val t = 0L
- assertThat(this).hasSize(4)
-
- this[0].verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen) // pointer1
- this[0].verifyPointer(pointer1, position1_1, Finger)
-
- this[1].verifyEvent(2, ACTION_POINTER_DOWN, 1, t, Touchscreen) // pointer2
- this[1].verifyPointer(pointer1, position1_1, Finger)
- this[1].verifyPointer(pointer2, position2_1, Finger)
-
- this[2].verifyEvent(2, ACTION_POINTER_UP, 1, t, Touchscreen) // pointer2
- this[2].verifyPointer(pointer1, position1_1, Finger)
- this[2].verifyPointer(pointer2, position2_1, Finger)
-
- this[3].verifyEvent(1, ACTION_UP, 0, t, Touchscreen) // pointer1
- this[3].verifyPointer(pointer1, position1_1, Finger)
- }
- }
-
- @Test
- fun enqueueTouchUp_withoutDown() {
- expectError<IllegalStateException> {
- subject.enqueueTouchUp(pointer1)
- }
- }
-
- @Test
- fun enqueueTouchUp_wrongPointerId() {
- subject.enqueueTouchDown(pointer1, position1_1)
- expectError<IllegalArgumentException> {
- subject.enqueueTouchUp(pointer2)
- }
- }
-
- @Test
- fun enqueueTouchUp_afterUp() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchUp(pointer1)
- expectError<IllegalStateException> {
- subject.enqueueTouchUp(pointer1)
- }
- }
-
- @Test
- fun enqueueTouchUp_afterCancel() {
- subject.enqueueTouchDown(pointer1, position1_1)
- subject.enqueueTouchCancel()
- expectError<IllegalStateException> {
- subject.enqueueTouchUp(pointer1)
- }
- }
-}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt
index 4becfbf..d571f6e 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendCancelTest.kt
@@ -20,12 +20,14 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.cancel
import androidx.compose.ui.test.down
-import androidx.compose.ui.test.inputdispatcher.verifyNoTouchGestureInProgress
import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.partialgesturescope.Common.partialGesture
import androidx.compose.ui.test.up
import androidx.compose.ui.test.util.ClickableTestBox
+import androidx.compose.ui.test.util.ClickableTestBox.defaultTag
import androidx.compose.ui.test.util.MultiPointerInputRecorder
+import androidx.compose.ui.test.util.assertNoTouchGestureInProgress
import androidx.compose.ui.test.util.assertTimestampsAreIncreasing
import androidx.test.filters.MediumTest
import com.google.common.truth.Truth.assertThat
@@ -72,7 +74,7 @@
}
// And no gesture is in progress
- rule.partialGesture { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(defaultTag).assertNoTouchGestureInProgress()
}
@Suppress("DEPRECATION")
@@ -92,7 +94,7 @@
}
// And no gesture is in progress
- rule.partialGesture { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(defaultTag).assertNoTouchGestureInProgress()
}
@Suppress("DEPRECATION")
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt
index b0a34b5..e8b7aae 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveByTest.kt
@@ -19,6 +19,7 @@
import android.os.SystemClock.sleep
import androidx.compose.testutils.expectError
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.cancel
import androidx.compose.ui.test.down
import androidx.compose.ui.test.junit4.createComposeRule
@@ -79,7 +80,7 @@
var t = events[0].getPointer(0).timestamp
val pointerId = events[0].getPointer(0).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[1].pointerCount).isEqualTo(1)
events[1].getPointer(0).verify(t, pointerId, true, downPosition1 + delta1)
}
@@ -105,12 +106,12 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, downPosition1 + delta1)
events[2].getPointer(1).verify(t, pointerId2, true, downPosition2)
- t += 10
+ t += eventPeriodMillis
assertThat(events[3].pointerCount).isEqualTo(2)
events[3].getPointer(0).verify(t, pointerId1, true, downPosition1 + delta1)
events[3].getPointer(1).verify(t, pointerId2, true, downPosition2 + delta2)
@@ -139,7 +140,7 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, downPosition1 + delta1)
events[2].getPointer(1).verify(t, pointerId2, true, downPosition2 + delta2)
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt
index 2f2d2642..726127c 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendMoveToTest.kt
@@ -19,6 +19,7 @@
import android.os.SystemClock.sleep
import androidx.compose.testutils.expectError
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.cancel
import androidx.compose.ui.test.down
import androidx.compose.ui.test.junit4.createComposeRule
@@ -79,7 +80,7 @@
var t = events[0].getPointer(0).timestamp
val pointerId = events[0].getPointer(0).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[1].pointerCount).isEqualTo(1)
events[1].getPointer(0).verify(t, pointerId, true, moveToPosition1)
}
@@ -105,12 +106,12 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, moveToPosition1)
events[2].getPointer(1).verify(t, pointerId2, true, downPosition2)
- t += 10
+ t += eventPeriodMillis
assertThat(events[3].pointerCount).isEqualTo(2)
events[3].getPointer(0).verify(t, pointerId1, true, moveToPosition1)
events[3].getPointer(1).verify(t, pointerId2, true, moveToPosition2)
@@ -139,7 +140,7 @@
val pointerId1 = events[0].getPointer(0).id
val pointerId2 = events[1].getPointer(1).id
- t += 10
+ t += eventPeriodMillis
assertThat(events[2].pointerCount).isEqualTo(2)
events[2].getPointer(0).verify(t, pointerId1, true, moveToPosition1)
events[2].getPointer(1).verify(t, pointerId2, true, moveToPosition2)
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt
index 04fcfa6..1b3de68 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt
+++ b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/partialgesturescope/SendUpTest.kt
@@ -21,12 +21,14 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.cancel
import androidx.compose.ui.test.down
-import androidx.compose.ui.test.inputdispatcher.verifyNoTouchGestureInProgress
import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
import androidx.compose.ui.test.partialgesturescope.Common.partialGesture
import androidx.compose.ui.test.up
import androidx.compose.ui.test.util.ClickableTestBox
+import androidx.compose.ui.test.util.ClickableTestBox.defaultTag
import androidx.compose.ui.test.util.MultiPointerInputRecorder
+import androidx.compose.ui.test.util.assertNoTouchGestureInProgress
import androidx.compose.ui.test.util.assertTimestampsAreIncreasing
import androidx.compose.ui.test.util.verify
import androidx.test.filters.MediumTest
@@ -81,7 +83,7 @@
}
// And no gesture is in progress
- rule.partialGesture { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(defaultTag).assertNoTouchGestureInProgress()
}
@Test
@@ -112,7 +114,7 @@
}
// And no gesture is in progress
- rule.partialGesture { inputDispatcher.verifyNoTouchGestureInProgress() }
+ rule.onNodeWithTag(defaultTag).assertNoTouchGestureInProgress()
}
@Test
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/InputDispatcherTestRule.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/InputDispatcherTestRule.kt
deleted file mode 100644
index 8a489aa..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/InputDispatcherTestRule.kt
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.test.util
-
-import androidx.compose.ui.test.InputDispatcher
-import org.junit.rules.TestRule
-import org.junit.runner.Description
-import org.junit.runners.model.Statement
-
-/**
- * A test rule that modifies [InputDispatcher]s behavior. Can be used to disable dispatching
- * of MotionEvents in real time (skips the suspend before injection of an event) or to change
- * the time between consecutive injected events.
- *
- * @param eventPeriodOverride If set, specifies a different period in milliseconds between
- * two consecutive injected motion events injected by this [InputDispatcher]. If not
- * set, the event period of 10 milliseconds is unchanged.
- *
- * @see InputDispatcher.eventPeriodMillis
- */
-internal class InputDispatcherTestRule(private val eventPeriodOverride: Long? = null) : TestRule {
-
- override fun apply(base: Statement, description: Description?): Statement {
- return ModifyingStatement(base)
- }
-
- inner class ModifyingStatement(private val base: Statement) : Statement() {
- override fun evaluate() {
- if (eventPeriodOverride != null) {
- InputDispatcher.eventPeriodMillis = eventPeriodOverride
- }
- try {
- base.evaluate()
- } finally {
- if (eventPeriodOverride != null) {
- InputDispatcher.eventPeriodMillis = 10L
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/Truth.kt b/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/Truth.kt
deleted file mode 100644
index fcd31bd..0000000
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/Truth.kt
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.compose.ui.test.util
-
-import androidx.compose.ui.geometry.Offset
-import com.google.common.collect.Ordering
-import com.google.common.truth.FloatSubject
-import com.google.common.truth.Truth.assertThat
-import kotlin.math.sign
-
-/**
- * Checks if the subject is within [tolerance] of [f]. Shorthand for
- * `isWithin([tolerance]).of([f])`.
- */
-fun FloatSubject.isAlmostEqualTo(f: Float, tolerance: Float = 1e-3f) {
- isWithin(tolerance).of(f)
-}
-
-/**
- * Verifies that the [Offset] is equal to the given position with some tolerance. The default
- * tolerance is 0.001.
- */
-fun Offset.isAlmostEqualTo(position: Offset, tolerance: Float = 1e-3f) {
- assertThat(x).isAlmostEqualTo(position.x, tolerance)
- assertThat(y).isAlmostEqualTo(position.y, tolerance)
-}
-
-/**
- * Checks that the values are progressing in a monotonic direction between [a] and [b].
- * If [a] and [b] are equal, all values in the list should be that value too. The edges [a] and
- * [b] allow a [tolerance] for floating point imprecision, which is by default `0.001`.
- */
-fun List<Float>.isMonotonicBetween(a: Float, b: Float, tolerance: Float = 1e-3f) {
- val expectedSign = sign(b - a)
- if (expectedSign == 0f) {
- forEach { assertThat(it).isAlmostEqualTo(a, tolerance) }
- } else {
- forEach { assertThat(it).isAlmostBetween(a, b, tolerance) }
- zipWithNext { curr, next -> sign(next - curr) }.forEach {
- if (it != 0f) assertThat(it).isEqualTo(expectedSign)
- }
- }
-}
-
-fun List<Float>.assertSame(tolerance: Float = 0f) {
- if (size <= 1) {
- return
- }
- assertThat(minOrNull()!!).isWithin(2 * tolerance).of(maxOrNull()!!)
-}
-
-/**
- * Checks that the float value is between [a] and [b], allowing a [tolerance] on either side.
- * The order of [a] and [b] doesn't matter, the float value must be _between_ them. The default
- * tolerance is `0.001`.
- */
-fun FloatSubject.isAlmostBetween(a: Float, b: Float, tolerance: Float = 1e-3f) {
- if (a < b) {
- isAtLeast(a - tolerance)
- isAtMost(b + tolerance)
- } else {
- isAtLeast(b - tolerance)
- isAtMost(a + tolerance)
- }
-}
-
-fun <E : Comparable<E>> List<E>.assertIncreasing() {
- assertThat(this).isInOrder(Ordering.natural<E>())
-}
-
-fun <E : Comparable<E>> List<E>.assertDecreasing() {
- assertThat(this).isInOrder(Ordering.natural<E>().reverse<E>())
-}
diff --git a/compose/ui/ui-test/src/androidCommonTest/README.md b/compose/ui/ui-test/src/androidCommonTest/README.md
new file mode 100644
index 0000000..7b89295
--- /dev/null
+++ b/compose/ui/ui-test/src/androidCommonTest/README.md
@@ -0,0 +1,2 @@
+This folder holds source files that are built against the android platform
+and are shared between the `androidAndroidTest` and `test` variants.
\ No newline at end of file
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/MotionEventRecorder.kt
similarity index 60%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/MotionEventRecorder.kt
index 2ab52fb..5087359 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/MotionEventRecorder.kt
@@ -14,7 +14,20 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.compose.ui.test.util
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import android.view.MotionEvent
+
+internal class MotionEventRecorder {
+
+ private val _events = mutableListOf<MotionEvent>()
+ val events get() = _events as List<MotionEvent>
+
+ fun disposeEvents() {
+ _events.removeAll { it.recycle(); true }
+ }
+
+ fun recordEvent(event: MotionEvent) {
+ _events.add(MotionEvent.obtain(event))
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/MotionEvents.kt b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt
similarity index 62%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/MotionEvents.kt
rename to compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt
index 80f2a78..12a82ca 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/MotionEvents.kt
+++ b/compose/ui/ui-test/src/androidCommonTest/kotlin/androidx/compose/ui/test/util/Verifications.kt
@@ -19,35 +19,31 @@
import android.view.InputDevice
import android.view.MotionEvent
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.InputDispatcher
+import androidx.compose.ui.test.MultiModalInjectionScopeImpl
+import androidx.compose.ui.test.SemanticsNodeInteraction
+import com.google.common.collect.Ordering
+import com.google.common.truth.FloatSubject
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import kotlin.math.abs
+import kotlin.math.sign
-const val Finger = MotionEvent.TOOL_TYPE_FINGER
-const val Touchscreen = InputDevice.SOURCE_TOUCHSCREEN
+const val TypeFinger = MotionEvent.TOOL_TYPE_FINGER
const val TypeMouse = MotionEvent.TOOL_TYPE_MOUSE
+const val SourceTouchscreen = InputDevice.SOURCE_TOUCHSCREEN
const val SourceMouse = InputDevice.SOURCE_MOUSE
-internal class MotionEventRecorder {
-
- private val _events = mutableListOf<MotionEvent>()
- val events get() = _events as List<MotionEvent>
-
- fun disposeEvents() {
- _events.removeAll { it.recycle(); true }
- }
-
- fun recordEvent(event: MotionEvent) {
- _events.add(MotionEvent.obtain(event))
- }
+internal fun SemanticsNodeInteraction.assertNoTouchGestureInProgress() {
+ val failMessage = "Can't verify if a touch is in progress: failed to create an injection scope"
+ val node = fetchSemanticsNode(failMessage)
+ val scope = MultiModalInjectionScopeImpl(node, testContext)
+ assertThat(scope.inputDispatcher.isTouchInProgress).isFalse()
}
-val MotionEvent.relativeTime get() = eventTime - downTime
-
-val List<MotionEvent>.relativeEventTimes get() = map { it.relativeTime }
-
-val List<MotionEvent>.moveEvents
- get() = filter { it.action == MotionEvent.ACTION_MOVE }
+internal fun InputDispatcher.assertNoTouchGestureInProgress() {
+ assertThat(isTouchInProgress).isFalse()
+}
/**
* Asserts that all event times are after their corresponding down time, and that the event
@@ -65,48 +61,22 @@
}
}
-internal fun MotionEvent.verify(
- curve: (Long) -> Offset,
- expectedAction: Int,
- expectedRelativeTime: Long,
- expectedSource: Int,
- expectedToolType: Int
-) {
- verifyEvent(1, expectedAction, 0, expectedRelativeTime, expectedSource)
- // x and y can just be taken from the function. We're not testing the function, we're
- // testing if the MotionEvent sampled the function at the correct point
- verifyPointer(0, curve(expectedRelativeTime), expectedToolType)
-}
-
-internal fun MotionEvent.verify(
- expectedPosition: Offset,
- expectedAction: Int,
- expectedRelativeTime: Long,
- expectedSource: Int,
- expectedToolType: Int
-) {
- verifyEvent(1, expectedAction, 0, expectedRelativeTime, expectedSource)
- verifyPointer(0, expectedPosition, expectedToolType)
-}
-
-internal fun MotionEvent.verifyEvent(
+internal fun MotionEvent.verifyTouchEvent(
expectedPointerCount: Int,
expectedAction: Int,
expectedActionIndex: Int,
- expectedRelativeTime: Long,
- expectedSource: Int
+ expectedRelativeTime: Long
) {
assertThat(pointerCount).isEqualTo(expectedPointerCount)
assertThat(actionMasked).isEqualTo(expectedAction)
assertThat(actionIndex).isEqualTo(expectedActionIndex)
assertThat(relativeTime).isEqualTo(expectedRelativeTime)
- assertThat(source).isEqualTo(expectedSource)
+ assertThat(source).isEqualTo(SourceTouchscreen)
}
-internal fun MotionEvent.verifyPointer(
+internal fun MotionEvent.verifyTouchPointer(
expectedPointerId: Int,
- expectedPosition: Offset,
- expectedToolType: Int
+ expectedPosition: Offset
) {
var index = -1
for (i in 0 until pointerCount) {
@@ -118,7 +88,7 @@
assertThat(index).isAtLeast(0)
assertThat(getX(index)).isEqualTo(expectedPosition.x)
assertThat(getY(index)).isEqualTo(expectedPosition.y)
- assertThat(getToolType(index)).isEqualTo(expectedToolType)
+ assertThat(getToolType(index)).isEqualTo(TypeFinger)
}
internal fun MotionEvent.verifyMouseEvent(
@@ -189,3 +159,69 @@
)
}
}
+
+private val MotionEvent.relativeTime get() = eventTime - downTime
+
+/**
+ * Checks if the subject is within [tolerance] of [f]. Shorthand for
+ * `isWithin([tolerance]).of([f])`.
+ */
+fun FloatSubject.isAlmostEqualTo(f: Float, tolerance: Float = 1e-3f) {
+ isWithin(tolerance).of(f)
+}
+
+/**
+ * Verifies that the [Offset] is equal to the given position with some tolerance. The default
+ * tolerance is 0.001.
+ */
+fun Offset.isAlmostEqualTo(position: Offset, tolerance: Float = 1e-3f) {
+ assertThat(x).isAlmostEqualTo(position.x, tolerance)
+ assertThat(y).isAlmostEqualTo(position.y, tolerance)
+}
+
+/**
+ * Checks that the values are progressing in a monotonic direction between [a] and [b].
+ * If [a] and [b] are equal, all values in the list should be that value too. The edges [a] and
+ * [b] allow a [tolerance] for floating point imprecision, which is by default `0.001`.
+ */
+fun List<Float>.isMonotonicBetween(a: Float, b: Float, tolerance: Float = 1e-3f) {
+ val expectedSign = sign(b - a)
+ if (expectedSign == 0f) {
+ forEach { assertThat(it).isAlmostEqualTo(a, tolerance) }
+ } else {
+ forEach { assertThat(it).isAlmostBetween(a, b, tolerance) }
+ zipWithNext { curr, next -> sign(next - curr) }.forEach {
+ if (it != 0f) assertThat(it).isEqualTo(expectedSign)
+ }
+ }
+}
+
+fun List<Float>.assertSame(tolerance: Float = 0f) {
+ if (size <= 1) {
+ return
+ }
+ assertThat(minOrNull()!!).isWithin(2 * tolerance).of(maxOrNull()!!)
+}
+
+/**
+ * Checks that the float value is between [a] and [b], allowing a [tolerance] on either side.
+ * The order of [a] and [b] doesn't matter, the float value must be _between_ them. The default
+ * tolerance is `0.001`.
+ */
+fun FloatSubject.isAlmostBetween(a: Float, b: Float, tolerance: Float = 1e-3f) {
+ if (a < b) {
+ isAtLeast(a - tolerance)
+ isAtMost(b + tolerance)
+ } else {
+ isAtLeast(b - tolerance)
+ isAtMost(a + tolerance)
+ }
+}
+
+fun <E : Comparable<E>> List<E>.assertIncreasing() {
+ assertThat(this).isInOrder(Ordering.natural<E>())
+}
+
+fun <E : Comparable<E>> List<E>.assertDecreasing() {
+ assertThat(this).isInOrder(Ordering.natural<E>().reverse<E>())
+}
diff --git a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt
index f5ba233..a6efc50 100644
--- a/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt
+++ b/compose/ui/ui-test/src/androidMain/kotlin/androidx/compose/ui/test/AndroidInputDispatcher.android.kt
@@ -73,7 +73,7 @@
private val batchLock = Any()
private var batchedEvents = mutableListOf<MotionEvent>()
- private var acceptEvents = true
+ private var disposed = false
private var currentClockTime = currentTime
override fun PartialGesture.enqueueDown(pointerId: Int) {
@@ -87,6 +87,24 @@
enqueueTouchEvent(ACTION_MOVE, 0)
}
+ override fun PartialGesture.enqueueMoves(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<List<Offset>>
+ ) {
+ val entries = lastPositions.entries.sortedBy { it.key }
+ val absoluteHistoricalTimes = relativeHistoricalTimes.map { currentTime + it }
+ enqueueTouchEvent(
+ downTime = downTime,
+ action = ACTION_MOVE,
+ actionIndex = 0,
+ pointerIds = List(entries.size) { entries[it].key },
+ eventTimes = absoluteHistoricalTimes + listOf(currentTime),
+ coordinates = List(entries.size) {
+ historicalCoordinates[it] + listOf(entries[it].value)
+ }
+ )
+ }
+
override fun PartialGesture.enqueueUp(pointerId: Int) {
enqueueTouchEvent(
if (lastPositions.size == 1) ACTION_UP else ACTION_POINTER_UP,
@@ -148,11 +166,11 @@
val entries = lastPositions.entries.sortedBy { it.key }
enqueueTouchEvent(
downTime = downTime,
- eventTime = currentTime,
action = action,
actionIndex = actionIndex,
- coordinates = List(entries.size) { entries[it].value },
- pointerIds = List(entries.size) { entries[it].key }
+ pointerIds = List(entries.size) { entries[it].key },
+ eventTimes = listOf(currentTime),
+ coordinates = List(entries.size) { listOf(entries[it].value) }
)
}
@@ -161,58 +179,83 @@
*/
private fun enqueueTouchEvent(
downTime: Long,
- eventTime: Long,
action: Int,
actionIndex: Int,
- coordinates: List<Offset>,
- pointerIds: List<Int>
+ pointerIds: List<Int>,
+ eventTimes: List<Long>,
+ coordinates: List<List<Offset>>
) {
+ check(coordinates.size == pointerIds.size) {
+ "Coordinates size should equal pointerIds size " +
+ "(was: ${coordinates.size}, ${pointerIds.size})"
+ }
+ repeat(pointerIds.size) { pointerIndex ->
+ check(eventTimes.size == coordinates[pointerIndex].size) {
+ "Historical eventTimes size should equal coordinates[$pointerIndex] size " +
+ "(was: ${eventTimes.size}, ${coordinates[pointerIndex].size})"
+ }
+ }
+
synchronized(batchLock) {
- check(acceptEvents) {
+ ensureNotDisposed {
"Can't enqueue touch event (" +
"downTime=$downTime, " +
- "eventTime=$eventTime, " +
"action=$action, " +
"actionIndex=$actionIndex, " +
"pointerIds=$pointerIds, " +
- "coordinates=$coordinates" +
- "), events have already been (or are being) dispatched or disposed"
+ "eventTimes=$eventTimes, " +
+ "coordinates=$coordinates)"
}
val positionInScreen = root?.let {
val array = intArrayOf(0, 0)
it.view.getLocationOnScreen(array)
Offset(array[0].toFloat(), array[1].toFloat())
} ?: Offset.Zero
- batchedEvents.add(
- MotionEvent.obtain(
- /* downTime = */ downTime,
- /* eventTime = */ eventTime,
- /* action = */ action + (actionIndex shl ACTION_POINTER_INDEX_SHIFT),
- /* pointerCount = */ coordinates.size,
- /* pointerProperties = */ Array(coordinates.size) {
- MotionEvent.PointerProperties().apply {
- id = pointerIds[it]
- toolType = MotionEvent.TOOL_TYPE_FINGER
- }
- },
- /* pointerCoords = */ Array(coordinates.size) {
- MotionEvent.PointerCoords().apply {
- x = positionInScreen.x + coordinates[it].x
- y = positionInScreen.y + coordinates[it].y
- }
- },
- /* metaState = */ 0,
- /* buttonState = */ 0,
- /* xPrecision = */ 1f,
- /* yPrecision = */ 1f,
- /* deviceId = */ 0,
- /* edgeFlags = */ 0,
- /* source = */ InputDevice.SOURCE_TOUCHSCREEN,
- /* flags = */ 0
- ).apply {
- offsetLocation(-positionInScreen.x, -positionInScreen.y)
+ val motionEvent = MotionEvent.obtain(
+ /* downTime = */ downTime,
+ /* eventTime = */ eventTimes[0],
+ /* action = */ action + (actionIndex shl ACTION_POINTER_INDEX_SHIFT),
+ /* pointerCount = */ coordinates.size,
+ /* pointerProperties = */ Array(coordinates.size) { pointerIndex ->
+ MotionEvent.PointerProperties().apply {
+ id = pointerIds[pointerIndex]
+ toolType = MotionEvent.TOOL_TYPE_FINGER
+ }
+ },
+ /* pointerCoords = */ Array(coordinates.size) { pointerIndex ->
+ MotionEvent.PointerCoords().apply {
+ x = positionInScreen.x + coordinates[pointerIndex][0].x
+ y = positionInScreen.y + coordinates[pointerIndex][0].y
+ }
+ },
+ /* metaState = */ 0,
+ /* buttonState = */ 0,
+ /* xPrecision = */ 1f,
+ /* yPrecision = */ 1f,
+ /* deviceId = */ 0,
+ /* edgeFlags = */ 0,
+ /* source = */ InputDevice.SOURCE_TOUCHSCREEN,
+ /* flags = */ 0
+ ).apply {
+ // The current time & coordinates are the last element in the lists, and need to
+ // be passed into the final addBatch call. If there are no historical events,
+ // the list sizes are 1 and we don't need to call addBatch at all.
+ for (timeIndex in 1 until eventTimes.size) {
+ addBatch(
+ /* eventTime = */ eventTimes[timeIndex],
+ /* pointerCoords = */ Array(coordinates.size) { pointerIndex ->
+ MotionEvent.PointerCoords().apply {
+ x = positionInScreen.x + coordinates[pointerIndex][timeIndex].x
+ y = positionInScreen.y + coordinates[pointerIndex][timeIndex].y
+ }
+ },
+ /* metaState = */ 0
+ )
}
- )
+ offsetLocation(-positionInScreen.x, -positionInScreen.y)
+ }
+
+ batchedEvents.add(motionEvent)
}
}
@@ -238,7 +281,7 @@
axisDelta: Float = 0f
) {
synchronized(batchLock) {
- check(acceptEvents) {
+ ensureNotDisposed {
"Can't enqueue mouse event (" +
"downTime=$downTime, " +
"eventTime=$eventTime, " +
@@ -246,8 +289,7 @@
"coordinate=$coordinate, " +
"buttonState=$buttonState, " +
"axis=$axis, " +
- "axisDelta=$axisDelta" +
- "), events have already been (or are being) dispatched or disposed"
+ "axisDelta=$axisDelta)"
}
val positionInScreen = root?.let {
val array = intArrayOf(0, 0)
@@ -290,13 +332,19 @@
}
}
- override fun sendAllSynchronous() {
+ override fun flush() {
// Must inject on the main thread, because it might modify View properties
@OptIn(InternalTestApi::class)
testContext.testOwner.runOnUiThread {
- checkAndStopAcceptingEvents()
+ val events = synchronized(batchLock) {
+ ensureNotDisposed { "Can't flush events" }
+ mutableListOf<MotionEvent>().apply {
+ addAll(batchedEvents)
+ batchedEvents.clear()
+ }
+ }
- batchedEvents.forEach { event ->
+ events.forEach { event ->
// Before injecting the next event, pump the clock
// by the difference between this and the last event
advanceClockTime(event.eventTime - currentClockTime)
@@ -304,8 +352,6 @@
sendAndRecycleEvent(event)
}
}
- // Each invocation of perform.*Input (Actions.kt) uses a new instance of an input
- // dispatcher, so we don't have to reset firstEventTime after use
}
@OptIn(InternalTestApi::class)
@@ -316,20 +362,18 @@
}
}
- override fun onDispose() {
- stopAcceptingEvents()
- }
-
- private fun checkAndStopAcceptingEvents() {
- synchronized(batchLock) {
- check(acceptEvents) { "Events have already been (or are being) dispatched or disposed" }
- acceptEvents = false
+ private fun ensureNotDisposed(lazyMessage: () -> String) {
+ check(!disposed) {
+ "${lazyMessage()}, AndroidInputDispatcher has already been disposed"
}
}
- private fun stopAcceptingEvents(): Boolean {
+ override fun onDispose() {
synchronized(batchLock) {
- return acceptEvents.also { acceptEvents = false }
+ if (!disposed) {
+ disposed = true
+ batchedEvents.forEach { it.recycle() }
+ }
}
}
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
index 7fcece8..c89166c2 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Actions.kt
@@ -21,7 +21,9 @@
import androidx.compose.ui.layout.boundsInParent
import androidx.compose.ui.layout.positionInRoot
import androidx.compose.ui.semantics.AccessibilityAction
+import androidx.compose.ui.semantics.ScrollAxisRange
import androidx.compose.ui.semantics.SemanticsActions
+import androidx.compose.ui.semantics.SemanticsActions.ScrollBy
import androidx.compose.ui.semantics.SemanticsActions.ScrollToIndex
import androidx.compose.ui.semantics.SemanticsNode
import androidx.compose.ui.semantics.SemanticsProperties.HorizontalScrollAxisRange
@@ -29,9 +31,10 @@
import androidx.compose.ui.semantics.SemanticsProperties.VerticalScrollAxisRange
import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.toSize
-import kotlin.math.max
-import kotlin.math.min
+import kotlin.math.abs
+import kotlin.math.sign
internal expect fun SemanticsNodeInteraction.performClickImpl(): SemanticsNodeInteraction
@@ -39,6 +42,8 @@
* Performs a click action on the element represented by the given semantics node. Depending on
* the platform this may be implemented by a touch click (tap), a mouse click, or another more
* appropriate method for that platform.
+ *
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
*/
fun SemanticsNodeInteraction.performClick(): SemanticsNodeInteraction {
return performClickImpl()
@@ -55,61 +60,54 @@
* scrollable content, not on the scrollable container.
*
* Throws an [AssertionError] if there is no scroll parent.
+ *
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
*/
fun SemanticsNodeInteraction.performScrollTo(): SemanticsNodeInteraction {
- // Find a parent node with a scroll action
- val errorMessageOnFail = "Action performScrollTo() failed."
- val node = fetchSemanticsNode(errorMessageOnFail)
- val scrollableNode = node.findClosestParentNode {
+ @OptIn(InternalTestApi::class)
+ fetchSemanticsNode("Action performScrollTo() failed.").scrollToNode(testContext.testOwner)
+ return this
+}
+
+/**
+ * Implementation of [performScrollTo]
+ */
+@OptIn(InternalTestApi::class)
+private fun SemanticsNode.scrollToNode(testOwner: TestOwner) {
+ val scrollableNode = findClosestParentNode {
hasScrollAction().matches(it)
} ?: throw AssertionError("Semantic Node has no parent layout with a Scroll SemanticsAction")
// Figure out the (clipped) bounds of the viewPort in its direct parent's content area, in
// root coordinates. We only want the clipping from the direct parent on the scrollable, not
// from any other ancestors.
- val viewPortInParent = scrollableNode.layoutInfo.coordinates.boundsInParent()
+ val viewportInParent = scrollableNode.layoutInfo.coordinates.boundsInParent()
val parentInRoot = scrollableNode.layoutInfo.coordinates.parentLayoutCoordinates
?.positionInRoot() ?: Offset.Zero
+ val viewport = viewportInParent.translate(parentInRoot)
+ val target = Rect(positionInRoot, size.toSize())
- val viewPort = viewPortInParent.translate(parentInRoot)
- val target = Rect(node.positionInRoot, node.size.toSize())
+ // Given the desired scroll value to align either side of the target with the
+ // viewport, what delta should we go with?
+ // If we need to scroll in opposite directions for both sides, don't scroll at all.
+ // Otherwise, take the delta that scrolls the least amount.
+ fun scrollDelta(a: Float, b: Float): Float =
+ if (sign(a) == sign(b)) if (abs(a) < abs(b)) a else b else 0f
- val mustScrollUp = target.bottom > viewPort.bottom
- val mustScrollDown = target.top < viewPort.top
- val mustScrollLeft = target.right > viewPort.right
- val mustScrollRight = target.left < viewPort.left
+ // Get the desired delta X
+ var dx = scrollDelta(target.left - viewport.left, target.right - viewport.right)
+ // And adjust for reversing properties
+ if (scrollableNode.isReversedHorizontally) dx = -dx
+ if (scrollableNode.isRtl) dx = -dx
- val rawDx = if (mustScrollLeft && !mustScrollRight) {
- // scroll left: positive dx
- min(target.left - viewPort.left, target.right - viewPort.right)
- } else if (mustScrollRight && !mustScrollLeft) {
- // scroll right: negative dx
- max(target.left - viewPort.left, target.right - viewPort.right)
- } else {
- // already in viewport
- 0f
+ // Get the desired delta Y
+ var dy = scrollDelta(target.top - viewport.top, target.bottom - viewport.bottom)
+ // And adjust for reversing properties
+ if (scrollableNode.isReversedVertically) dy = -dy
+
+ testOwner.runOnUiThread {
+ scrollableNode.config[ScrollBy].action?.invoke(dx, dy)
}
-
- val rawDy = if (mustScrollUp && !mustScrollDown) {
- // scroll up: positive dy
- min(target.top - viewPort.top, target.bottom - viewPort.bottom)
- } else if (mustScrollDown && !mustScrollUp) {
- // scroll down: negative dy
- max(target.top - viewPort.top, target.bottom - viewPort.bottom)
- } else {
- // already in viewport
- 0f
- }
-
- val dx = if (scrollableNode.isReversedHorizontally) -rawDx else rawDx
- val dy = if (scrollableNode.isReversedVertically) -rawDy else rawDy
-
- @OptIn(InternalTestApi::class)
- testContext.testOwner.runOnUiThread {
- scrollableNode.config[SemanticsActions.ScrollBy].action?.invoke(dx, dy)
- }
-
- return this
}
/**
@@ -125,19 +123,27 @@
* Throws an [AssertionError] if the node doesn't have [ScrollToIndex] defined.
*
* @param index The index of the item to scroll to
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
+ *
* @see hasScrollToIndexAction
*/
fun SemanticsNodeInteraction.performScrollToIndex(index: Int): SemanticsNodeInteraction {
- val node = fetchSemanticsNode("Failed: performScrollToIndex($index)")
- requireSemantics(node, ScrollToIndex) {
+ fetchSemanticsNode("Failed: performScrollToIndex($index)").scrollToIndex(index, this)
+ return this
+}
+
+/**
+ * Implementation of [performScrollToIndex]
+ */
+private fun SemanticsNode.scrollToIndex(index: Int, nodeInteraction: SemanticsNodeInteraction) {
+ nodeInteraction.requireSemantics(this, ScrollToIndex) {
"Failed to scroll to index $index"
}
@OptIn(InternalTestApi::class)
- testContext.testOwner.runOnUiThread {
- node.config[ScrollToIndex].action!!.invoke(index)
+ nodeInteraction.testContext.testOwner.runOnUiThread {
+ config[ScrollToIndex].action!!.invoke(index)
}
- return this
}
/**
@@ -151,6 +157,8 @@
* Throws an [AssertionError] if the node doesn't have [IndexForKey] or [ScrollToIndex] defined.
*
* @param key The key of the item to scroll to
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
+ *
* @see hasScrollToKeyAction
*/
fun SemanticsNodeInteraction.performScrollToKey(key: Any): SemanticsNodeInteraction {
@@ -173,6 +181,85 @@
}
/**
+ * Scrolls a scrollable container to the content that matches the given [matcher]. If the content
+ * isn't yet visible, the scrollable container will be scrolled from the start till the end till
+ * it finds the content we're looking for. It is not defined where in the viewport the content
+ * will be on success of this function, but it will be either fully within the viewport if it is
+ * smaller than the viewport, or it will cover the whole viewport if it is larger than the
+ * viewport. If it doesn't find the content, the scrollable will be left at the end of the
+ * content and an [AssertionError] is thrown.
+ *
+ * This action should be performed on a [node][SemanticsNodeInteraction] that is a scrollable
+ * container, not on a node that is part of the content of that container. If the container is a
+ * lazy container, it must support the semantics actions [ScrollToIndex], [ScrollBy], and either
+ * [HorizontalScrollAxisRange] or [VerticalScrollAxisRange], for example
+ * [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] and
+ * [LazyRow][androidx.compose.foundation.lazy.LazyRow]. If the container is not lazy, it must
+ * support the semantics action [ScrollBy], for example,
+ * [Row][androidx.compose.foundation.layout.Row] or
+ * [Column][androidx.compose.foundation.layout.Column].
+ *
+ * Throws an [AssertionError] if the scrollable node doesn't support the necessary semantics
+ * actions.
+ *
+ * @param matcher A matcher that identifies the content where the scrollable container needs to
+ * scroll to
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method. Note that this is
+ * _not_ an interaction for the node that is identified by the [matcher].
+ *
+ * @see hasScrollToNodeAction
+ */
+fun SemanticsNodeInteraction.performScrollToNode(
+ matcher: SemanticsMatcher
+): SemanticsNodeInteraction {
+ var node = fetchSemanticsNode("Failed: performScrollToNode(${matcher.description})")
+ matcher.findMatchInDescendants(node)?.also {
+ @OptIn(InternalTestApi::class)
+ it.scrollToNode(testContext.testOwner)
+ return this
+ }
+
+ // If this is NOT a lazy list, but we haven't found the node above ..
+ if (!node.isLazyList) {
+ // .. throw an error that the node doesn't exist
+ val msg = "No node found that matches ${matcher.description} in scrollable container"
+ throw AssertionError(buildGeneralErrorMessage(msg, selector, node))
+ }
+
+ // Go to start of the list
+ if (!node.horizontalScrollAxis.isAtStart || !node.verticalScrollAxis.isAtStart) {
+ node.scrollToIndex(0, this)
+ }
+
+ while (true) {
+ // Fetch the node again
+ node = fetchSemanticsNode("Failed: performScrollToNode(${matcher.description})")
+ matcher.findMatchInDescendants(node)?.also {
+ @OptIn(InternalTestApi::class)
+ it.scrollToNode(testContext.testOwner)
+ return this
+ }
+
+ // Are we there yet? Are we there yet? Are we there yet?
+ if (node.horizontalScrollAxis.isAtEnd && node.verticalScrollAxis.isAtEnd) {
+ // If we're finished and we haven't found the node
+ val msg = "No node found that matches ${matcher.description} in scrollable container"
+ throw AssertionError(buildGeneralErrorMessage(msg, selector, node))
+ }
+
+ val viewPortSize = node.layoutInfo.coordinates.boundsInParent().size
+ val dx = node.horizontalScrollAxis?.let { viewPortSize.width } ?: 0f
+ val dy = node.verticalScrollAxis?.let { viewPortSize.height } ?: 0f
+
+ // Scroll one screen
+ @OptIn(InternalTestApi::class)
+ testContext.testOwner.runOnUiThread {
+ node.config[ScrollBy].action?.invoke(dx, dy)
+ }
+ }
+}
+
+/**
* Executes the (partial) gesture specified in the given [block]. The gesture doesn't need to be
* complete and can be resumed in a later invocation of [performGesture]. The event time is
* initialized to the current time of the [MainTestClock].
@@ -205,6 +292,10 @@
* testRule.onNodeWithTag("myWidget")
* .performGesture(true) { swipeUp() }
* ```
+ *
+ * @param block A lambda with [GestureScope] as receiver that describes the gesture by
+ * sending all touch events.
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
*/
@Deprecated(
message = "Replaced by performTouchInput",
@@ -222,17 +313,12 @@
try {
block()
} finally {
- try {
- inputDispatcher.sendAllSynchronous()
- } finally {
- dispose()
- }
+ delegateScope.dispose()
}
}
return this
}
-// TODO(fresen): create sample module like in the rest of Compose
/**
* Executes the touch gesture specified in the given [block]. The gesture doesn't need to be
* complete and can be resumed in a later invocation of one of the `perform.*Input` methods. The
@@ -271,21 +357,21 @@
* }
* ```
*
+ * @param block A lambda with [TouchInjectionScope] as receiver that describes the gesture by
+ * sending all touch events.
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
+ *
* @see TouchInjectionScope
*/
fun SemanticsNodeInteraction.performTouchInput(
block: TouchInjectionScope.() -> Unit
): SemanticsNodeInteraction {
val node = fetchSemanticsNode("Failed to inject touch input.")
- with(MultiModalInjectionScope(node, testContext)) {
+ with(MultiModalInjectionScopeImpl(node, testContext)) {
try {
block.invoke(Touch)
} finally {
- try {
- inputDispatcher.sendAllSynchronous()
- } finally {
- dispose()
- }
+ dispose()
}
}
return this
@@ -325,6 +411,10 @@
* }
* ```
*
+ * @param block A lambda with [MouseInjectionScope] as receiver that describes the gesture by
+ * sending all mouse events.
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
+ *
* @see MouseInjectionScope
*/
@ExperimentalTestApi
@@ -332,15 +422,11 @@
block: MouseInjectionScope.() -> Unit
): SemanticsNodeInteraction {
val node = fetchSemanticsNode("Failed to inject mouse input.")
- with(MultiModalInjectionScope(node, testContext)) {
+ with(MultiModalInjectionScopeImpl(node, testContext)) {
try {
block.invoke(Mouse)
} finally {
- try {
- inputDispatcher.sendAllSynchronous()
- } finally {
- dispose()
- }
+ dispose()
}
}
return this
@@ -366,6 +452,10 @@
* execution of [block] or injection of the events, all (subsequent) events are dropped and the
* error is thrown here.
*
+ * @param block A lambda with [MultiModalInjectionScope] as receiver that describes the gesture
+ * by sending all multi modal events.
+ * @return The [SemanticsNodeInteraction] that is the receiver of this method
+ *
* @see MultiModalInjectionScope
*/
// TODO(fresen): add example of multi-modal input when Keyboard input is added (touch and mouse
@@ -374,15 +464,11 @@
block: MultiModalInjectionScope.() -> Unit
): SemanticsNodeInteraction {
val node = fetchSemanticsNode("Failed to inject multi-modal input.")
- with(MultiModalInjectionScope(node, testContext)) {
+ with(MultiModalInjectionScopeImpl(node, testContext)) {
try {
block.invoke(this)
} finally {
- try {
- inputDispatcher.sendAllSynchronous()
- } finally {
- dispose()
- }
+ dispose()
}
}
return this
@@ -437,11 +523,30 @@
performSemanticsAction(key) { it.invoke() }
}
+// TODO(200928505): get a more accurate indication if it is a lazy list
+private val SemanticsNode.isLazyList: Boolean
+ get() = ScrollBy in config && ScrollToIndex in config
+
+private val SemanticsNode.horizontalScrollAxis: ScrollAxisRange?
+ get() = config.getOrNull(HorizontalScrollAxisRange)
+
+private val SemanticsNode.verticalScrollAxis: ScrollAxisRange?
+ get() = config.getOrNull(VerticalScrollAxisRange)
+
private val SemanticsNode.isReversedHorizontally: Boolean
- get() = config.getOrNull(HorizontalScrollAxisRange)?.reverseScrolling == true
+ get() = horizontalScrollAxis?.reverseScrolling ?: false
private val SemanticsNode.isReversedVertically: Boolean
- get() = config.getOrNull(VerticalScrollAxisRange)?.reverseScrolling == true
+ get() = verticalScrollAxis?.reverseScrolling ?: false
+
+private val ScrollAxisRange?.isAtStart: Boolean
+ get() = this?.let { value() == 0f } ?: true
+
+private val ScrollAxisRange?.isAtEnd: Boolean
+ get() = this?.let { value() == maxValue() } ?: true
+
+private val SemanticsNode.isRtl: Boolean
+ get() = layoutInfo.layoutDirection == LayoutDirection.Rtl
private fun SemanticsNodeInteraction.requireSemantics(
node: SemanticsNode,
@@ -454,3 +559,12 @@
throw AssertionError(buildGeneralErrorMessage(msg, selector, node))
}
}
+
+@Suppress("NOTHING_TO_INLINE") // Avoids doubling the stack depth for recursive search
+private inline fun SemanticsMatcher.findMatchInDescendants(root: SemanticsNode): SemanticsNode? {
+ return root.children.firstOrNull { it.layoutInfo.isPlaced && findMatchInHierarchy(it) != null }
+}
+
+private fun SemanticsMatcher.findMatchInHierarchy(node: SemanticsNode): SemanticsNode? {
+ return if (matches(node)) node else findMatchInDescendants(node)
+}
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
index c983631..0f45f7e 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/Filters.kt
@@ -20,6 +20,7 @@
import androidx.compose.ui.semantics.SemanticsActions
import androidx.compose.ui.semantics.SemanticsNode
import androidx.compose.ui.semantics.SemanticsProperties
+import androidx.compose.ui.semantics.SemanticsPropertyKey
import androidx.compose.ui.semantics.getOrNull
import androidx.compose.ui.state.ToggleableState
import androidx.compose.ui.text.input.ImeAction
@@ -31,7 +32,7 @@
* @see SemanticsProperties.Disabled
*/
fun isEnabled(): SemanticsMatcher =
- !SemanticsMatcher.keyIsDefined(SemanticsProperties.Disabled)
+ !hasKey(SemanticsProperties.Disabled)
/**
* Returns whether the node is not enabled.
@@ -39,7 +40,7 @@
* @see SemanticsProperties.Disabled
*/
fun isNotEnabled(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.Disabled)
+ hasKey(SemanticsProperties.Disabled)
/**
* Return whether the node is checkable.
@@ -47,7 +48,7 @@
* @see SemanticsProperties.ToggleableState
*/
fun isToggleable(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.ToggleableState)
+ hasKey(SemanticsProperties.ToggleableState)
/**
* Returns whether the node is toggled.
@@ -73,7 +74,7 @@
* @see SemanticsProperties.Selected
*/
fun isSelectable(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.Selected)
+ hasKey(SemanticsProperties.Selected)
/**
* Returns whether the node is selected.
@@ -97,7 +98,7 @@
* @see SemanticsProperties.Focused
*/
fun isFocusable(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.Focused)
+ hasKey(SemanticsProperties.Focused)
/**
* Return whether the node is not able to receive focus.
@@ -129,7 +130,7 @@
* @see SemanticsActions.OnClick
*/
fun hasClickAction(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsActions.OnClick)
+ hasKey(SemanticsActions.OnClick)
/**
* Return whether the node has no semantics click action defined.
@@ -145,7 +146,7 @@
* @see SemanticsActions.ScrollBy
*/
fun hasScrollAction(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollBy)
+ hasKey(SemanticsActions.ScrollBy)
/**
* Return whether the node has no semantics scrollable action defined.
@@ -321,7 +322,7 @@
* @see SemanticsProperties.Heading
*/
fun isHeading(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.Heading)
+ hasKey(SemanticsProperties.Heading)
/**
* Returns whether the node's range info matches exactly to the given accessibility range info.
@@ -352,7 +353,7 @@
* @see SemanticsProperties.IsDialog
*/
fun isDialog(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.IsDialog)
+ hasKey(SemanticsProperties.IsDialog)
/**
* Returns whether the node is a popup.
@@ -363,7 +364,7 @@
* @see SemanticsProperties.IsPopup
*/
fun isPopup(): SemanticsMatcher =
- SemanticsMatcher.keyIsDefined(SemanticsProperties.IsPopup)
+ hasKey(SemanticsProperties.IsPopup)
/**
* Returns whether the node defines the given IME action.
@@ -381,7 +382,7 @@
* @see SemanticsActions.SetText
*/
fun hasSetTextAction() =
- SemanticsMatcher.keyIsDefined(SemanticsActions.SetText)
+ hasKey(SemanticsActions.SetText)
/**
* Returns whether the node defines the ability to scroll to an item index.
@@ -391,7 +392,7 @@
* index, while [LazyColumn][androidx.compose.foundation.lazy.LazyColumn] does.
*/
fun hasScrollToIndexAction() =
- SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollToIndex)
+ hasKey(SemanticsActions.ScrollToIndex)
/**
* Returns whether the node defines the ability to scroll to an item identified by a key, such as
@@ -399,8 +400,19 @@
* [LazyRow][androidx.compose.foundation.lazy.LazyRow].
*/
fun hasScrollToKeyAction() =
- SemanticsMatcher.keyIsDefined(SemanticsActions.ScrollToIndex)
- .and(SemanticsMatcher.keyIsDefined(SemanticsProperties.IndexForKey))
+ hasKey(SemanticsActions.ScrollToIndex)
+ .and(hasKey(SemanticsProperties.IndexForKey))
+
+/**
+ * Returns whether the node defines the ability to scroll to content identified by a matcher.
+ */
+fun hasScrollToNodeAction() =
+ hasKey(SemanticsActions.ScrollToIndex)
+ .and(hasKey(SemanticsActions.ScrollBy))
+ .and(
+ hasKey(SemanticsProperties.HorizontalScrollAxisRange)
+ .or(hasKey(SemanticsProperties.VerticalScrollAxisRange))
+ )
/**
* Return whether the node is the root semantics node.
@@ -512,3 +524,6 @@
}
}
}
+
+private fun hasKey(key: SemanticsPropertyKey<*>): SemanticsMatcher =
+ SemanticsMatcher.keyIsDefined(key)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt
index 396abc6..8342d86 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/GestureScope.kt
@@ -19,7 +19,6 @@
package androidx.compose.ui.test
import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.semantics.SemanticsNode
import androidx.compose.ui.unit.IntSize
import kotlin.math.roundToInt
@@ -38,11 +37,10 @@
private const val doubleClickDelayMillis = 145L
/** The time before a long press gesture attempts to win. */
-// remove after b/179281066
private const val LongPressTimeoutMillis: Long = 500L
/**
- * The receiver scope for injecting gestures on the [semanticsNode] identified by the
+ * The receiver scope for injecting gestures on the SemanticsNode identified by the
* corresponding [SemanticsNodeInteraction]. Gestures can be injected by calling methods defined
* on [GestureScope], such as [click] or [swipe]. The [SemanticsNodeInteraction] can be found by
* one of the finder methods such as
@@ -94,25 +92,14 @@
)
class GestureScope(node: SemanticsNode, testContext: TestContext) {
@PublishedApi
- internal val delegateScope = MultiModalInjectionScope(node, testContext)
-
- internal val semanticsNode get() = delegateScope.semanticsNode
- internal val inputDispatcher get() = delegateScope.inputDispatcher
-
- /**
- * Returns and stores the visible bounds of the [semanticsNode] we're interacting with. This
- * applies clipping, which is almost always the correct thing to do when injecting gestures,
- * as gestures operate on visible UI.
- */
- internal val boundsInRoot: Rect by lazy { semanticsNode.boundsInRoot }
+ internal val delegateScope: MultiModalInjectionScope =
+ MultiModalInjectionScopeImpl(node, testContext)
/**
* Returns the size of the visible part of the node we're interacting with. This is contrary
* to [SemanticsNode.size], which returns the unclipped size of the node.
*/
val visibleSize: IntSize = delegateScope.visibleSize
-
- internal fun dispose() = delegateScope.dispose()
}
/**
@@ -579,7 +566,7 @@
* move event just before the down or up event if [movePointerTo] or [movePointerBy] has been
* called and no move event has been sent yet. This does not happen for cancel events, but the
* cancel event will contain the up to date position of all pointers. Move and cancel events will
- * advance the event time by 10 milliseconds.
+ * advance the event time by 16 milliseconds.
*
* Because gestures don't have to be defined all in the same [performGesture] block,
* keep in mind that while the gesture is not complete, all code you execute in between
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt
index adc8445e..c61319b 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InjectionScope.kt
@@ -17,6 +17,8 @@
package androidx.compose.ui.test
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.platform.ViewConfiguration
+import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
/**
@@ -26,60 +28,77 @@
* This scope offers several properties that allow you to get [coordinates][Offset] within the
* node you're interacting on, like the [topLeft] corner, its [center], or some percentage of the
* size ([percentOffset]).
+ *
+ * All positional properties are expressed in pixels. [InjectionScope] implements [Density] so
+ * you can convert between px and dp as you wish. The density used is taken from the
+ * [SemanticsNode][androidx.compose.ui.semantics.SemanticsNode] from the
+ * [SemanticsNodeInteraction] on which the input injection method is called.
+ *
+ * When the scope is [flushed][flush], all events that have been enqueued up till then will
+ * be dispatched. When the scope is [disposed][dispose], all events that haven't been dispatched
+ * yet are dropped, and subsequent events can't be enqueued anymore.
*/
-interface InjectionScope {
+interface InjectionScope : Density {
/**
* The default time between two successive events.
*/
val eventPeriodMillis get() = InputDispatcher.eventPeriodMillis
/**
- * The size of the visible part of the node we're interacting with, i.e. its clipped bounds.
- */
- val visibleSize: IntSize
-
- /**
* Adds the given [durationMillis] to the current event time, delaying the next event by that
* time.
*/
fun advanceEventTime(durationMillis: Long = eventPeriodMillis)
/**
- * Shorthand for `visibleSize.width`
+ * The size of the visible part of the node we're interacting with in px, i.e. its clipped
+ * bounds.
+ */
+ val visibleSize: IntSize
+
+ /**
+ * The [ViewConfiguration] in use by the
+ * [SemanticsNode][androidx.compose.ui.semantics.SemanticsNode] from the
+ * [SemanticsNodeInteraction] on which the input injection method is called.
+ */
+ val viewConfiguration: ViewConfiguration
+
+ /**
+ * The width of the node in px. Shorthand for [visibleSize.width][visibleSize].
*/
val width: Int get() = visibleSize.width
/**
- * Shorthand for `visibleSize.height`
+ * The height of the node in px. Shorthand for [visibleSize.height][visibleSize].
*/
val height: Int get() = visibleSize.height
/**
- * The x-coordinate for the left edge of the node we're interacting with, in the
+ * The x-coordinate for the left edge of the node we're interacting with in px, in the
* node's local coordinate system, where (0, 0) is the top left corner of the node.
*/
val left: Float get() = 0f
/**
- * The y-coordinate for the bottom of the node we're interacting with, in the
+ * The y-coordinate for the bottom of the node we're interacting with in px, in the
* node's local coordinate system, where (0, 0) is the top left corner of the node.
*/
val top: Float get() = 0f
/**
- * The x-coordinate for the center of the node we're interacting with, in the
+ * The x-coordinate for the center of the node we're interacting with in px, in the
* node's local coordinate system, where (0, 0) is the top left corner of the node.
*/
val centerX: Float get() = width / 2f
/**
- * The y-coordinate for the center of the node we're interacting with, in the
+ * The y-coordinate for the center of the node we're interacting with in px, in the
* node's local coordinate system, where (0, 0) is the top left corner of the node.
*/
val centerY: Float get() = height / 2f
/**
- * The x-coordinate for the right edge of the node we're interacting with, in the
+ * The x-coordinate for the right edge of the node we're interacting with in px, in the
* node's local coordinate system, where (0, 0) is the top left corner of the node.
*
* Note that, unless `width == 0`, `right != width`. In particular, `right == width - 1f`,
@@ -88,7 +107,7 @@
val right: Float get() = width.let { if (it == 0) 0f else it - 1f }
/**
- * The y-coordinate for the bottom of the node we're interacting with, in the
+ * The y-coordinate for the bottom of the node we're interacting with in px, in the
* node's local coordinate system, where (0, 0) is the top left corner of the node.
*
* Note that, unless `height == 0`, `bottom != height`. In particular, `bottom == height - 1f`,
@@ -179,4 +198,16 @@
): Offset {
return Offset(x * width, y * height)
}
+
+ /**
+ * Flushes the stream of input injection commands by sending the input to the Compose
+ * hierarchy. Throws an [IllegalStateException] when the injection scope has already been
+ * [disposed][dispose].
+ */
+ fun flush()
+
+ /**
+ * [Flushes][flush] and disposes the injection scope. No more input can be sent.
+ */
+ fun dispose()
}
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt
index 70cf2d2..610a99e 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/InputDispatcher.kt
@@ -60,12 +60,11 @@
) {
companion object {
/**
- * The default time between two successively injected events, 10 milliseconds.
- * Ideally, the value should reflect a realistic pointer input sample rate, but that
- * depends on too many factors. Instead, the value is chosen comfortably below the
- * targeted frame rate (60 fps, equating to a 16ms period).
+ * The default time between two successively injected events, 16 milliseconds. Events are
+ * normally sent on every frame and thus follow the frame rate. On a 60Hz screen this is
+ * ~16ms per frame.
*/
- var eventPeriodMillis = 10L
+ var eventPeriodMillis = 16L
internal set
}
@@ -111,7 +110,8 @@
}
@OptIn(InternalTestApi::class)
- private val TestContext.currentTime get() = testOwner.mainClock.currentTime
+ private val TestContext.currentTime
+ get() = testOwner.mainClock.currentTime
/**
* Increases the current event time by [durationMillis].
@@ -197,6 +197,7 @@
* @see updateTouchPointer
* @see enqueueTouchUp
* @see enqueueTouchCancel
+ * @see enqueueTouchMoves
*/
fun enqueueTouchMove() {
val gesture = checkNotNull(partialGesture) {
@@ -207,6 +208,25 @@
}
/**
+ * Enqueue the current time+coordinates as a move event, with the historical parameters
+ * preceding it (so that they are ultimately available from methods like
+ * MotionEvent.getHistoricalX).
+ *
+ * @see enqueueTouchMove
+ * @see TouchInjectionScope.moveWithHistory
+ */
+ fun enqueueTouchMoves(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<List<Offset>>
+ ) {
+ val gesture = checkNotNull(partialGesture) {
+ "Cannot send MOVE event, no gesture is in progress"
+ }
+ gesture.enqueueMoves(relativeHistoricalTimes, historicalCoordinates)
+ gesture.hasPointerUpdates = false
+ }
+
+ /**
* Updates the position of the touch pointer with the given [pointerId] to the given
* [position], but does not generate a move touch event. Use this to move multiple pointers
* simultaneously. To generate the next move touch event, which will contain the current
@@ -469,12 +489,17 @@
* Sends all enqueued events and blocks while they are dispatched. If an exception is
* thrown during the process, all events that haven't yet been dispatched will be dropped.
*/
- abstract fun sendAllSynchronous()
+ abstract fun flush()
protected abstract fun PartialGesture.enqueueDown(pointerId: Int)
protected abstract fun PartialGesture.enqueueMove()
+ protected abstract fun PartialGesture.enqueueMoves(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<List<Offset>>
+ )
+
protected abstract fun PartialGesture.enqueueUp(pointerId: Int)
protected abstract fun PartialGesture.enqueueCancel()
@@ -496,7 +521,7 @@
/**
* Called when this [InputDispatcher] is about to be discarded, from
- * [MultiModalInjectionScope.dispose].
+ * [InjectionScope.dispose].
*/
fun dispose() {
saveState(root)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt
index d64a6dd..2954b39 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MouseInjectionScope.kt
@@ -19,12 +19,11 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.isSpecified
import androidx.compose.ui.geometry.lerp
+import androidx.compose.ui.platform.ViewConfiguration
import androidx.compose.ui.util.lerp
import kotlin.math.max
import kotlin.math.roundToInt
-// TODO(fresen): Remove constants after b/179281066
-
/**
* The time between the button pressed and button released event in a mouse click. Determined by
* empirical sampling.
@@ -32,19 +31,6 @@
private const val SingleClickDelayMillis = 60L
/**
- * The time between the last event of the first click and the first event of the second click in
- * a double click gesture. Copied from double tap delay.
- */
-private const val DoubleClickDelayMillis = 145L
-
-/**
- * The time before a long press gesture attempts to win. Copied from the equivalent in touch
- * input.
- */
-// TODO(fresen): Verify value after mouse input is added to Compose, it may be different for mouse.
-private const val LongPressTimeoutMillis: Long = 500L
-
-/**
* The default duration of mouse gestures with configurable time (e.g. [animateTo]).
*/
private const val DefaultMouseGestureDurationMillis: Long = 300L
@@ -76,8 +62,10 @@
* different nodes will report a different [currentPosition], even though it is actually the same
* position on the screen.
*
- * All events sent by these methods are batched together and sent as a whole after
- * [performMouseInput] has executed its code block.
+ * All events generated by these methods are enqueued and sent together when the scope is
+ * [flushed][flush]. This can be done at any time during the lambda passed to [performMouseInput],
+ * but the scope is always flushed after the execution of that lambda so normally you don't need
+ * to flush it yourself.
*
* Example usage:
* ```
@@ -295,6 +283,10 @@
release(MouseButton.Secondary)
}
+// The average of min and max is a safe default
+private val ViewConfiguration.defaultDoubleTapDelayMillis: Long
+ get() = (doubleTapMinTimeMillis + doubleTapTimeoutMillis) / 2
+
/**
* Double-click on [position], or on the current mouse position if [position] is
* [unspecified][Offset.Unspecified]. The [position] is in the node's local coordinate system,
@@ -307,7 +299,7 @@
@ExperimentalTestApi
fun MouseInjectionScope.doubleClick(position: Offset = center) {
click(position)
- advanceEventTime(DoubleClickDelayMillis)
+ advanceEventTime(viewConfiguration.defaultDoubleTapDelayMillis)
click(position)
}
@@ -323,9 +315,9 @@
@ExperimentalTestApi
fun MouseInjectionScope.tripleClick(position: Offset = center) {
click(position)
- advanceEventTime(DoubleClickDelayMillis)
+ advanceEventTime(viewConfiguration.defaultDoubleTapDelayMillis)
click(position)
- advanceEventTime(DoubleClickDelayMillis)
+ advanceEventTime(viewConfiguration.defaultDoubleTapDelayMillis)
click(position)
}
@@ -344,7 +336,7 @@
updatePointerTo(position)
}
press(MouseButton.Primary)
- advanceEventTime(LongPressTimeoutMillis + 100L)
+ advanceEventTime(viewConfiguration.longPressTimeoutMillis + 100L)
release(MouseButton.Primary)
}
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
index 4e22d6b..d2a1b2f 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/MultiModalInjectionScope.kt
@@ -18,22 +18,27 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.platform.ViewConfiguration
import androidx.compose.ui.semantics.SemanticsNode
+import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import kotlin.math.roundToInt
/**
* The receiver scope of the multi-modal input injection lambda from [performMultiModalInput].
*
- * The input uses the [SemanticsNode] identified by the corresponding [SemanticsNodeInteraction]
- * as the frame of reference for the event's positions. How the event is injected exactly is
- * platform dependent.
- *
- * The functions in [MultiModalInjectionScope] are divided by modality: currently, we have a
+ * [MultiModalInjectionScope] brings together the receiver scopes of all individual modalities,
+ * allowing you to inject gestures that consist of events from different modalities, like touch
+ * and mouse. For each modality, there is a property exposing that modality: currently, we have a
* [Touch] scope and a [Mouse] scope. See their respective docs for more information.
*
- * Note that all events generated by the gesture methods are batched together and sent as a whole
- * after [performMultiModalInput] has executed its code block.
+ * All events generated for all modalities are enqueued and sent together when any scope is
+ * [flushed][flush]. This can be done at any time during the lambda passed to
+ * [performMultiModalInput], but the scope is always flushed after the execution of that lambda
+ * so normally you don't need to flush it yourself.
+ *
+ * Note that because all scopes share the same event queue, so flushing one flushes them all, and
+ * [disposing][dispose] one disposes them all.
*
* Example usage:
* ```
@@ -48,12 +53,29 @@
*
* @see InjectionScope
* @see TouchInjectionScope
+ * @see MouseInjectionScope
*/
// TODO(fresen): add better multi modal example when we have keyboard support
-class MultiModalInjectionScope(node: SemanticsNode, testContext: TestContext) : InjectionScope {
+sealed interface MultiModalInjectionScope : InjectionScope {
+ /**
+ * The receiver scope for touch input injection. See [TouchInjectionScope].
+ */
+ val Touch: TouchInjectionScope
+
+ /**
+ * The receiver scope for mouse input injection. See [MouseInjectionScope].
+ */
+ @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+ @get:ExperimentalTestApi // Required to annotate Java-facing APIs
+ @ExperimentalTestApi
+ val Mouse: MouseInjectionScope
+}
+
+internal class MultiModalInjectionScopeImpl(node: SemanticsNode, testContext: TestContext) :
+ MultiModalInjectionScope, Density by node.layoutInfo.density {
// TODO(b/133217292): Better error: explain which gesture couldn't be performed
private var _semanticsNode: SemanticsNode? = node
- internal val semanticsNode
+ private val semanticsNode
get() = checkNotNull(_semanticsNode) {
"Can't query SemanticsNode, InjectionScope has already been disposed"
}
@@ -71,7 +93,7 @@
* applies clipping, which is almost always the correct thing to do when injecting gestures,
* as gestures operate on visible UI.
*/
- internal val boundsInRoot: Rect by lazy { semanticsNode.boundsInRoot }
+ private val boundsInRoot: Rect by lazy { semanticsNode.boundsInRoot }
/**
* Returns the size of the visible part of the node we're interacting with. This is contrary
@@ -95,6 +117,25 @@
return position - boundsInRoot.topLeft
}
+ override val viewConfiguration: ViewConfiguration
+ get() = semanticsNode.layoutInfo.viewConfiguration
+
+ override fun flush() {
+ inputDispatcher.flush()
+ }
+
+ override fun dispose() {
+ _semanticsNode = null
+ _inputDispatcher?.also {
+ _inputDispatcher = null
+ try {
+ it.flush()
+ } finally {
+ it.dispose()
+ }
+ }
+ }
+
/**
* Adds the given [durationMillis] to the current event time, delaying the next event by that
* time. Only valid when a gesture has already been started, or when a finished gesture is
@@ -104,16 +145,7 @@
inputDispatcher.advanceEventTime(durationMillis)
}
- internal fun dispose() {
- inputDispatcher.dispose()
- _semanticsNode = null
- _inputDispatcher = null
- }
-
- /**
- * The receiver scope for touch input injection. See [TouchInjectionScope].
- */
- val Touch: TouchInjectionScope = object : TouchInjectionScope, InjectionScope by this {
+ override val Touch: TouchInjectionScope = object : TouchInjectionScope, InjectionScope by this {
override fun currentPosition(pointerId: Int): Offset? {
val positionInRoot = inputDispatcher.getCurrentTouchPosition(pointerId) ?: return null
return rootToLocal(positionInRoot)
@@ -134,6 +166,27 @@
inputDispatcher.enqueueTouchMove()
}
+ @ExperimentalTestApi
+ override fun moveWithHistoryMultiPointer(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<List<Offset>>,
+ delayMillis: Long
+ ) {
+ repeat(relativeHistoricalTimes.size) {
+ check(relativeHistoricalTimes[it] < 0) {
+ "Relative historical times should be negative, in order to be in the past" +
+ "(offset $it was: ${relativeHistoricalTimes[it]})"
+ }
+ check(relativeHistoricalTimes[it] >= -delayMillis) {
+ "Relative historical times should not be earlier than the previous event " +
+ "(offset $it was: ${relativeHistoricalTimes[it]}, ${-delayMillis})"
+ }
+ }
+
+ advanceEventTime(delayMillis)
+ inputDispatcher.enqueueTouchMoves(relativeHistoricalTimes, historicalCoordinates)
+ }
+
override fun up(pointerId: Int) {
inputDispatcher.enqueueTouchUp(pointerId)
}
@@ -144,13 +197,10 @@
}
}
- /**
- * The receiver scope for mouse input injection. See [MouseInjectionScope].
- */
@Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
@get:ExperimentalTestApi // Required to annotate Java-facing APIs
@ExperimentalTestApi
- val Mouse: MouseInjectionScope = object : MouseInjectionScope, InjectionScope by this {
+ override val Mouse: MouseInjectionScope = object : MouseInjectionScope, InjectionScope by this {
override val currentPosition: Offset
get() = rootToLocal(inputDispatcher.currentMousePosition)
diff --git a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
index ec76435..6971b18 100644
--- a/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
+++ b/compose/ui/ui-test/src/commonMain/kotlin/androidx/compose/ui/test/TouchInjectionScope.kt
@@ -18,29 +18,13 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.lerp
+import androidx.compose.ui.platform.ViewConfiguration
import androidx.compose.ui.util.lerp
import kotlin.math.ceil
import kotlin.math.max
import kotlin.math.roundToInt
/**
- * The time between the last event of the first click and the first event of the second click in
- * a double click gesture. 145 milliseconds: both median and average of empirical data (33 samples)
- */
-private const val DoubleClickDelayMillis = 145L
-
-/** The time before a long press gesture attempts to win. */
-// remove after b/179281066
-private const val LongPressTimeoutMillis: Long = 500L
-
-/**
- * The maximum time from the start of the first tap to the start of the second
- * tap in a double-tap gesture.
- */
-// remove after b/179281066
-private const val DoubleTapTimeoutMillis: Long = 300L
-
-/**
* The receiver scope of the touch input injection lambda from [performTouchInput].
*
* The functions in [TouchInjectionScope] can roughly be divided into two groups: full gestures
@@ -55,7 +39,7 @@
* multi-touch gestures. Most methods accept a pointerId to specify which pointer (finger) the
* event applies to. Movement can be expressed absolutely with [moveTo] and [updatePointerTo], or
* relative to the current pointer position with [moveBy] and [updatePointerBy]. The `moveTo/By`
- * methods send out an event immediately, while the `updatePointerTo/By` methods don't. This
+ * methods enqueue an event immediately, while the `updatePointerTo/By` methods don't. This
* allows you to update the position of multiple pointers in a single [move] event for
* multi-touch gestures. Touch gestures can be cancelled with [cancel]. All events, regardless
* the method used, will always contain the current position of _all_ pointers.
@@ -68,11 +52,14 @@
* different nodes will report a different [currentPosition], even though it is actually the same
* position on the screen.
*
- * All events sent by these methods are batched together and sent as a whole after
- * [performTouchInput] has executed its code block. Because gestures don't have to be defined all
- * in the same [performTouchInput] block, keep in mind that while the gesture is not complete,
- * all code you execute in between these blocks will be executed while imaginary fingers are
- * actively touching the screen.
+ * All events generated by these methods are enqueued and sent together when the scope is
+ * [flushed][flush]. This can be done at any time during the lambda passed to [performTouchInput],
+ * but the scope is always flushed after the execution of that lambda so normally you don't need
+ * to flush it yourself.
+ *
+ * Because gestures don't have to be defined all in the same [performTouchInput] block, keep in
+ * mind that while the gesture is not complete, all code you execute in between these blocks will
+ * be executed while imaginary fingers are actively touching the screen.
*
* Example usage:
* ```
@@ -248,6 +235,52 @@
fun move(delayMillis: Long = eventPeriodMillis)
/**
+ * Sends a move event [delayMillis] after the last sent event without updating any of the
+ * pointer positions.
+ *
+ * This overload supports gestures with multiple pointers.
+ *
+ * @param relativeHistoricalTimes Time of each historical event, as a millisecond relative to
+ * the time the actual event is sent. For example, -10L means 10ms earlier.
+ * @param historicalCoordinates Coordinates of each historical event, in the same coordinate
+ * space as [moveTo]. The outer list must have the same size as the number of pointers in the
+ * event, and each inner list must have the same size as [relativeHistoricalTimes].
+ * @param delayMillis The time between the last sent event and this event.
+ * [eventPeriodMillis] by default.
+ */
+ @ExperimentalTestApi
+ fun moveWithHistoryMultiPointer(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<List<Offset>>,
+ delayMillis: Long = eventPeriodMillis
+ )
+
+ /**
+ * Sends a move event [delayMillis] after the last sent event without updating any of the
+ * pointer positions.
+ *
+ * This overload is a convenience method for the common case where the gesture only has one
+ * pointer.
+ *
+ * @param relativeHistoricalTimes Time of each historical event, as a millisecond relative to
+ * the time the actual event is sent. For example, -10L means 10ms earlier.
+ * @param historicalCoordinates Coordinates of each historical event, in the same coordinate
+ * space as [moveTo]. The list must have the same size as [relativeHistoricalTimes].
+ * @param delayMillis The time between the last sent event and this event.
+ * [eventPeriodMillis] by default.
+ */
+ @ExperimentalTestApi
+ fun moveWithHistory(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<Offset>,
+ delayMillis: Long = eventPeriodMillis
+ ) = moveWithHistoryMultiPointer(
+ relativeHistoricalTimes,
+ listOf(historicalCoordinates),
+ delayMillis
+ )
+
+ /**
* Sends an up event for the pointer with the given [pointerId], or the default pointer if
* [pointerId] is omitted, on the associated node.
*
@@ -285,9 +318,9 @@
* Performs a long click gesture (aka a long press) on the associated node.
*
* The long click is done at the given [position], or in the [center] if the [position] is
- * omitted. By default, the [durationMillis] of the press is [LongPressTimeoutMillis] + 100
- * milliseconds. The [position] is in the node's local coordinate system, where (0, 0) is the top
- * left corner of the node.
+ * omitted. By default, the [durationMillis] of the press is 100ms longer than the minimum
+ * required duration for a long press. The [position] is in the node's local coordinate system,
+ * where (0, 0) is the top left corner of the node.
*
* @param position The position of the long click, in the node's local coordinate system. If
* omitted, the [center] of the node will be used.
@@ -295,21 +328,25 @@
*/
fun TouchInjectionScope.longClick(
position: Offset = center,
- durationMillis: Long = LongPressTimeoutMillis + 100
+ durationMillis: Long = viewConfiguration.longPressTimeoutMillis + 100
) {
- require(durationMillis >= LongPressTimeoutMillis) {
- "Long click must have a duration of at least ${LongPressTimeoutMillis}ms"
+ require(durationMillis >= viewConfiguration.longPressTimeoutMillis) {
+ "Long click must have a duration of at least ${viewConfiguration.longPressTimeoutMillis}ms"
}
swipe(position, position, durationMillis)
}
+// The average of min and max is a safe default
+private val ViewConfiguration.defaultDoubleTapDelayMillis: Long
+ get() = (doubleTapMinTimeMillis + doubleTapTimeoutMillis) / 2
+
/**
* Performs a double click gesture (aka a double tap) on the associated node.
*
* The double click is done at the given [position] or in the [center] if the [position] is
- * omitted. By default, the [delayMillis] between the first and the second click is 145
- * milliseconds. The [position] is in the node's local coordinate system, where (0, 0) is the top
- * left corner of the node.
+ * omitted. By default, the [delayMillis] between the first and the second click is half way in
+ * between the minimum and maximum required delay for a double click. The [position] is in the
+ * node's local coordinate system, where (0, 0) is the top left corner of the node.
*
* @param position The position of the double click, in the node's local coordinate system.
* If omitted, the [center] position will be used.
@@ -318,10 +355,15 @@
*/
fun TouchInjectionScope.doubleClick(
position: Offset = center,
- delayMillis: Long = DoubleClickDelayMillis
+ delayMillis: Long = viewConfiguration.defaultDoubleTapDelayMillis
) {
- require(delayMillis <= DoubleTapTimeoutMillis - 10) {
- "Time between clicks in double click can be at most ${DoubleTapTimeoutMillis - 10}ms"
+ require(delayMillis >= viewConfiguration.doubleTapMinTimeMillis) {
+ "Time between clicks in double click must be at least " +
+ "${viewConfiguration.doubleTapMinTimeMillis}ms"
+ }
+ require(delayMillis < viewConfiguration.doubleTapTimeoutMillis) {
+ "Time between clicks in double click must be smaller than " +
+ "${viewConfiguration.doubleTapTimeoutMillis}ms"
}
click(position)
advanceEventTime(delayMillis)
@@ -517,7 +559,8 @@
*
* @param start The start position of the gesture, in the node's local coordinate system
* @param end The end position of the gesture, in the node's local coordinate system
- * @param endVelocity The velocity of the gesture at the moment it ends. Must be positive.
+ * @param endVelocity The velocity of the gesture at the moment it ends in px/second. Must be
+ * positive.
* @param durationMillis The duration of the gesture in milliseconds. Must be long enough that at
* least 3 input events are generated, which happens with a duration of 25ms or more.
*
diff --git a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
index cc97b04..bc21ff8 100644
--- a/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
+++ b/compose/ui/ui-test/src/desktopMain/kotlin/androidx/compose/ui/test/DesktopInputDispatcher.desktop.kt
@@ -14,10 +14,14 @@
* limitations under the License.
*/
+@file:OptIn(InternalComposeUiApi::class)
+
package androidx.compose.ui.test
+import androidx.compose.ui.InternalComposeUiApi
import androidx.compose.ui.input.pointer.PointerId
import androidx.compose.ui.input.pointer.TestPointerInputEventData
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.node.RootForTest
import androidx.compose.ui.platform.DesktopRootForTest
@@ -48,6 +52,14 @@
enqueueEvent(pointerInputEvent(isMousePressed))
}
+ override fun PartialGesture.enqueueMoves(
+ relativeHistoricalTimes: List<Long>,
+ historicalCoordinates: List<List<Offset>>
+ ) {
+ // TODO: add support for historical events
+ enqueueMove()
+ }
+
override fun PartialGesture.enqueueUp(pointerId: Int) {
isMousePressed = false
enqueueEvent(pointerInputEvent(isMousePressed))
@@ -105,7 +117,7 @@
return event
}
- override fun sendAllSynchronous() {
+ override fun flush() {
val copy = batchedEvents.toList()
batchedEvents.clear()
copy.forEach {
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/Constants.kt
similarity index 79%
rename from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/Constants.kt
index 2ab52fb..bc9e5ed 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/Constants.kt
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.compose.ui.test
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+internal const val RobolectricMinSdk = 21
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
similarity index 86%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
index 2b0daea..ca53f9d 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/AdvanceEventTimeTest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2019 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -18,18 +18,21 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.AndroidInputDispatcher
+import androidx.compose.ui.test.RobolectricMinSdk
import androidx.test.filters.SmallTest
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
+import org.robolectric.ParameterizedRobolectricTestRunner
+import org.robolectric.annotation.Config
/**
* Tests if [AndroidInputDispatcher.advanceEventTime] works by sending three events with a
* delay in between them.
*/
@SmallTest
-@RunWith(Parameterized::class)
+@RunWith(ParameterizedRobolectricTestRunner::class)
+@Config(minSdk = RobolectricMinSdk)
class AdvanceEventTimeTest(private val config: TestConfig) : InputDispatcherTest() {
data class TestConfig(
val firstDelayMillis: Long,
@@ -40,7 +43,7 @@
private val anyPosition = Offset.Zero
@JvmStatic
- @Parameterized.Parameters(name = "{0}")
+ @ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
fun createTestSet(): List<TestConfig> {
return mutableListOf<TestConfig>().apply {
for (delay1 in listOf(0L, 23L)) {
@@ -65,7 +68,7 @@
subject.enqueueTouchMove()
subject.advanceEventTime(config.secondDelayMillis)
subject.enqueueTouchUp(0)
- subject.sendAllSynchronous()
+ subject.flush()
// Check if the time between the events was exactly the delay
val expectedFirstDelay = config.firstDelayMillis
diff --git a/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
new file mode 100644
index 0000000..e915cf4
--- /dev/null
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/BatchingTest.kt
@@ -0,0 +1,321 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
+
+import androidx.compose.testutils.expectError
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.RobolectricMinSdk
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+
+@RunWith(AndroidJUnit4::class)
+@Config(minSdk = RobolectricMinSdk)
+class BatchingTest : InputDispatcherTest() {
+
+ companion object {
+ private const val cannotEnqueueError = "Can't enqueue touch event \\(.*\\), " +
+ "AndroidInputDispatcher has already been disposed"
+ private const val cannotFlushError =
+ "Can't flush events, AndroidInputDispatcher has already been disposed"
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. flush sends
+ * 3. dispose doesn't send more
+ */
+ @Test
+ fun enqueueFlushDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. flush sends
+ subject.flush()
+ assertThat(recorder.events).hasSize(3)
+
+ // 3. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).hasSize(3)
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. flush sends
+ * 3. flush again doesn't send more
+ * 4. dispose doesn't send more
+ */
+ @Test
+ fun enqueueFlushFlushDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. flush sends
+ subject.flush()
+ assertThat(recorder.events).hasSize(3)
+
+ // 3. flush again doesn't send more
+ subject.flush()
+ assertThat(recorder.events).hasSize(3)
+
+ // 4. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).hasSize(3)
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. flush sends
+ * 3. enqueue can be called again
+ * 4. dispose doesn't send more
+ */
+ @Test
+ fun enqueueFlushEnqueueDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. flush sends
+ subject.flush()
+ assertThat(recorder.events).hasSize(3)
+
+ // 3. enqueue can be called again
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).hasSize(3)
+
+ // 4. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).hasSize(3)
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. flush sends
+ * 3. enqueue can be called again
+ * 4. flush again does send more
+ * 5. dispose doesn't send more
+ */
+ @Test
+ fun enqueueFlushEnqueueFlushDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. flush sends
+ subject.flush()
+ assertThat(recorder.events).hasSize(3)
+
+ // 3. enqueue can be called again
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).hasSize(3)
+
+ // 4. flush again does send more
+ subject.flush()
+ assertThat(recorder.events).hasSize(4)
+
+ // 5. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).hasSize(4)
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. dispose doesn't send more
+ * 3. subsequent enqueue fails
+ * 4. subsequent dispose succeeds and doesn't send more
+ */
+ @Test
+ fun enqueueDisposeEnqueueDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+
+ // 3. subsequent enqueue fails
+ expectError<IllegalStateException>(expectedMessage = cannotEnqueueError) {
+ subject.enqueueTouchMove()
+ }
+ assertThat(recorder.events).isEmpty()
+
+ // 4. subsequent dispose succeeds and doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. dispose doesn't send more
+ * 3. subsequent flush fails
+ * 4. subsequent dispose succeeds and doesn't send more
+ */
+ @Test
+ fun enqueueDisposeFlushDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+
+ // 3. subsequent flush fails
+ expectError<IllegalStateException>(expectedMessage = cannotFlushError) {
+ subject.flush()
+ }
+ assertThat(recorder.events).isEmpty()
+
+ // 4. subsequent dispose succeeds and doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+ }
+
+ /**
+ * Tests that:
+ * 1. enqueue doesn't send
+ * 2. dispose doesn't send more
+ * 3. subsequent dispose succeeds and doesn't send more
+ */
+ @Test
+ fun enqueueDisposeDispose() {
+ // 1. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+
+ // 3. subsequent dispose succeeds and doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+ }
+
+ /**
+ * Tests that:
+ * 1. flush doesn't send
+ * 2. enqueue doesn't send
+ * 3. subsequent flush sends
+ * 4. dispose doesn't send more
+ */
+ @Test
+ fun flushEnqueueFlushDispose() {
+ // 1. flush doesn't send
+ subject.flush()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 3. subsequent flush sends
+ subject.flush()
+ assertThat(recorder.events).hasSize(3)
+
+ // 4. dispose doesn't send more
+ subject.dispose()
+ assertThat(recorder.events).hasSize(3)
+ }
+
+ /**
+ * Tests that:
+ * 1. flush doesn't send
+ * 2. enqueue doesn't send
+ * 3. dispose doesn't send
+ */
+ @Test
+ fun flushEnqueueDispose() {
+ // 1. flush doesn't send
+ subject.flush()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. enqueue doesn't send
+ subject.enqueueTouchDown(0, Offset.Zero)
+ subject.enqueueTouchMove()
+ subject.enqueueTouchMove()
+ assertThat(recorder.events).isEmpty()
+
+ // 3. dispose doesn't send
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+ }
+
+ /**
+ * Tests that:
+ * 1. flush doesn't send
+ * 2. subsequent flush succeeds and doesn't send
+ * 3. dispose doesn't send
+ */
+ @Test
+ fun flushFlushDispose() {
+ // 1. flush doesn't send
+ subject.flush()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. subsequent flush succeeds and doesn't send
+ subject.flush()
+ assertThat(recorder.events).isEmpty()
+
+ // 3. dispose doesn't send
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+ }
+
+ /**
+ * Tests that:
+ * 1. flush doesn't send
+ * 2. dispose doesn't send
+ */
+ @Test
+ fun flushDispose() {
+ // 1. flush doesn't send
+ subject.flush()
+ assertThat(recorder.events).isEmpty()
+
+ // 2. dispose doesn't send
+ subject.dispose()
+ assertThat(recorder.events).isEmpty()
+ }
+}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
similarity index 81%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
index 63f0e35..0185521 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/InputDispatcherTest.kt
@@ -18,38 +18,33 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.test.AndroidInputDispatcher
-import androidx.compose.ui.test.InputDispatcher
import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.test.MainTestClock
import androidx.compose.ui.test.TestOwner
import androidx.compose.ui.test.createTestContext
-import androidx.compose.ui.test.util.InputDispatcherTestRule
import androidx.compose.ui.test.util.MotionEventRecorder
+import androidx.compose.ui.test.util.assertNoTouchGestureInProgress
import com.google.common.truth.Truth.assertThat
import com.nhaarman.mockitokotlin2.any
import com.nhaarman.mockitokotlin2.doReturn
import com.nhaarman.mockitokotlin2.mock
import org.junit.After
-import org.junit.Rule
-import org.junit.rules.TestRule
@OptIn(InternalTestApi::class)
-open class InputDispatcherTest(eventPeriodOverride: Long? = null) {
-
- @get:Rule
- val inputDispatcherRule: TestRule = InputDispatcherTestRule(
- eventPeriodOverride = eventPeriodOverride
- )
+open class InputDispatcherTest {
internal val recorder = MotionEventRecorder()
- private val testClock: MainTestClock = mock()
+
private val testOwner: TestOwner = mock {
+ val testClock: MainTestClock = mock()
on { mainClock } doReturn testClock
on { runOnUiThread(any<() -> Any>()) }.then {
it.getArgument<() -> Any>(0).invoke()
}
}
+
private val testContext = createTestContext(testOwner)
+
internal val subject = AndroidInputDispatcher(testContext, null, recorder::recordEvent)
@After
@@ -83,9 +78,5 @@
advanceEventTime(delay)
}
enqueueTouchCancel()
- verifyNoTouchGestureInProgress()
-}
-
-internal fun InputDispatcher.verifyNoTouchGestureInProgress() {
- assertThat((this as AndroidInputDispatcher).isTouchInProgress).isFalse()
+ assertNoTouchGestureInProgress()
}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/IsGestureInProgressTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/IsGestureInProgressTest.kt
similarity index 85%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/IsGestureInProgressTest.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/IsGestureInProgressTest.kt
index a094c61..36187a8 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/IsGestureInProgressTest.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/IsGestureInProgressTest.kt
@@ -17,9 +17,15 @@
package androidx.compose.ui.test.inputdispatcher
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.RobolectricMinSdk
+import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+@RunWith(AndroidJUnit4::class)
+@Config(minSdk = RobolectricMinSdk)
class IsGestureInProgressTest : InputDispatcherTest() {
companion object {
private val anyPosition = Offset.Zero
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
similarity index 94%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
index 8bba9a6..a8b7999 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/MouseEventsTest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -37,22 +37,24 @@
import androidx.compose.ui.test.ExperimentalTestApi
import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
import androidx.compose.ui.test.MouseButton
+import androidx.compose.ui.test.RobolectricMinSdk
import androidx.compose.ui.test.ScrollWheel
-import androidx.compose.ui.test.util.Touchscreen
-import androidx.compose.ui.test.util.Finger
import androidx.compose.ui.test.util.assertHasValidEventTimes
-import androidx.compose.ui.test.util.verifyEvent
import androidx.compose.ui.test.util.verifyMouseEvent
-import androidx.compose.ui.test.util.verifyPointer
-import androidx.test.filters.SmallTest
+import androidx.compose.ui.test.util.verifyTouchEvent
+import androidx.compose.ui.test.util.verifyTouchPointer
+import androidx.test.ext.junit.runners.AndroidJUnit4
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
/**
* Tests if [AndroidInputDispatcher.enqueueTouchDown] works
*/
-@SmallTest
+@RunWith(AndroidJUnit4::class)
+@Config(minSdk = RobolectricMinSdk)
@OptIn(ExperimentalTestApi::class)
class MouseEventsTest : InputDispatcherTest() {
companion object {
@@ -105,7 +107,7 @@
subject.enqueueMouseMove(position3)
subject.verifyMousePosition(position3)
expectedEvents += 1 // hover
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -160,7 +162,7 @@
subject.advanceEventTime()
subject.enqueueMouseCancel()
expectedEvents += 1 // cancel
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -227,7 +229,7 @@
subject.advanceEventTime()
subject.enqueueMousePress(MouseButton.Tertiary.buttonId)
expectedEvents += 3 // exit + down + press
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -320,7 +322,7 @@
subject.enqueueMouseExit(position3)
subject.verifyMousePosition(position3)
expectedEvents += 1 // exit
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -384,7 +386,7 @@
subject.advanceEventTime()
subject.enqueueMouseScroll(3f, scrollWheel)
expectedEvents += 2 // hover + scroll
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -455,7 +457,7 @@
subject.advanceEventTime()
subject.enqueueMouseCancel()
expectedEvents += 1 // cancel
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -497,7 +499,7 @@
subject.advanceEventTime()
subject.enqueueMousePress(MouseButton.Primary.buttonId)
expectedEvents += 3 // cancel + down + press
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -506,15 +508,15 @@
// down
var t = 0L
events.removeFirst(1).let { (downEvent) ->
- downEvent.verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen)
- downEvent.verifyPointer(1, position1, Finger)
+ downEvent.verifyTouchEvent(1, ACTION_DOWN, 0, t)
+ downEvent.verifyTouchPointer(1, position1)
}
// cancel
t += eventPeriodMillis
events.removeFirst(1).let { (cancelEvent) ->
- cancelEvent.verifyEvent(1, ACTION_CANCEL, 0, t, Touchscreen)
- cancelEvent.verifyPointer(1, position1, Finger)
+ cancelEvent.verifyTouchEvent(1, ACTION_CANCEL, 0, t)
+ cancelEvent.verifyTouchPointer(1, position1)
}
// down + press
@@ -538,7 +540,7 @@
subject.advanceEventTime()
subject.enqueueMouseMove(position2)
expectedEvents += 3 // cancel + enter + hover
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -547,15 +549,15 @@
// down
var t = 0L
events.removeFirst(1).let { (downEvent) ->
- downEvent.verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen)
- downEvent.verifyPointer(1, position1, Finger)
+ downEvent.verifyTouchEvent(1, ACTION_DOWN, 0, t)
+ downEvent.verifyTouchPointer(1, position1)
}
// cancel
t += eventPeriodMillis
events.removeFirst(1).let { (cancelEvent) ->
- cancelEvent.verifyEvent(1, ACTION_CANCEL, 0, t, Touchscreen)
- cancelEvent.verifyPointer(1, position1, Finger)
+ cancelEvent.verifyTouchEvent(1, ACTION_CANCEL, 0, t)
+ cancelEvent.verifyTouchPointer(1, position1)
}
// enter + hover
@@ -577,7 +579,7 @@
subject.advanceEventTime()
subject.enqueueMouseScroll(1f, ScrollWheel.Vertical)
expectedEvents += 4 // cancel + enter + hover + scroll
- subject.sendAllSynchronous()
+ subject.flush()
recorder.assertHasValidEventTimes()
assertThat(recorder.events).hasSize(expectedEvents)
@@ -586,15 +588,15 @@
// down
var t = 0L
events.removeFirst(1).let { (downEvent) ->
- downEvent.verifyEvent(1, ACTION_DOWN, 0, t, Touchscreen)
- downEvent.verifyPointer(1, position1, Finger)
+ downEvent.verifyTouchEvent(1, ACTION_DOWN, 0, t)
+ downEvent.verifyTouchPointer(1, position1)
}
// cancel
t += eventPeriodMillis
events.removeFirst(1).let { (cancelEvent) ->
- cancelEvent.verifyEvent(1, ACTION_CANCEL, 0, t, Touchscreen)
- cancelEvent.verifyPointer(1, position1, Finger)
+ cancelEvent.verifyTouchEvent(1, ACTION_CANCEL, 0, t)
+ cancelEvent.verifyTouchPointer(1, position1)
}
// enter + hover + scroll
diff --git a/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt
new file mode 100644
index 0000000..1bb77bc
--- /dev/null
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/inputdispatcher/TouchEventsTest.kt
@@ -0,0 +1,757 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.test.inputdispatcher
+
+import android.view.MotionEvent.ACTION_CANCEL
+import android.view.MotionEvent.ACTION_DOWN
+import android.view.MotionEvent.ACTION_MOVE
+import android.view.MotionEvent.ACTION_POINTER_DOWN
+import android.view.MotionEvent.ACTION_POINTER_UP
+import android.view.MotionEvent.ACTION_UP
+import androidx.compose.testutils.expectError
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.test.AndroidInputDispatcher
+import androidx.compose.ui.test.InputDispatcher.Companion.eventPeriodMillis
+import androidx.compose.ui.test.RobolectricMinSdk
+import androidx.compose.ui.test.util.assertHasValidEventTimes
+import androidx.compose.ui.test.util.assertNoTouchGestureInProgress
+import androidx.compose.ui.test.util.verifyTouchEvent
+import androidx.compose.ui.test.util.verifyTouchPointer
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.annotation.Config
+
+/**
+ * Tests if [AndroidInputDispatcher.enqueueTouchDown] works
+ */
+@RunWith(AndroidJUnit4::class)
+@Config(minSdk = RobolectricMinSdk)
+class TouchEventsTest : InputDispatcherTest() {
+ companion object {
+ // Pointer ids
+ private const val pointer1 = 11
+ private const val pointer2 = 22
+ private const val pointer3 = 33
+ private const val pointer4 = 44
+
+ // Positions, mostly used with corresponding pointerId:
+ // pointerX with positionX or positionX_Y
+ private val position1 = Offset(1f, 1f)
+ private val position2 = Offset(2f, 2f)
+ private val position3 = Offset(3f, 3f)
+ private val position4 = Offset(4f, 4f)
+
+ private val position1_1 = Offset(11f, 11f)
+ private val position2_1 = Offset(21f, 21f)
+ private val position3_1 = Offset(31f, 31f)
+
+ private val position1_2 = Offset(12f, 12f)
+ private val position2_2 = Offset(22f, 22f)
+
+ private val position1_3 = Offset(13f, 13f)
+ }
+
+ @Test
+ fun onePointer_down() {
+ subject.generateTouchDownAndCheck(pointer1, position1)
+ subject.flush()
+
+ val t = 0L
+ recorder.assertHasValidEventTimes()
+ assertThat(recorder.events).hasSize(1)
+ recorder.events[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ recorder.events[0].verifyTouchPointer(pointer1, position1)
+ }
+
+ @Test
+ fun onePointer_downUp() {
+ subject.generateTouchDownAndCheck(pointer1, position1)
+ subject.generateTouchUpAndCheck(pointer1)
+ subject.assertNoTouchGestureInProgress()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ val t = 0L
+ assertThat(this).hasSize(2)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1)
+
+ this[1].verifyTouchEvent(1, ACTION_UP, 0, t) // pointer1
+ this[1].verifyTouchPointer(pointer1, position1)
+ }
+ }
+
+ @Test
+ fun onePointer_downDelayUp() {
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchUpAndCheck(pointer1, 2 * eventPeriodMillis)
+ subject.assertNoTouchGestureInProgress()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(2)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ t += 2 * eventPeriodMillis
+ this[1].verifyTouchEvent(1, ACTION_UP, 0, t) // pointer1
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ }
+ }
+
+ @Test
+ fun onePointer_downUpdateMove() {
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.flush()
+
+ var t = 0L
+ recorder.assertHasValidEventTimes()
+ assertThat(recorder.events).hasSize(2)
+ recorder.events[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ recorder.events[0].verifyTouchPointer(pointer1, position1_1)
+
+ t += eventPeriodMillis
+ recorder.events[1].verifyTouchEvent(1, ACTION_MOVE, 0, t) // pointer1
+ recorder.events[1].verifyTouchPointer(pointer1, position1_2)
+ }
+
+ @Test
+ fun onePointer_downCancel() {
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.advanceEventTime()
+ subject.generateCancelAndCheckPointers()
+ subject.assertNoTouchGestureInProgress()
+ subject.flush()
+ recorder.assertHasValidEventTimes()
+
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(2)
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ t += eventPeriodMillis
+ this[1].verifyTouchEvent(1, ACTION_CANCEL, 0, t)
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ }
+ }
+
+ @Test
+ fun twoPointers_downDownMoveMove() {
+ // 2 fingers, both go down before they move
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.updateTouchPointerAndCheck(pointer2, position2_2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(4)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1_2)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[3].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[3].verifyTouchPointer(pointer1, position1_2)
+ this[3].verifyTouchPointer(pointer2, position2_2)
+ }
+ }
+
+ @Test
+ fun twoPointers_downMoveDownMove() {
+ // 2 fingers, 1st finger moves before 2nd finger goes down and moves
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.updateTouchPointerAndCheck(pointer2, position2_2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(4)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ t += eventPeriodMillis
+ this[1].verifyTouchEvent(1, ACTION_MOVE, 0, t)
+ this[1].verifyTouchPointer(pointer1, position1_2)
+
+ this[2].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[2].verifyTouchPointer(pointer1, position1_2)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[3].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[3].verifyTouchPointer(pointer1, position1_2)
+ this[3].verifyTouchPointer(pointer2, position2_2)
+ }
+ }
+
+ @Test
+ fun twoPointers_moveSimultaneously() {
+ // 2 fingers, use [updateTouchPointer] and [enqueueTouchMove]
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.updateTouchPointerAndCheck(pointer2, position2_2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(3)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1_2)
+ this[2].verifyTouchPointer(pointer2, position2_2)
+ }
+ }
+
+ @Test
+ fun twoPointers_downUp_sameOrder() {
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.generateTouchUpAndCheck(pointer2)
+ subject.generateTouchUpAndCheck(pointer1)
+ subject.assertNoTouchGestureInProgress()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ val t = 0L
+ assertThat(this).hasSize(4)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ this[2].verifyTouchEvent(2, ACTION_POINTER_UP, 1, t) // pointer2
+ this[2].verifyTouchPointer(pointer1, position1_1)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+
+ this[3].verifyTouchEvent(1, ACTION_UP, 0, t) // pointer1
+ this[3].verifyTouchPointer(pointer1, position1_1)
+ }
+ }
+
+ @Test
+ fun twoPointers_downUp_inverseOrder() {
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.generateTouchUpAndCheck(pointer1)
+ subject.generateTouchUpAndCheck(pointer2)
+ subject.assertNoTouchGestureInProgress()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ val t = 0L
+ assertThat(this).hasSize(4)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ this[2].verifyTouchEvent(2, ACTION_POINTER_UP, 0, t) // pointer1
+ this[2].verifyTouchPointer(pointer1, position1_1)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+
+ this[3].verifyTouchEvent(1, ACTION_UP, 0, t) // pointer2
+ this[3].verifyTouchPointer(pointer2, position2_1)
+ }
+ }
+
+ @Test
+ fun twoPointers_downDownCancel() {
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.advanceEventTime()
+ subject.generateCancelAndCheckPointers()
+ subject.assertNoTouchGestureInProgress()
+ subject.flush()
+ recorder.assertHasValidEventTimes()
+
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(3)
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_CANCEL, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1_1)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+ }
+ }
+
+ @Test
+ fun threePointers_notSimultaneously() {
+ // 3 fingers, where the 1st finger goes up before the 3rd finger goes down (no overlap)
+
+ subject.generateTouchDownAndCheck(pointer1, position1)
+ subject.generateTouchDownAndCheck(pointer2, position2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchUpAndCheck(pointer1)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchDownAndCheck(pointer3, position3)
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(6)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1)
+ this[1].verifyTouchPointer(pointer2, position2)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1)
+ this[2].verifyTouchPointer(pointer2, position2)
+
+ this[3].verifyTouchEvent(2, ACTION_POINTER_UP, 0, t) // pointer1
+ this[3].verifyTouchPointer(pointer1, position1)
+ this[3].verifyTouchPointer(pointer2, position2)
+
+ t += eventPeriodMillis
+ this[4].verifyTouchEvent(1, ACTION_MOVE, 0, t)
+ this[4].verifyTouchPointer(pointer2, position2)
+
+ this[5].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer3
+ this[5].verifyTouchPointer(pointer2, position2)
+ this[5].verifyTouchPointer(pointer3, position3)
+ }
+ }
+
+ @Test
+ fun threePointers_pointerIdReuse() {
+ // 3 fingers, where the 1st finger goes up before the 3rd finger goes down, and the 3rd
+ // fingers reuses the pointerId of finger 1
+
+ subject.generateTouchDownAndCheck(pointer1, position1)
+ subject.generateTouchDownAndCheck(pointer2, position2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchUpAndCheck(pointer1)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchDownAndCheck(pointer1, position1_2)
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(6)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1)
+ this[1].verifyTouchPointer(pointer2, position2)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1)
+ this[2].verifyTouchPointer(pointer2, position2)
+
+ this[3].verifyTouchEvent(2, ACTION_POINTER_UP, 0, t) // pointer1
+ this[3].verifyTouchPointer(pointer1, position1)
+ this[3].verifyTouchPointer(pointer2, position2)
+
+ t += eventPeriodMillis
+ this[4].verifyTouchEvent(1, ACTION_MOVE, 0, t)
+ this[4].verifyTouchPointer(pointer2, position2)
+
+ this[5].verifyTouchEvent(2, ACTION_POINTER_DOWN, 0, t) // pointer1
+ this[5].verifyTouchPointer(pointer1, position1_2)
+ this[5].verifyTouchPointer(pointer2, position2)
+ }
+ }
+
+ @Test
+ fun fourPointers_downOnly() {
+ subject.generateTouchDownAndCheck(pointer3, position3)
+ subject.generateTouchDownAndCheck(pointer1, position1)
+ subject.generateTouchDownAndCheck(pointer4, position4)
+ subject.generateTouchDownAndCheck(pointer2, position2)
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ val t = 0L
+ assertThat(this).hasSize(4)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer3
+ this[0].verifyTouchPointer(pointer3, position3)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 0, t) // pointer1
+ this[1].verifyTouchPointer(pointer1, position1)
+ this[1].verifyTouchPointer(pointer3, position3)
+
+ this[2].verifyTouchEvent(3, ACTION_POINTER_DOWN, 2, t) // pointer4
+ this[2].verifyTouchPointer(pointer1, position1)
+ this[2].verifyTouchPointer(pointer3, position3)
+ this[2].verifyTouchPointer(pointer4, position4)
+
+ this[3].verifyTouchEvent(4, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[3].verifyTouchPointer(pointer1, position1)
+ this[3].verifyTouchPointer(pointer2, position2)
+ this[3].verifyTouchPointer(pointer3, position3)
+ this[3].verifyTouchPointer(pointer4, position4)
+ }
+ }
+
+ @Test
+ fun fourPointers_downWithMove() {
+ // 4 fingers, going down at different times
+
+ subject.generateTouchDownAndCheck(pointer3, position3)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchDownAndCheck(pointer1, position1)
+ subject.generateTouchDownAndCheck(pointer2, position2)
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.advanceEventTime()
+ subject.enqueueTouchMove()
+ subject.generateTouchDownAndCheck(pointer4, position4)
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(8)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer3
+ this[0].verifyTouchPointer(pointer3, position3)
+
+ t += eventPeriodMillis
+ this[1].verifyTouchEvent(1, ACTION_MOVE, 0, t)
+ this[1].verifyTouchPointer(pointer3, position3)
+
+ this[2].verifyTouchEvent(2, ACTION_POINTER_DOWN, 0, t) // pointer1
+ this[2].verifyTouchPointer(pointer1, position1)
+ this[2].verifyTouchPointer(pointer3, position3)
+
+ this[3].verifyTouchEvent(3, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[3].verifyTouchPointer(pointer1, position1)
+ this[3].verifyTouchPointer(pointer2, position2)
+ this[3].verifyTouchPointer(pointer3, position3)
+
+ for (i in 4..6) {
+ t += eventPeriodMillis
+ this[i].verifyTouchEvent(3, ACTION_MOVE, 0, t)
+ this[i].verifyTouchPointer(pointer1, position1)
+ this[i].verifyTouchPointer(pointer2, position2)
+ this[i].verifyTouchPointer(pointer3, position3)
+ }
+
+ this[7].verifyTouchEvent(4, ACTION_POINTER_DOWN, 3, t) // pointer4
+ this[7].verifyTouchPointer(pointer1, position1)
+ this[7].verifyTouchPointer(pointer2, position2)
+ this[7].verifyTouchPointer(pointer3, position3)
+ this[7].verifyTouchPointer(pointer4, position4)
+ }
+ }
+
+ @Test
+ fun enqueueTouchDown_flushesPointerMovement() {
+ // Movement from [updateTouchPointer] that hasn't been sent will be sent when sending DOWN
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.updateTouchPointerAndCheck(pointer1, position1_3)
+ subject.advanceEventTime()
+ subject.generateTouchDownAndCheck(pointer3, position3_1)
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(4)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_MOVE, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1_3)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+
+ this[3].verifyTouchEvent(3, ACTION_POINTER_DOWN, 2, t) // pointer2
+ this[3].verifyTouchPointer(pointer1, position1_3)
+ this[3].verifyTouchPointer(pointer2, position2_1)
+ this[3].verifyTouchPointer(pointer3, position3_1)
+ }
+ }
+
+ @Test
+ fun enqueueTouchUp_flushesPointerMovement() {
+ // Movement from [updateTouchPointer] that hasn't been sent will be sent when sending UP
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.updateTouchPointerAndCheck(pointer1, position1_3)
+ subject.advanceEventTime()
+ subject.generateTouchUpAndCheck(pointer1)
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(3)
+
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_POINTER_UP, 0, t) // pointer1
+ this[2].verifyTouchPointer(pointer1, position1_3)
+ this[2].verifyTouchPointer(pointer2, position2_1)
+ }
+ }
+
+ @Test
+ fun enqueueTouchCancel_doesNotFlushPointerMovement() {
+ // 2 fingers, both with pending movement.
+ // CANCEL doesn't force a MOVE, but _does_ reflect the latest positions
+ subject.generateTouchDownAndCheck(pointer1, position1_1)
+ subject.generateTouchDownAndCheck(pointer2, position2_1)
+ subject.updateTouchPointerAndCheck(pointer1, position1_2)
+ subject.updateTouchPointerAndCheck(pointer2, position2_2)
+ subject.advanceEventTime()
+ subject.generateCancelAndCheckPointers()
+ subject.flush()
+
+ recorder.assertHasValidEventTimes()
+ recorder.events.apply {
+ var t = 0L
+ assertThat(this).hasSize(3)
+ this[0].verifyTouchEvent(1, ACTION_DOWN, 0, t) // pointer1
+ this[0].verifyTouchPointer(pointer1, position1_1)
+
+ this[1].verifyTouchEvent(2, ACTION_POINTER_DOWN, 1, t) // pointer2
+ this[1].verifyTouchPointer(pointer1, position1_1)
+ this[1].verifyTouchPointer(pointer2, position2_1)
+
+ t += eventPeriodMillis
+ this[2].verifyTouchEvent(2, ACTION_CANCEL, 0, t)
+ this[2].verifyTouchPointer(pointer1, position1_2)
+ this[2].verifyTouchPointer(pointer2, position2_2)
+ }
+ }
+
+ private fun AndroidInputDispatcher.generateCancelAndCheckPointers() {
+ generateTouchCancelAndCheck()
+ assertThat(getCurrentTouchPosition(pointer1)).isNull()
+ assertThat(getCurrentTouchPosition(pointer2)).isNull()
+ assertThat(getCurrentTouchPosition(pointer3)).isNull()
+ }
+
+ @Test
+ fun enqueueTouchDown_afterDown() {
+ subject.enqueueTouchDown(pointer1, position1)
+ expectError<IllegalArgumentException> {
+ subject.enqueueTouchDown(pointer1, position2)
+ }
+ }
+
+ @Test
+ fun updateTouchPointer_withoutDown() {
+ expectError<IllegalStateException> {
+ subject.updateTouchPointer(pointer1, position1_1)
+ }
+ }
+
+ @Test
+ fun updateTouchPointer_wrongPointerId() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ expectError<IllegalArgumentException> {
+ subject.updateTouchPointer(pointer2, position1_2)
+ }
+ }
+
+ @Test
+ fun updateTouchPointer_afterUp() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchUp(pointer1)
+ expectError<IllegalStateException> {
+ subject.updateTouchPointer(pointer1, position1_2)
+ }
+ }
+
+ @Test
+ fun updateTouchPointer_afterCancel() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchCancel()
+ expectError<IllegalStateException> {
+ subject.updateTouchPointer(pointer1, position1_2)
+ }
+ }
+
+ @Test
+ fun enqueueTouchMove_withoutDown() {
+ expectError<IllegalStateException> {
+ subject.enqueueTouchMove()
+ }
+ }
+
+ @Test
+ fun enqueueTouchMove_afterUp() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchUp(pointer1)
+ expectError<IllegalStateException> {
+ subject.enqueueTouchMove()
+ }
+ }
+
+ @Test
+ fun enqueueTouchMove_afterCancel() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchCancel()
+ expectError<IllegalStateException> {
+ subject.enqueueTouchMove()
+ }
+ }
+
+ @Test
+ fun enqueueTouchUp_withoutDown() {
+ expectError<IllegalStateException> {
+ subject.enqueueTouchUp(pointer1)
+ }
+ }
+
+ @Test
+ fun enqueueTouchUp_wrongPointerId() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ expectError<IllegalArgumentException> {
+ subject.enqueueTouchUp(pointer2)
+ }
+ }
+
+ @Test
+ fun enqueueTouchUp_afterUp() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchUp(pointer1)
+ expectError<IllegalStateException> {
+ subject.enqueueTouchUp(pointer1)
+ }
+ }
+
+ @Test
+ fun enqueueTouchUp_afterCancel() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchCancel()
+ expectError<IllegalStateException> {
+ subject.enqueueTouchUp(pointer1)
+ }
+ }
+
+ @Test
+ fun enqueueTouchCancel_withoutDown() {
+ expectError<IllegalStateException> {
+ subject.enqueueTouchCancel()
+ }
+ }
+
+ @Test
+ fun enqueueTouchCancel_afterUp() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchUp(pointer1)
+ expectError<IllegalStateException> {
+ subject.enqueueTouchCancel()
+ }
+ }
+
+ @Test
+ fun enqueueTouchCancel_afterCancel() {
+ subject.enqueueTouchDown(pointer1, position1_1)
+ subject.enqueueTouchCancel()
+ expectError<IllegalStateException> {
+ subject.enqueueTouchCancel()
+ }
+ }
+}
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/TruthTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt
similarity index 94%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/TruthTest.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt
index 1cb8c60..4d2b5ae 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/TruthTest.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/util/IsMonotonicBetweenTest.kt
@@ -17,22 +17,16 @@
package androidx.compose.ui.test.util
import androidx.compose.testutils.expectAssertionError
-import androidx.test.filters.SmallTest
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.Parameterized
-// To satisfy ktlint
-@Suppress("unused")
-private class TruthTest
-
/**
* Tests for `List<Float>.`[isMonotonicBetween]. See documentation of that method for expected
* results.
*/
-@SmallTest
@RunWith(Parameterized::class)
-class ListFloatIsMonotonicBetweenTest(private val config: TestConfig) {
+class IsMonotonicBetweenTest(private val config: TestConfig) {
data class TestConfig(
val values: List<Float>,
val a: Float,
diff --git a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/MotionEventsTest.kt b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt
similarity index 89%
rename from compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/MotionEventsTest.kt
rename to compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt
index 0d0c0ad..6c22ff7 100644
--- a/compose/ui/ui-test/src/androidAndroidTest/kotlin/androidx/compose/ui/test/util/MotionEventsTest.kt
+++ b/compose/ui/ui-test/src/test/kotlin/androidx/compose/ui/test/util/SplitsDurationEquallyIntoTest.kt
@@ -18,24 +18,21 @@
import android.view.MotionEvent
import androidx.compose.testutils.expectAssertionError
-import androidx.test.filters.SmallTest
+import androidx.compose.ui.test.RobolectricMinSdk
import org.junit.After
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
-import org.junit.runners.Parameterized
-
-// To satisfy ktlint
-@Suppress("unused")
-private class MotionEventsTest
+import org.robolectric.ParameterizedRobolectricTestRunner
+import org.robolectric.annotation.Config
/**
* Tests for `List<MotionEvent>.`[splitsDurationEquallyInto]. See documentation of that method
* for expected results.
*/
-@SmallTest
-@RunWith(Parameterized::class)
-class ListMotionEventSplitsDurationEquallyIntoTest(private val config: TestConfig) {
+@RunWith(ParameterizedRobolectricTestRunner::class)
+@Config(minSdk = RobolectricMinSdk)
+class SplitsDurationEquallyIntoTest(private val config: TestConfig) {
data class TestConfig(
val timestamps: List<Long>,
val duration: Long,
@@ -46,7 +43,7 @@
companion object {
@JvmStatic
- @Parameterized.Parameters(name = "{0}")
+ @ParameterizedRobolectricTestRunner.Parameters(name = "{0}")
fun createTestSet(): List<TestConfig> {
return listOf(
// 1/1: ideally [1.0]
diff --git a/compose/ui/ui-test/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker b/compose/ui/ui-test/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
new file mode 100644
index 0000000..1f0955d
--- /dev/null
+++ b/compose/ui/ui-test/src/test/resources/mockito-extensions/org.mockito.plugins.MockMaker
@@ -0,0 +1 @@
+mock-maker-inline
diff --git a/compose/ui/ui-text/build.gradle b/compose/ui/ui-text/build.gradle
index eabae59..1084407 100644
--- a/compose/ui/ui-text/build.gradle
+++ b/compose/ui/ui-text/build.gradle
@@ -66,6 +66,8 @@
androidTestImplementation(libs.mockitoCore)
androidTestImplementation(libs.truth)
androidTestImplementation(libs.mockitoKotlin)
+
+ samples(projectOrArtifact(":compose:ui:ui-text:ui-text-samples"))
}
android {
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt
index 7b87d30..bdfb0cd 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraph.android.kt
@@ -56,6 +56,10 @@
/**
* Android specific implementation for [Paragraph]
*/
+// NOTE(text-perf-review): I see most of the APIs in this class just delegate to TextLayout or to
+// AndroidParagraphIntrinsics. Should we consider just having one TextLayout class which
+// implements Paragraph and ParagraphIntrinsics? it seems like all of these types are immutable
+// and have similar sets of responsibilities.
@OptIn(InternalPlatformTextApi::class)
internal class AndroidParagraph constructor(
val paragraphIntrinsics: AndroidParagraphIntrinsics,
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
index 80ca021..a5025f0 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/platform/AndroidParagraphIntrinsics.android.kt
@@ -73,6 +73,8 @@
text = text,
contextFontSize = textPaint.textSize,
contextTextStyle = style,
+ // NOTE(text-perf-review): this is sabotaging the optimization that
+ // createCharSequence makes where it just uses `text` if there are no spanStyles!
spanStyles = listOf(
AnnotatedString.Range(
item = notAppliedStyle,
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
index 6308476..b4283b6 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraph.kt
@@ -259,6 +259,9 @@
val paragraphIndex = findParagraphByIndex(paragraphInfoList, start)
val path = Path()
+ // NOTE(text-perf-review): this is making 4 of intermediate list allocations for something
+ // that (i think) is in a relatively hot path. Consider implementing as a fastForEach or
+ // for loop with conditionals
paragraphInfoList.fastDrop(paragraphIndex)
.fastTakeWhile { it.startIndex < end }
.fastFilterNot { it.startIndex == it.endIndex }
@@ -613,6 +616,8 @@
* @return The index of the target [ParagraphInfo] in [paragraphInfoList].
*/
internal fun findParagraphByIndex(paragraphInfoList: List<ParagraphInfo>, index: Int): Int {
+ // NOTE(text-perf-review): consider implementing a binarySearch helper that is inline to
+ // avoid allocating every time this method is called
return paragraphInfoList.binarySearch { paragraphInfo ->
when {
paragraphInfo.startIndex > index -> 1
@@ -633,6 +638,8 @@
* @return The index of the target [ParagraphInfo] in [paragraphInfoList].
*/
internal fun findParagraphByY(paragraphInfoList: List<ParagraphInfo>, y: Float): Int {
+ // NOTE(text-perf-review): consider implementing a binarySearch helper that is inline to
+ // avoid allocating every time this method is called
return paragraphInfoList.binarySearch { paragraphInfo ->
when {
paragraphInfo.top > y -> 1
@@ -653,6 +660,8 @@
* @return The index of the target [ParagraphInfo] in [paragraphInfoList].
*/
internal fun findParagraphByLineIndex(paragraphInfoList: List<ParagraphInfo>, lineIndex: Int): Int {
+ // NOTE(text-perf-review): consider implementing a binarySearch helper that is inline to
+ // avoid allocating every time this method is called
return paragraphInfoList.binarySearch { paragraphInfo ->
when {
paragraphInfo.startLineIndex > lineIndex -> 1
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
index 08eb74e..86d55f4 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/MultiParagraphIntrinsics.kt
@@ -47,6 +47,8 @@
resourceLoader: Font.ResourceLoader
) : ParagraphIntrinsics {
+ // NOTE(text-perf-review): why are we using lazy here? Are there cases where these
+ // calculations aren't executed?
override val minIntrinsicWidth: Float by lazy(LazyThreadSafetyMode.NONE) {
infoList.fastMaxBy {
it.intrinsics.minIntrinsicWidth
diff --git a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
index 07ee996..1feb5a5 100644
--- a/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
+++ b/compose/ui/ui-text/src/commonMain/kotlin/androidx/compose/ui/text/TextStyle.kt
@@ -80,6 +80,12 @@
* @see SpanStyle
* @see ParagraphStyle
*/
+// NOTE(text-perf-review): I suggest we implement this class as
+// class TextStyle(val spanStyle: SpanStyle, val paragraphStyle: ParagraphStyle)
+// This would allow for more efficient merge implementations where we don't have to reallocate
+// each of the parts, and we always end up calling toSpanStyle() and toParagraphStyle() anyway.
+// This would also result in a slightly better equals implementation when we are comparing things
+// with shared parts (ie, "Structural sharing")
@Immutable
class TextStyle(
val color: Color = Color.Unspecified,
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
index 7922c3b..c948cfc 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopFont.desktop.kt
@@ -295,7 +295,7 @@
private fun ByteArray.toHexString() = joinToString("") { "%02x".format(it) }
class FontLoader : Font.ResourceLoader {
- val fonts = FontCollection()
+ internal val fonts = FontCollection()
private val fontProvider = TypefaceFontProvider()
init {
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
index d3fb855..e460c61 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraph.desktop.kt
@@ -19,9 +19,9 @@
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.DesktopPath
import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.graphics.asSkiaPath
import androidx.compose.ui.graphics.isSpecified
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.graphics.toArgb
@@ -127,11 +127,13 @@
private val paragraphIntrinsics = intrinsics as DesktopParagraphIntrinsics
+ private val layouter = paragraphIntrinsics.layouter()
+
/**
* Paragraph isn't always immutable, it could be changed via [paint] method without
* rerunning layout
*/
- private var para = paragraphIntrinsics.layoutParagraph(
+ private var para = layouter.layoutParagraph(
width = width,
maxLines = maxLines,
ellipsis = ellipsisChar
@@ -183,9 +185,9 @@
RectHeightMode.MAX,
RectWidthMode.MAX
)
- val path = DesktopPath()
+ val path = Path()
for (b in boxes) {
- path.internalPath.addRect(b.rect)
+ path.asSkiaPath().addRect(b.rect)
}
return path
}
@@ -290,7 +292,7 @@
// workaround for https://bugs.chromium.org/p/skia/issues/detail?id=11321 :(
private val lineMetrics: Array<LineMetrics>
get() = if (text == "") {
- val height = paragraphIntrinsics.defaultHeight.toDouble()
+ val height = layouter.defaultHeight.toDouble()
arrayOf(
LineMetrics(
0, 0, 0, 0, true,
@@ -298,7 +300,7 @@
)
)
} else {
- @Suppress("UNCHECKED_CAST")
+ @Suppress("UNCHECKED_CAST", "USELESS_CAST")
para.lineMetrics as Array<LineMetrics>
}
@@ -375,7 +377,7 @@
shadow: Shadow?,
textDecoration: TextDecoration?
) {
- para = paragraphIntrinsics.layoutParagraph(
+ para = layouter.layoutParagraph(
width = width,
maxLines = maxLines,
ellipsis = ellipsisChar,
@@ -550,7 +552,7 @@
val ps = textStyleToParagraphStyle(textStyle)
if (maxLines != Int.MAX_VALUE) {
- ps.maxLinesCount = maxLines.toLong()
+ ps.maxLinesCount = maxLines
ps.ellipsis = ellipsis
}
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
index 998fd99..92a557e 100644
--- a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/DesktopParagraphIntrinsics.desktop.kt
@@ -15,9 +15,6 @@
*/
package androidx.compose.ui.text.platform
-import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.Shadow
-import androidx.compose.ui.graphics.takeOrElse
import androidx.compose.ui.text.AnnotatedString.Range
import androidx.compose.ui.text.ParagraphIntrinsics
import androidx.compose.ui.text.Placeholder
@@ -25,10 +22,8 @@
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.Font
import androidx.compose.ui.text.style.ResolvedTextDirection
-import androidx.compose.ui.text.style.TextDecoration
import androidx.compose.ui.text.style.TextDirection
import androidx.compose.ui.unit.Density
-import org.jetbrains.skia.paragraph.Paragraph
import kotlin.math.ceil
internal actual fun ActualParagraphIntrinsics(
@@ -50,68 +45,37 @@
internal class DesktopParagraphIntrinsics(
val text: String,
- style: TextStyle,
- spanStyles: List<Range<SpanStyle>>,
- placeholders: List<Range<Placeholder>>,
- density: Density,
- resourceLoader: Font.ResourceLoader
+ private val style: TextStyle,
+ private val spanStyles: List<Range<SpanStyle>>,
+ private val placeholders: List<Range<Placeholder>>,
+ private val density: Density,
+ private val resourceLoader: Font.ResourceLoader
) : ParagraphIntrinsics {
-
- private val fontLoader = resourceLoader as FontLoader
val textDirection = resolveTextDirection(style.textDirection)
- val defaultHeight get() = builder.defaultHeight
- private val builder = ParagraphBuilder(
- fontLoader = fontLoader,
- text = text,
- textStyle = style,
- spanStyles = spanStyles,
- placeholders = placeholders,
- density = density,
- textDirection = textDirection
+
+ private var layouter: ParagraphLayouter? = newLayouter()
+
+ fun layouter(): ParagraphLayouter {
+ val layouter = this.layouter ?: newLayouter()
+ this.layouter = null
+ return layouter
+ }
+
+ private fun newLayouter() = ParagraphLayouter(
+ text, textDirection, style, spanStyles, placeholders, density, resourceLoader
)
- private var para = builder.build()
- private var width = Float.POSITIVE_INFINITY
+
+ override var minIntrinsicWidth = 0f
+ private set
+ override var maxIntrinsicWidth = 0f
+ private set
init {
- para.layout(width)
+ val para = layouter!!.layoutParagraph(Float.POSITIVE_INFINITY)
+ minIntrinsicWidth = ceil(para.minIntrinsicWidth)
+ maxIntrinsicWidth = ceil(para.maxIntrinsicWidth)
}
- fun layoutParagraph(
- width: Float = this.width,
- maxLines: Int = builder.maxLines,
- ellipsis: String = builder.ellipsis,
- color: Color = builder.textStyle.color,
- shadow: Shadow? = builder.textStyle.shadow,
- textDecoration: TextDecoration? = builder.textStyle.textDecoration,
- ): Paragraph {
- val actualColor = color.takeOrElse { builder.textStyle.color }
- if (
- builder.maxLines != maxLines ||
- builder.ellipsis != ellipsis ||
- builder.textStyle.color != actualColor ||
- builder.textStyle.shadow != shadow ||
- builder.textStyle.textDecoration != textDecoration
- ) {
- this.width = width
- builder.maxLines = maxLines
- builder.ellipsis = ellipsis
- builder.textStyle = builder.textStyle.copy(
- color = actualColor,
- shadow = shadow,
- textDecoration = textDecoration
- )
- para = builder.build()
- para.layout(width)
- } else if (this.width != width) {
- this.width = width
- para.layout(width)
- }
- return para
- }
-
- override val minIntrinsicWidth = ceil(para.minIntrinsicWidth)
- override val maxIntrinsicWidth = ceil(para.maxIntrinsicWidth)
-
private fun resolveTextDirection(direction: TextDirection?): ResolvedTextDirection {
return when (direction) {
TextDirection.Ltr -> ResolvedTextDirection.Ltr
diff --git a/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.desktop.kt b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.desktop.kt
new file mode 100644
index 0000000..807c75c
--- /dev/null
+++ b/compose/ui/ui-text/src/desktopMain/kotlin/androidx/compose/ui/text/platform/ParagraphLayouter.desktop.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.text.platform
+
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.graphics.Shadow
+import androidx.compose.ui.graphics.takeOrElse
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.Placeholder
+import androidx.compose.ui.text.SpanStyle
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.Font
+import androidx.compose.ui.text.style.ResolvedTextDirection
+import androidx.compose.ui.text.style.TextDecoration
+import androidx.compose.ui.unit.Density
+import org.jetbrains.skia.paragraph.Paragraph
+
+/**
+ * The purpose of this class is to store already built paragraph and pass it between
+ * different internal entities (from DesktopParagraphIntrinsics to DesktopParagraph).
+ *
+ * An alternative to passing and reusing existed paragraph is to build it again, but it is 2.5x
+ * slower.
+ *
+ * LayoutedParagraph should has only one owner to avoid concurrent usage.
+ *
+ * Tests:
+ *
+ * val text = (1..100000).joinToString(" ")
+ * reusedParagraph.layout(300f): 116.848500ms
+ * builder.build().layout(300f): 288.302300ms
+ *
+ * text = (1..10000).joinToString(" ")
+ * reusedParagraph.layout(300f): 10.004400ms
+ * builder.build().layout(300f): 23.421500ms
+ */
+class ParagraphLayouter(
+ val text: String,
+ textDirection: ResolvedTextDirection,
+ style: TextStyle,
+ spanStyles: List<AnnotatedString.Range<SpanStyle>>,
+ placeholders: List<AnnotatedString.Range<Placeholder>>,
+ density: Density,
+ resourceLoader: Font.ResourceLoader
+) {
+ private val fontLoader = resourceLoader as FontLoader
+
+ private val builder = ParagraphBuilder(
+ fontLoader = fontLoader,
+ text = text,
+ textStyle = style,
+ spanStyles = spanStyles,
+ placeholders = placeholders,
+ density = density,
+ textDirection = textDirection
+ )
+ private var para = builder.build()
+
+ private var width: Float = -1f
+
+ val defaultHeight get() = builder.defaultHeight
+
+ fun layoutParagraph(
+ width: Float = this.width,
+ maxLines: Int = builder.maxLines,
+ ellipsis: String = builder.ellipsis,
+ color: Color = builder.textStyle.color,
+ shadow: Shadow? = builder.textStyle.shadow,
+ textDecoration: TextDecoration? = builder.textStyle.textDecoration,
+ ): Paragraph {
+ val actualColor = color.takeOrElse { builder.textStyle.color }
+ if (
+ builder.maxLines != maxLines ||
+ builder.ellipsis != ellipsis ||
+ builder.textStyle.color != actualColor ||
+ builder.textStyle.shadow != shadow ||
+ builder.textStyle.textDecoration != textDecoration
+ ) {
+ this.width = width
+ builder.maxLines = maxLines
+ builder.ellipsis = ellipsis
+ builder.textStyle = builder.textStyle.copy(
+ color = actualColor,
+ shadow = shadow,
+ textDecoration = textDecoration
+ )
+ para = builder.build()
+ para.layout(width)
+ } else if (this.width != width) {
+ this.width = width
+ para.layout(width)
+ }
+ return para
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
index 10b9265..f0c9b2ba 100644
--- a/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
+++ b/compose/ui/ui-text/src/desktopTest/kotlin/androidx/compose/ui/text/DesktopParagraphTest.kt
@@ -16,7 +16,10 @@
package androidx.compose.ui.text
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.text.font.FontFamily
import androidx.compose.ui.text.font.FontStyle
@@ -218,6 +221,35 @@
Truth.assertThat(doubleSpaceResult.end).isEqualTo(text.indexOf('d') + 2)
}
+ @Test
+ fun two_paragraphs_use_common_intrinsics() {
+ fun Paragraph.testOffset() = getOffsetForPosition(Offset(0f, 100000f))
+ fun Paragraph.paint() = paint(Canvas(ImageBitmap(100, 100)))
+
+ val intrinsics = simpleIntrinsics((1..1000).joinToString(" "))
+
+ val paragraph1 = simpleParagraph(intrinsics, width = 100f)
+ val offset1 = paragraph1.testOffset()
+
+ val paragraph2 = simpleParagraph(intrinsics, width = 100000f)
+ val offset2 = paragraph2.testOffset()
+
+ Truth.assertThat(paragraph1.testOffset()).isEqualTo(offset1)
+ Truth.assertThat(paragraph2.testOffset()).isEqualTo(offset2)
+
+ paragraph2.paint()
+ Truth.assertThat(paragraph1.testOffset()).isEqualTo(offset1)
+ Truth.assertThat(paragraph2.testOffset()).isEqualTo(offset2)
+
+ paragraph1.paint()
+ Truth.assertThat(paragraph1.testOffset()).isEqualTo(offset1)
+ Truth.assertThat(paragraph2.testOffset()).isEqualTo(offset2)
+
+ paragraph2.paint()
+ Truth.assertThat(paragraph1.testOffset()).isEqualTo(offset1)
+ Truth.assertThat(paragraph2.testOffset()).isEqualTo(offset2)
+ }
+
private fun simpleParagraph(
text: String = "",
style: TextStyle? = null,
@@ -240,4 +272,35 @@
resourceLoader = fontLoader
)
}
+
+ private fun simpleIntrinsics(
+ text: String = "",
+ style: TextStyle? = null,
+ spanStyles: List<AnnotatedString.Range<SpanStyle>> = listOf(),
+ density: Density? = null
+ ): ParagraphIntrinsics {
+ return ParagraphIntrinsics(
+ text = text,
+ spanStyles = spanStyles,
+ style = TextStyle(
+ fontFamily = fontFamilyMeasureFont
+ ).merge(style),
+ density = density ?: defaultDensity,
+ resourceLoader = fontLoader
+ )
+ }
+
+ private fun simpleParagraph(
+ intrinsics: ParagraphIntrinsics,
+ maxLines: Int = Int.MAX_VALUE,
+ ellipsis: Boolean = false,
+ width: Float = 2000f
+ ): Paragraph {
+ return Paragraph(
+ paragraphIntrinsics = intrinsics,
+ maxLines = maxLines,
+ ellipsis = ellipsis,
+ width = width,
+ )
+ }
}
\ No newline at end of file
diff --git a/compose/ui/ui-unit/build.gradle b/compose/ui/ui-unit/build.gradle
index 8024090..41baa46 100644
--- a/compose/ui/ui-unit/build.gradle
+++ b/compose/ui/ui-unit/build.gradle
@@ -50,6 +50,8 @@
androidTestImplementation(libs.espressoCore)
androidTestImplementation(libs.truth)
androidTestImplementation(libs.kotlinTest)
+
+ samples(projectOrArtifact(":compose:ui:ui-unit:ui-unit-samples"))
}
}
diff --git a/compose/ui/ui-viewbinding/build.gradle b/compose/ui/ui-viewbinding/build.gradle
index ce847ed..4895329 100644
--- a/compose/ui/ui-viewbinding/build.gradle
+++ b/compose/ui/ui-viewbinding/build.gradle
@@ -40,6 +40,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(project(":compose:ui:ui-viewbinding:ui-viewbinding-samples"))
}
androidx {
diff --git a/compose/ui/ui/api/current.ignore b/compose/ui/ui/api/current.ignore
index 278f116..95aa6ca 100644
--- a/compose/ui/ui/api/current.ignore
+++ b/compose/ui/ui/api/current.ignore
@@ -3,6 +3,8 @@
Added method androidx.compose.ui.layout.LayoutInfo.getDensity()
AddedAbstractMethod: androidx.compose.ui.layout.LayoutInfo#getLayoutDirection():
Added method androidx.compose.ui.layout.LayoutInfo.getLayoutDirection()
+AddedAbstractMethod: androidx.compose.ui.layout.LayoutInfo#getViewConfiguration():
+ Added method androidx.compose.ui.layout.LayoutInfo.getViewConfiguration()
RemovedClass: androidx.compose.ui.graphics.vector.AnimatorKt:
diff --git a/compose/ui/ui/api/current.txt b/compose/ui/ui/api/current.txt
index 59ea034..71c7562 100644
--- a/compose/ui/ui/api/current.txt
+++ b/compose/ui/ui/api/current.txt
@@ -636,6 +636,26 @@
}
+package androidx.compose.ui.input {
+
+ public final inline class InputMode {
+ ctor public InputMode();
+ }
+
+ public static final class InputMode.Companion {
+ method public int getKeyboard();
+ method public int getTouch();
+ property public final int Keyboard;
+ property public final int Touch;
+ }
+
+ public interface InputModeManager {
+ method public int getInputMode();
+ property public abstract int inputMode;
+ }
+
+}
+
package androidx.compose.ui.input.key {
public final inline class Key {
@@ -1525,6 +1545,7 @@
}
public final class VelocityTrackerKt {
+ method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
}
}
@@ -1649,6 +1670,7 @@
method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+ method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
method public int getWidth();
method public boolean isAttached();
method public boolean isPlaced();
@@ -1659,6 +1681,7 @@
property public abstract boolean isPlaced;
property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+ property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
property public abstract int width;
}
@@ -1848,6 +1871,43 @@
}
+package androidx.compose.ui.modifier {
+
+ @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+ }
+
+ @androidx.compose.runtime.Stable public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+ method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+ }
+
+ public final class ModifierLocalConsumerKt {
+ }
+
+ public final class ModifierLocalKt {
+ method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+ }
+
+ @androidx.compose.runtime.Stable public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+ method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+ method public T! getValue();
+ property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+ property public abstract T! value;
+ }
+
+ public final class ModifierLocalProviderKt {
+ }
+
+ public interface ModifierLocalReadScope {
+ method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+ property public abstract T! current;
+ }
+
+ @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+ ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+ }
+
+}
+
package androidx.compose.ui.node {
public final class LayoutNodeKt {
@@ -1981,6 +2041,7 @@
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+ method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
@@ -2653,13 +2714,13 @@
ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
method public boolean getClippingEnabled();
method public boolean getDismissOnBackPress();
- method public boolean getDismissOnClickOutside();
+ method @Deprecated public boolean getDismissOnClickOutside();
method public boolean getExcludeFromSystemGesture();
method public boolean getFocusable();
method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
property public final boolean clippingEnabled;
property public final boolean dismissOnBackPress;
- property public final boolean dismissOnClickOutside;
+ property @Deprecated public final boolean dismissOnClickOutside;
property public final boolean excludeFromSystemGesture;
property public final boolean focusable;
property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
diff --git a/compose/ui/ui/api/public_plus_experimental_current.txt b/compose/ui/ui/api/public_plus_experimental_current.txt
index eaa7587..ec39c44 100644
--- a/compose/ui/ui/api/public_plus_experimental_current.txt
+++ b/compose/ui/ui/api/public_plus_experimental_current.txt
@@ -800,6 +800,27 @@
}
+package androidx.compose.ui.input {
+
+ public final inline class InputMode {
+ ctor public InputMode();
+ }
+
+ public static final class InputMode.Companion {
+ method public int getKeyboard();
+ method public int getTouch();
+ property public final int Keyboard;
+ property public final int Touch;
+ }
+
+ public interface InputModeManager {
+ method public int getInputMode();
+ method @androidx.compose.ui.ExperimentalComposeUiApi public boolean requestInputMode(int inputMode);
+ property public abstract int inputMode;
+ }
+
+}
+
package androidx.compose.ui.input.key {
public final inline class Key {
@@ -1493,6 +1514,14 @@
property public final boolean positionChange;
}
+ @androidx.compose.runtime.Immutable @androidx.compose.ui.ExperimentalComposeUiApi public final class HistoricalChange {
+ ctor public HistoricalChange(long uptimeMillis, long position);
+ method public long getPosition();
+ method public long getUptimeMillis();
+ property public final long position;
+ property public final long uptimeMillis;
+ }
+
public final inline class PointerButtons {
ctor public PointerButtons();
}
@@ -1588,8 +1617,11 @@
@androidx.compose.runtime.Immutable public final class PointerInputChange {
ctor public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+ ctor @androidx.compose.ui.ExperimentalComposeUiApi public PointerInputChange(long id, long uptimeMillis, long position, boolean pressed, long previousUptimeMillis, long previousPosition, boolean previousPressed, androidx.compose.ui.input.pointer.ConsumedData consumed, int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical);
method public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type);
+ method @androidx.compose.ui.ExperimentalComposeUiApi public androidx.compose.ui.input.pointer.PointerInputChange copy(optional long id, optional long currentTime, optional long currentPosition, optional boolean currentPressed, optional long previousTime, optional long previousPosition, optional boolean previousPressed, optional androidx.compose.ui.input.pointer.ConsumedData consumed, optional int type, java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical);
method public androidx.compose.ui.input.pointer.ConsumedData getConsumed();
+ method @androidx.compose.ui.ExperimentalComposeUiApi public java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> getHistorical();
method public long getId();
method public long getPosition();
method public boolean getPressed();
@@ -1599,6 +1631,7 @@
method public int getType();
method public long getUptimeMillis();
property public final androidx.compose.ui.input.pointer.ConsumedData consumed;
+ property @androidx.compose.ui.ExperimentalComposeUiApi public final java.util.List<androidx.compose.ui.input.pointer.HistoricalChange> historical;
property public final long id;
property public final long position;
property public final boolean pressed;
@@ -1695,6 +1728,7 @@
}
public final class VelocityTrackerKt {
+ method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
}
}
@@ -1821,6 +1855,7 @@
method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+ method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
method public int getWidth();
method public boolean isAttached();
method public boolean isPlaced();
@@ -1831,6 +1866,7 @@
property public abstract boolean isPlaced;
property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+ property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
property public abstract int width;
}
@@ -2032,6 +2068,45 @@
}
+package androidx.compose.ui.modifier {
+
+ @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+ }
+
+ @androidx.compose.runtime.Stable public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+ method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+ }
+
+ public final class ModifierLocalConsumerKt {
+ method @androidx.compose.runtime.Stable @androidx.compose.ui.ExperimentalComposeUiApi public static androidx.compose.ui.Modifier modifierLocalConsumer(androidx.compose.ui.Modifier, kotlin.jvm.functions.Function1<? super androidx.compose.ui.modifier.ModifierLocalReadScope,kotlin.Unit> consumer);
+ }
+
+ public final class ModifierLocalKt {
+ method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+ }
+
+ @androidx.compose.runtime.Stable public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+ method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+ method public T! getValue();
+ property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+ property public abstract T! value;
+ }
+
+ public final class ModifierLocalProviderKt {
+ method @androidx.compose.ui.ExperimentalComposeUiApi public static <T> androidx.compose.ui.Modifier modifierLocalProvider(androidx.compose.ui.Modifier, androidx.compose.ui.modifier.ProvidableModifierLocal<T> key, kotlin.jvm.functions.Function0<? extends T> value);
+ }
+
+ public interface ModifierLocalReadScope {
+ method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+ property public abstract T! current;
+ }
+
+ @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+ ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+ }
+
+}
+
package androidx.compose.ui.node {
@kotlin.RequiresOptIn(message="This API is internal to library.") @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface InternalCoreApi {
@@ -2170,6 +2245,7 @@
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+ method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
@@ -2880,21 +2956,25 @@
}
@androidx.compose.runtime.Immutable public final class PopupProperties {
- ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled, optional boolean usePlatformDefaultWidth);
+ ctor @androidx.compose.ui.ExperimentalComposeUiApi public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional kotlin.jvm.functions.Function2<? super androidx.compose.ui.geometry.Offset,? super androidx.compose.ui.unit.IntRect,java.lang.Boolean> dismissOnOutsideClick, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled, optional boolean usePlatformDefaultWidth, optional kotlin.jvm.functions.Function1<? super java.lang.Integer,java.lang.Integer> updateAndroidWindowManagerFlags);
ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
method public boolean getClippingEnabled();
method public boolean getDismissOnBackPress();
- method public boolean getDismissOnClickOutside();
+ method @Deprecated public boolean getDismissOnClickOutside();
+ method @androidx.compose.ui.ExperimentalComposeUiApi public kotlin.jvm.functions.Function2<androidx.compose.ui.geometry.Offset,androidx.compose.ui.unit.IntRect,java.lang.Boolean> getDismissOnOutsideClick();
method public boolean getExcludeFromSystemGesture();
method public boolean getFocusable();
method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
+ method @androidx.compose.ui.ExperimentalComposeUiApi public kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Integer> getUpdateAndroidWindowManagerFlags();
method @androidx.compose.ui.ExperimentalComposeUiApi public boolean getUsePlatformDefaultWidth();
property public final boolean clippingEnabled;
property public final boolean dismissOnBackPress;
- property public final boolean dismissOnClickOutside;
+ property @Deprecated public final boolean dismissOnClickOutside;
+ property @androidx.compose.ui.ExperimentalComposeUiApi public final kotlin.jvm.functions.Function2<androidx.compose.ui.geometry.Offset,androidx.compose.ui.unit.IntRect,java.lang.Boolean> dismissOnOutsideClick;
property public final boolean excludeFromSystemGesture;
property public final boolean focusable;
property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
+ property @androidx.compose.ui.ExperimentalComposeUiApi public final kotlin.jvm.functions.Function1<java.lang.Integer,java.lang.Integer> updateAndroidWindowManagerFlags;
property @androidx.compose.ui.ExperimentalComposeUiApi public final boolean usePlatformDefaultWidth;
}
diff --git a/compose/ui/ui/api/restricted_current.ignore b/compose/ui/ui/api/restricted_current.ignore
index 278f116..95aa6ca 100644
--- a/compose/ui/ui/api/restricted_current.ignore
+++ b/compose/ui/ui/api/restricted_current.ignore
@@ -3,6 +3,8 @@
Added method androidx.compose.ui.layout.LayoutInfo.getDensity()
AddedAbstractMethod: androidx.compose.ui.layout.LayoutInfo#getLayoutDirection():
Added method androidx.compose.ui.layout.LayoutInfo.getLayoutDirection()
+AddedAbstractMethod: androidx.compose.ui.layout.LayoutInfo#getViewConfiguration():
+ Added method androidx.compose.ui.layout.LayoutInfo.getViewConfiguration()
RemovedClass: androidx.compose.ui.graphics.vector.AnimatorKt:
diff --git a/compose/ui/ui/api/restricted_current.txt b/compose/ui/ui/api/restricted_current.txt
index f5e81a2..864540c 100644
--- a/compose/ui/ui/api/restricted_current.txt
+++ b/compose/ui/ui/api/restricted_current.txt
@@ -636,6 +636,26 @@
}
+package androidx.compose.ui.input {
+
+ public final inline class InputMode {
+ ctor public InputMode();
+ }
+
+ public static final class InputMode.Companion {
+ method public int getKeyboard();
+ method public int getTouch();
+ property public final int Keyboard;
+ property public final int Touch;
+ }
+
+ public interface InputModeManager {
+ method public int getInputMode();
+ property public abstract int inputMode;
+ }
+
+}
+
package androidx.compose.ui.input.key {
public final inline class Key {
@@ -1525,6 +1545,7 @@
}
public final class VelocityTrackerKt {
+ method public static void addPointerInputChange(androidx.compose.ui.input.pointer.util.VelocityTracker, androidx.compose.ui.input.pointer.PointerInputChange event);
}
}
@@ -1649,6 +1670,7 @@
method public androidx.compose.ui.unit.LayoutDirection getLayoutDirection();
method public java.util.List<androidx.compose.ui.layout.ModifierInfo> getModifierInfo();
method public androidx.compose.ui.layout.LayoutInfo? getParentInfo();
+ method public androidx.compose.ui.platform.ViewConfiguration getViewConfiguration();
method public int getWidth();
method public boolean isAttached();
method public boolean isPlaced();
@@ -1659,6 +1681,7 @@
property public abstract boolean isPlaced;
property public abstract androidx.compose.ui.unit.LayoutDirection layoutDirection;
property public abstract androidx.compose.ui.layout.LayoutInfo? parentInfo;
+ property public abstract androidx.compose.ui.platform.ViewConfiguration viewConfiguration;
property public abstract int width;
}
@@ -1849,6 +1872,43 @@
}
+package androidx.compose.ui.modifier {
+
+ @androidx.compose.runtime.Stable public abstract sealed class ModifierLocal<T> {
+ }
+
+ @androidx.compose.runtime.Stable public interface ModifierLocalConsumer extends androidx.compose.ui.Modifier.Element {
+ method public void onModifierLocalsUpdated(androidx.compose.ui.modifier.ModifierLocalReadScope scope);
+ }
+
+ public final class ModifierLocalConsumerKt {
+ }
+
+ public final class ModifierLocalKt {
+ method public static <T> androidx.compose.ui.modifier.ProvidableModifierLocal<T> modifierLocalOf(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+ }
+
+ @androidx.compose.runtime.Stable public interface ModifierLocalProvider<T> extends androidx.compose.ui.Modifier.Element {
+ method public androidx.compose.ui.modifier.ProvidableModifierLocal<T> getKey();
+ method public T! getValue();
+ property public abstract androidx.compose.ui.modifier.ProvidableModifierLocal<T> key;
+ property public abstract T! value;
+ }
+
+ public final class ModifierLocalProviderKt {
+ }
+
+ public interface ModifierLocalReadScope {
+ method public <T> T! getCurrent(androidx.compose.ui.modifier.ModifierLocal<T>);
+ property public abstract T! current;
+ }
+
+ @androidx.compose.runtime.Stable public final class ProvidableModifierLocal<T> extends androidx.compose.ui.modifier.ModifierLocal<T> {
+ ctor public ProvidableModifierLocal(kotlin.jvm.functions.Function0<? extends T> defaultFactory);
+ }
+
+}
+
package androidx.compose.ui.node {
@kotlin.PublishedApi internal interface ComposeUiNode {
@@ -2016,6 +2076,7 @@
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.Density> getLocalDensity();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.focus.FocusManager> getLocalFocusManager();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.hapticfeedback.HapticFeedback> getLocalHapticFeedback();
+ method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.input.InputModeManager> getLocalInputModeManager();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.unit.LayoutDirection> getLocalLayoutDirection();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.text.input.TextInputService> getLocalTextInputService();
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.compose.ui.platform.TextToolbar> getLocalTextToolbar();
@@ -2689,13 +2750,13 @@
ctor public PopupProperties(optional boolean focusable, optional boolean dismissOnBackPress, optional boolean dismissOnClickOutside, optional androidx.compose.ui.window.SecureFlagPolicy securePolicy, optional boolean excludeFromSystemGesture, optional boolean clippingEnabled);
method public boolean getClippingEnabled();
method public boolean getDismissOnBackPress();
- method public boolean getDismissOnClickOutside();
+ method @Deprecated public boolean getDismissOnClickOutside();
method public boolean getExcludeFromSystemGesture();
method public boolean getFocusable();
method public androidx.compose.ui.window.SecureFlagPolicy getSecurePolicy();
property public final boolean clippingEnabled;
property public final boolean dismissOnBackPress;
- property public final boolean dismissOnClickOutside;
+ property @Deprecated public final boolean dismissOnClickOutside;
property public final boolean excludeFromSystemGesture;
property public final boolean focusable;
property public final androidx.compose.ui.window.SecureFlagPolicy securePolicy;
diff --git a/compose/ui/ui/build.gradle b/compose/ui/ui/build.gradle
index 1b2e4ab..5956521 100644
--- a/compose/ui/ui/build.gradle
+++ b/compose/ui/ui/build.gradle
@@ -79,6 +79,7 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.testExtJunitKtx)
androidTestImplementation(libs.testUiautomator)
+ androidTestImplementation(libs.kotlinTest)
androidTestImplementation(libs.kotlinCoroutinesTest)
androidTestImplementation(libs.espressoCore)
androidTestImplementation(libs.junit)
@@ -101,6 +102,8 @@
lintChecks(project(":compose:ui:ui-lint"))
lintPublish(project(":compose:ui:ui-lint"))
+
+ samples(project(":compose:ui:ui:ui-samples"))
}
}
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
index 03529af..f76c743 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/UiDemos.kt
@@ -52,8 +52,10 @@
import androidx.compose.ui.demos.gestures.ScaleGestureFilterDemo
import androidx.compose.ui.demos.gestures.ScrollGestureFilterDemo
import androidx.compose.ui.demos.gestures.VerticalScrollerInDrawerDemo
+import androidx.compose.ui.demos.input.TouchModeDemo
import androidx.compose.ui.demos.scroll.BringIntoViewDemo
import androidx.compose.ui.demos.keyinput.KeyInputDemo
+import androidx.compose.ui.demos.modifier.CommunicatingModifierDemo
import androidx.compose.ui.demos.scroll.BringRectangleIntoViewDemo
import androidx.compose.ui.demos.scroll.RequestRectangleOnScreenDemo
import androidx.compose.ui.demos.viewinterop.AndroidInComposeDemos
@@ -162,12 +164,21 @@
)
)
+private val ModifierDemos = DemoCategory(
+ "Modifiers",
+ listOf(
+ ComposableDemo("Inter-Modifier Communication") { CommunicatingModifierDemo() }
+ )
+)
+
val CoreDemos = DemoCategory(
"Framework",
listOf(
+ ModifierDemos,
ComposableDemo("Explicit autofill types") { ExplicitAutofillTypesDemo() },
FocusDemos,
ComposableDemo("KeyInput") { KeyInputDemo() },
+ ComposableDemo("TouchMode") { TouchModeDemo() },
ComposableDemo("Multiple collects measure") { MultipleCollectTest() },
ComposableDemo("Dialog") { DialogDemo() },
ComposableDemo("Popup") { PopupDemo() },
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
index a184412..d0cf3d4 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/gestures/DoubleTapInTapDemo.kt
@@ -64,14 +64,12 @@
)
Box(
Modifier
-
.fillMaxSize()
.wrapContentSize(Alignment.Center)
.size(192.dp)
.pointerInput(Unit) { detectTapGestures(onTap = onTap) }
.border(2.dp, BorderColor)
.background(color = outerColor.value)
-
.fillMaxSize()
.wrapContentSize(Alignment.Center)
.size(96.dp)
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/input/TouchModeDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/input/TouchModeDemo.kt
new file mode 100644
index 0000000..962dd5e
--- /dev/null
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/input/TouchModeDemo.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.demos.input
+
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.material.Button
+import androidx.compose.material.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color.Companion.Blue
+import androidx.compose.ui.graphics.Color.Companion.Red
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputMode.Companion.Touch
+import androidx.compose.ui.platform.LocalInputModeManager
+import androidx.compose.ui.text.font.FontWeight
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Composable
+fun TouchModeDemo() {
+ val inputManager = LocalInputModeManager.current
+ Column(verticalArrangement = Arrangement.SpaceEvenly) {
+ Text(
+ "Touch anywhere on the screen to put the system in touch mode, and press a key on a " +
+ "hardware keyboard to put the system in key mode."
+ )
+ Text(
+ text = "Currently in ${inputManager.inputMode} mode.",
+ color = if (inputManager.inputMode == Touch) Blue else Red,
+ fontWeight = FontWeight.Bold,
+ modifier = Modifier.align(Alignment.CenterHorizontally)
+ )
+ Text(
+ "If you don't have a physical keyboard, you can click this button to exit" +
+ " touch mode programmatically."
+ )
+ Button(
+ onClick = { inputManager.requestInputMode(Keyboard) },
+ modifier = Modifier.align(Alignment.CenterHorizontally)
+ ) {
+ Text("Exit touch mode")
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt
new file mode 100644
index 0000000..8bc83e7f
--- /dev/null
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/modifier/CommunicatingModifierDemo.kt
@@ -0,0 +1,125 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.demos.modifier
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.size
+import androidx.compose.material.Scaffold
+import androidx.compose.material.Text
+import androidx.compose.material.rememberScaffoldState
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.graphics.Color.Companion.Blue
+import androidx.compose.ui.graphics.Color.Companion.Gray
+import androidx.compose.ui.graphics.Color.Companion.Red
+import androidx.compose.ui.modifier.modifierLocalConsumer
+import androidx.compose.ui.modifier.modifierLocalProvider
+import androidx.compose.ui.modifier.modifierLocalOf
+import androidx.compose.ui.unit.dp
+import kotlinx.coroutines.launch
+
+val ModifierLocalColor = modifierLocalOf { "Unspecified" }
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Composable
+fun CommunicatingModifierDemo() {
+ val scaffoldState = rememberScaffoldState()
+
+ fun Modifier.clickToRead() = composed {
+ var name by remember { mutableStateOf("Unknown") }
+ val coroutineScope = rememberCoroutineScope()
+ Modifier
+ .modifierLocalConsumer { name = ModifierLocalColor.current }
+ .clickable {
+ coroutineScope.launch {
+ scaffoldState.snackbarHostState.showSnackbar(
+ "Consumed value provided by $name Box."
+ )
+ }
+ }
+ }
+
+ Scaffold(scaffoldState = scaffoldState) {
+ Column(
+ Modifier
+ .background(Gray)
+ .modifierLocalProvider(ModifierLocalColor) { "Gray" }
+ ) {
+ Text("Click the red box to read the parent's ModifierLocalColor")
+ Box(
+ Modifier
+ .size(100.dp)
+ .padding(5.dp)
+ .background(Red)
+ .clickToRead()
+ )
+ Text("Click the blue box to read its ModifierLocalColor")
+ Box(
+ Modifier
+ .size(100.dp)
+ .padding(5.dp)
+ .modifierLocalProvider(ModifierLocalColor) { "Blue" }
+ .background(Blue)
+ .clickToRead()
+ )
+ Text("Click the blue box to read the red box's ModifierLocalColor")
+ Box(
+ Modifier
+ .size(100.dp)
+ .padding(5.dp)
+ .background(Red)
+ .modifierLocalProvider(ModifierLocalColor) { "Red" }
+ ) {
+ Box(
+ Modifier
+ .size(50.dp)
+ .padding(5.dp)
+ .background(Blue)
+ .clickToRead()
+ )
+ }
+ Text("Click the blue box to read its ModifierLocalColor")
+ Box(
+ Modifier
+ .size(100.dp)
+ .padding(5.dp)
+ .background(Red)
+ .modifierLocalProvider(ModifierLocalColor) { "Red" }
+ ) {
+ Box(
+ Modifier
+ .size(50.dp)
+ .padding(5.dp)
+ .background(Blue)
+ .modifierLocalProvider(ModifierLocalColor) { "Blue" }
+ .clickToRead()
+ )
+ }
+ }
+ }
+}
diff --git a/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt
new file mode 100644
index 0000000..0db443d
--- /dev/null
+++ b/compose/ui/ui/samples/src/main/java/androidx/compose/ui/samples/ModifierLocalSamples.kt
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.composed
+import androidx.compose.ui.modifier.modifierLocalConsumer
+import androidx.compose.ui.modifier.modifierLocalProvider
+import androidx.compose.ui.modifier.modifierLocalOf
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun ModifierLocalParentChildCommunicationWithinLayoutNodeSample() {
+
+ // Define the type of data.
+ val ModifierLocalMessage = modifierLocalOf { "Unknown" }
+
+ Box(
+ Modifier
+ // Provide an instance associated with the data type.
+ .modifierLocalProvider(ModifierLocalMessage) { "World" }
+ .composed {
+ var message by remember { mutableStateOf("") }
+ Modifier
+ // Use the data type to read the message.
+ .modifierLocalConsumer { message = ModifierLocalMessage.current }
+ .clickable { println("Hello $message") }
+ }
+
+ )
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun ModifierLocalChildParentCommunicationWithinLayoutNodeSample() {
+
+ class Sender(val onMessageReceived: (String) -> Unit) {
+ fun sendMessage(message: String) {
+ onMessageReceived(message)
+ }
+ }
+
+ // Define the type of data.
+ val ModifierLocalSender = modifierLocalOf<Sender> { error("No sender provided by parent.") }
+
+ Box(
+ Modifier
+ // Provide an instance associated with the sender type.
+ .modifierLocalProvider(ModifierLocalSender) {
+ Sender { println("Message Received: $it") }
+ }
+ .composed {
+ var sender by remember { mutableStateOf<Sender?>(null) }
+ Modifier
+ // Use the sender type to fetch an instance.
+ .modifierLocalConsumer { sender = ModifierLocalSender.current }
+ // Use this instance to send a message to the parent.
+ .clickable { sender?.sendMessage("Hello World") }
+ }
+ )
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun ModifierLocalParentChildCommunicationInterLayoutNodeSample() {
+
+ // Define the type of data.
+ val ModifierLocalMessage = modifierLocalOf { "Unknown" }
+
+ Box(
+ // Provide an instance associated with the data type.
+ Modifier.modifierLocalProvider(ModifierLocalMessage) { "World" }
+ ) {
+ var message by remember { mutableStateOf("") }
+ Box(
+ Modifier
+ // Use the data type to read the message.
+ .modifierLocalConsumer { message = ModifierLocalMessage.current }
+ .clickable { println("Hello $message") }
+ )
+ }
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+@Sampled
+@Composable
+fun ModifierLocalChildParentCommunicationInterLayoutNodeSample() {
+
+ class Sender(val onMessageReceived: (String) -> Unit) {
+ fun sendMessage(message: String) {
+ onMessageReceived(message)
+ }
+ }
+
+ // Define the type of data.
+ val ModifierLocalSender = modifierLocalOf<Sender> { error("No sender provided by parent.") }
+
+ Box(
+ Modifier
+ // Provide an instance associated with the sender type.
+ .modifierLocalProvider(ModifierLocalSender) {
+ Sender { println("Message Received: $it") }
+ }
+ ) {
+ var sender by remember { mutableStateOf<Sender?>(null) }
+ Box(
+ Modifier
+ // Use the sender type to fetch an instance.
+ .modifierLocalConsumer { sender = ModifierLocalSender.current }
+ // Use this instance to send a message to the parent.
+ .clickable { sender?.sendMessage("Hello World") }
+ )
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
index 6846fec..edcf54b 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/AndroidComposeViewAccessibilityDelegateCompatTest.kt
@@ -28,6 +28,7 @@
import androidx.compose.runtime.setValue
import androidx.compose.runtime.snapshots.Snapshot
import androidx.compose.runtime.structuralEqualityPolicy
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.toAndroidRect
import androidx.compose.ui.node.InnerPlaceable
@@ -54,13 +55,13 @@
import androidx.compose.ui.semantics.cutText
import androidx.compose.ui.semantics.disabled
import androidx.compose.ui.semantics.dismiss
+import androidx.compose.ui.semantics.error
import androidx.compose.ui.semantics.expand
import androidx.compose.ui.semantics.focused
import androidx.compose.ui.semantics.getTextLayoutResult
import androidx.compose.ui.semantics.heading
import androidx.compose.ui.semantics.horizontalScrollAxisRange
import androidx.compose.ui.semantics.liveRegion
-import androidx.compose.ui.semantics.error
import androidx.compose.ui.semantics.onClick
import androidx.compose.ui.semantics.onLongClick
import androidx.compose.ui.semantics.pasteText
@@ -922,6 +923,323 @@
accessibilityDelegate.sendSemanticsPropertyChangeEvents(newNodes)
}
+ @Test
+ fun canScroll_returnsFalse_whenPositionInvalid() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 0f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 1,
+ position = Offset.Unspecified
+ )
+ )
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = -1,
+ position = Offset.Unspecified
+ )
+ )
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 0,
+ position = Offset.Unspecified
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsTrue_whenHorizontalScrollableNotAtLimit() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 0.5f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ // Should be scrollable in both directions.
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 1,
+ position = Offset(50f, 50f)
+ )
+ )
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 0,
+ position = Offset(50f, 50f)
+ )
+ )
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = -1,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsTrue_whenVerticalScrollableNotAtLimit() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ verticalScrollAxisRange = ScrollAxisRange(
+ value = { 0.5f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ // Should be scrollable in both directions.
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = -1,
+ position = Offset(50f, 50f)
+ )
+ )
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = 0,
+ position = Offset(50f, 50f)
+ )
+ )
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = 1,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsFalse_whenHorizontalScrollable_whenScrolledRightAndAtLimit() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 1f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 1,
+ position = Offset(50f, 50f)
+ )
+ )
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 0,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsFalse_whenHorizontalScrollable_whenScrolledLeftAndAtLimit() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 0f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = -1,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsFalse_whenVerticalScrollable_whenScrolledDownAndAtLimit() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ verticalScrollAxisRange = ScrollAxisRange(
+ value = { 1f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = 1,
+ position = Offset(50f, 50f)
+ )
+ )
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = 0,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsFalse_whenVerticalScrollable_whenScrolledUpAndAtLimit() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ verticalScrollAxisRange = ScrollAxisRange(
+ value = { 0f },
+ maxValue = { 1f },
+ reverseScrolling = false
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = -1,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_respectsReverseDirection() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 0f },
+ maxValue = { 1f },
+ reverseScrolling = true
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertTrue(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ // Scroll left, even though value is 0.
+ direction = -1,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsFalse_forVertical_whenScrollableIsHorizontal() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 0.5f },
+ maxValue = { 1f },
+ reverseScrolling = true
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 100, 100)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = true,
+ direction = 1,
+ position = Offset(50f, 50f)
+ )
+ )
+ }
+
+ @Test
+ fun canScroll_returnsFalse_whenTouchIsOutsideBounds() {
+ val semanticsNode = createSemanticsNodeWithAdjustedBoundsWithProperties(
+ id = 1,
+ mergeDescendants = true
+ ) {
+ horizontalScrollAxisRange = ScrollAxisRange(
+ value = { 0.5f },
+ maxValue = { 1f },
+ reverseScrolling = true
+ )
+ }.apply {
+ adjustedBounds.set(0, 0, 50, 50)
+ }
+
+ assertFalse(
+ accessibilityDelegate.canScroll(
+ currentSemanticsNodes = listOf(semanticsNode),
+ vertical = false,
+ direction = 1,
+ position = Offset(100f, 100f)
+ )
+ )
+ }
+
private fun createSemanticsNodeWithProperties(
id: Int,
mergeDescendants: Boolean,
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
index a661597..f14a577 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/draw/ShadowTest.kt
@@ -22,6 +22,7 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.runtime.mutableStateOf
+import androidx.compose.testutils.first
import androidx.compose.ui.AtLeastSize
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Size
@@ -226,7 +227,7 @@
@Test
fun testInspectorValue() {
rule.runOnUiThreadIR {
- val modifier = Modifier.shadow(4.0.dp).toList().first() as InspectableValue
+ val modifier = Modifier.shadow(4.0.dp).first() as InspectableValue
assertThat(modifier.nameFallback).isEqualTo("shadow")
assertThat(modifier.valueOverride).isNull()
assertThat(modifier.inspectableElements.asIterable()).containsExactly(
@@ -344,7 +345,4 @@
assertEquals(height, bitmap.height)
return bitmap
}
-
- private fun Modifier.toList(): List<Modifier.Element> =
- foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
new file mode 100644
index 0000000..2c956f2
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/InputModeTest.kt
@@ -0,0 +1,133 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.input
+
+import android.view.View
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.focus.setFocusableContent
+import androidx.compose.ui.input.InputMode.Companion.Touch
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.platform.LocalInputModeManager
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+import kotlin.test.Test
+
+@SmallTest
+@RunWith(Parameterized::class)
+@OptIn(ExperimentalComposeUiApi::class)
+class InputModeTest(private val param: Param) {
+ @get:Rule
+ val rule = createComposeRule()
+
+ lateinit var inputModeManager: InputModeManager
+ lateinit var view: View
+
+ init {
+ InstrumentationRegistry.getInstrumentation().setInTouchMode(param.inputMode == Touch)
+ }
+
+ @Test
+ fun initialInputMode() {
+ // Arrange.
+ rule.setContentWithInputManager {
+ Box {}
+ }
+
+ // Assert
+ rule.runOnIdle { assertThat(inputModeManager.inputMode).isEqualTo(param.inputMode) }
+ }
+
+ @Test
+ fun switchToTouchModeProgrammatically() {
+ // Arrange.
+ rule.setContentWithInputManager {
+ Box {}
+ }
+
+ // Act.
+ val requestGranted = rule.runOnUiThread {
+ inputModeManager.requestInputMode(Touch)
+ }
+
+ // Assert
+ rule.runOnIdle {
+ when (param.inputMode) {
+ Touch -> {
+ assertThat(requestGranted).isTrue()
+ assertThat(inputModeManager.inputMode).isEqualTo(Touch)
+ }
+ Keyboard -> {
+ assertThat(requestGranted).isFalse()
+ assertThat(inputModeManager.inputMode).isEqualTo(Keyboard)
+ }
+ }
+ }
+ }
+
+ @Test
+ fun switchToKeyboardModeProgrammatically() {
+ // Arrange.
+ val testTag = "Box"
+ rule.setContentWithInputManager {
+ Box(Modifier.testTag(testTag))
+ }
+
+ // Act.
+ val requestGranted = rule.runOnUiThread {
+ inputModeManager.requestInputMode(Keyboard)
+ }
+
+ // Assert
+ rule.runOnIdle {
+ assertThat(requestGranted).isTrue()
+ assertThat(inputModeManager.inputMode).isEqualTo(Keyboard)
+ }
+ }
+
+ private fun ComposeContentTestRule.setContentWithInputManager(
+ composable: @Composable () -> Unit
+ ) {
+ this.setFocusableContent {
+ inputModeManager = LocalInputModeManager.current
+ view = LocalView.current
+ composable()
+ }
+ }
+
+ // We need to wrap the inline class parameter in another class because Java can't instantiate
+ // the inline class.
+ class Param(val inputMode: InputMode) {
+ override fun toString() = inputMode.toString()
+ }
+
+ companion object {
+ @JvmStatic
+ @Parameterized.Parameters(name = "initialInputMode = {0}")
+ fun initParameters() = listOf(Param(Touch), Param(Keyboard))
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
index aa9b3de..dc0d229 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/HitPathTrackerTest.kt
@@ -31,6 +31,7 @@
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.hapticfeedback.HapticFeedback
+import androidx.compose.ui.input.InputModeManager
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.layout.AlignmentLine
import androidx.compose.ui.layout.LayoutCoordinates
@@ -3593,6 +3594,8 @@
get() = TODO("Not yet implemented")
override val hapticFeedBack: HapticFeedback
get() = TODO("Not yet implemented")
+ override val inputModeManager: InputModeManager
+ get() = TODO("Not yet implemented")
override val clipboardManager: ClipboardManager
get() = TODO("Not yet implemented")
override val accessibilityManager: AccessibilityManager
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
index 7b9fc21..f919d4f 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessorTest.kt
@@ -28,6 +28,7 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.hapticfeedback.HapticFeedback
+import androidx.compose.ui.input.InputModeManager
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.layout.Measurable
import androidx.compose.ui.layout.MeasureResult
@@ -111,6 +112,7 @@
}
@Test
+ @OptIn(ExperimentalComposeUiApi::class)
fun pointerTypePassed() {
val pointerTypes = listOf(
PointerType.Unknown,
@@ -3197,6 +3199,8 @@
get() = TODO("Not yet implemented")
override val hapticFeedBack: HapticFeedback
get() = TODO("Not yet implemented")
+ override val inputModeManager: InputModeManager
+ get() = TODO("Not yet implemented")
override val clipboardManager: ClipboardManager
get() = TODO("Not yet implemented")
override val accessibilityManager: AccessibilityManager
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt
new file mode 100644
index 0000000..070ab8e
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalMultiLayoutNodeTest.kt
@@ -0,0 +1,414 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.modifier
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalComposeUiApi::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class ModifierLocalMultiLayoutNodeTest {
+ @get:Rule
+ val rule = createComposeRule()
+
+ private val defaultValue = "Default Value"
+
+ @Test
+ fun doesNotReadValuesProvidedByChildren() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Provided Value"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(Modifier.modifierLocalConsumer { readValue = localString.current }) {
+ Box(Modifier.modifierLocalProvider(localString) { providedValue })
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun readsValuesProvidedByParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Provided Value"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedValue }) {
+ Box(Modifier.modifierLocalConsumer { readValue = localString.current })
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue) }
+ }
+
+ @Test
+ fun readsValuesProvidedByGrandParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Provided Value"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedValue }) {
+ Box(Modifier.size(100.dp)) {
+ Box(Modifier.modifierLocalConsumer { readValue = localString.current })
+ }
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue) }
+ }
+
+ @Test
+ fun parentInSameLayoutNodeTakesPrecedenceOverParentLayoutNode() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue1 = "Provided Value 1"
+ val providedValue2 = "Provided Value 2"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedValue1 }) {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedValue2 }
+ .modifierLocalConsumer { readValue = localString.current }
+ )
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue2) }
+ }
+
+ @Test
+ fun readsValuesProvidedByNearestParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue1 = "Provided Value 1"
+ val providedValue2 = "Provided Value 2"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedValue1 }) {
+ Box(Modifier.modifierLocalProvider(localString) { providedValue2 }) {
+ Box(Modifier.modifierLocalConsumer { readValue = localString.current })
+ }
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue2) }
+ }
+
+ @Test
+ fun multipleModifierLocalsOfSameDataType() {
+ // Arrange.
+ val localString1 = modifierLocalOf { defaultValue }
+ val localString2 = modifierLocalOf { defaultValue }
+ val providedValue1 = "Provided Value 1"
+ val providedValue2 = "Provided Value 2"
+ lateinit var readValue1: String
+ lateinit var readValue2: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString1) { providedValue1 }) {
+ Box(Modifier.modifierLocalProvider(localString2) { providedValue2 }) {
+ Box(
+ Modifier.modifierLocalConsumer {
+ readValue1 = localString1.current
+ readValue2 = localString2.current
+ }
+ )
+ }
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle {
+ assertThat(readValue1).isEqualTo(providedValue1)
+ assertThat(readValue2).isEqualTo(providedValue2)
+ }
+ }
+
+ @Test
+ fun multipleModifierLocalsWithDifferentDataType() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val localInteger = modifierLocalOf { Int.MIN_VALUE }
+ val providedString = "Provided Value"
+ val providedInteger = 100
+ lateinit var readString: String
+ var readInteger = 0
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedString }) {
+ Box(Modifier.modifierLocalProvider(localInteger) { providedInteger }) {
+ Box(
+ Modifier.modifierLocalConsumer {
+ readString = localString.current
+ readInteger = localInteger.current
+ }
+ )
+ }
+ }
+ }
+
+ // Assert.
+ rule.runOnIdle {
+ assertThat(readString).isEqualTo(providedString)
+ assertThat(readInteger).isEqualTo(providedInteger)
+ }
+ }
+
+ @Test
+ fun modifierLocalProviderChanged() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val provider1value = "Provider1"
+ val provider2value = "Provider2"
+ var useFirstProvider by mutableStateOf(true)
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier.then(
+ if (useFirstProvider) {
+ Modifier.modifierLocalProvider(localString) { provider1value }
+ } else {
+ Modifier.modifierLocalProvider(localString) { provider2value }
+ }
+ )
+ ) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current })
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { useFirstProvider = false }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(provider2value) }
+ }
+
+ @Test
+ fun modifierLocalProviderValueChanged() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val value1 = "Value1"
+ val value2 = "Value2"
+ var useFirstValue by mutableStateOf(true)
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier.modifierLocalProvider(localString) {
+ if (useFirstValue) value1 else value2
+ }
+ ) {
+ Box(
+ Modifier.modifierLocalConsumer {
+ readString = localString.current
+ }
+ )
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { useFirstValue = false }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(value2) }
+ }
+
+ @Test
+ fun modifierLocalProviderAdded() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedByParent1 = "Parent1"
+ var secondParentAdded by mutableStateOf(false)
+ val providedByParent2 = "Parent2"
+ lateinit var readString: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedByParent1 }) {
+ Box(
+ Modifier.then(
+ if (secondParentAdded) {
+ Modifier.modifierLocalProvider(localString) { providedByParent2 }
+ } else {
+ Modifier
+ }
+ )
+ ) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current })
+ }
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { secondParentAdded = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedByParent2) }
+ }
+
+ @Test
+ fun modifierLocalProviderRemoved_readsDefaultValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Parent"
+ var providerRemoved by mutableStateOf(false)
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier.then(
+ if (providerRemoved) {
+ Modifier
+ } else {
+ Modifier.modifierLocalProvider(localString) { providedValue }
+ }
+ )
+
+ ) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current })
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { providerRemoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun modifierLocalProviderRemoved_readsPreviousParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedByParent1 = "Parent1"
+ var secondParentRemoved by mutableStateOf(false)
+ val providedByParent2 = "Parent2"
+ lateinit var readString: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedByParent1 }) {
+ Box(
+ Modifier.then(
+ if (secondParentRemoved) {
+ Modifier
+ } else {
+ Modifier.modifierLocalProvider(localString) { providedByParent2 }
+ }
+ )
+ ) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current })
+ }
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { secondParentRemoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedByParent1) }
+ }
+
+ @Test
+ fun modifierLocalProviderMoved_readsDefaultValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ var providerMoved by mutableStateOf(false)
+ val providedValue = "ProvidedValue"
+ val providerModifier = Modifier.modifierLocalProvider(localString) { providedValue }
+ lateinit var readString: String
+ rule.setContent {
+ Box(Modifier.then(if (providerMoved) Modifier else providerModifier)) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current }) {
+ Box(Modifier.then(if (providerMoved) providerModifier else Modifier))
+ }
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { providerMoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun modifierLocalProviderMoved_readsPreviousParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedByParent1 = "Parent1"
+ var secondParentMoved by mutableStateOf(false)
+ val providedByParent2 = "Parent2"
+ val parent2Modifier = Modifier.modifierLocalProvider(localString) { providedByParent2 }
+ lateinit var readString: String
+ rule.setContent {
+ Box(Modifier.modifierLocalProvider(localString) { providedByParent1 }) {
+ Box(Modifier.then(if (secondParentMoved) Modifier else parent2Modifier)) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current }) {
+ Box(Modifier.then(if (secondParentMoved) parent2Modifier else Modifier))
+ }
+ }
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { secondParentMoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedByParent1) }
+ }
+
+ @Test
+ fun modifierLocalProviderMoved_readsSameValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ var providerMoved by mutableStateOf(false)
+ val providedValue = "ProvidedValue"
+ val providerModifier = Modifier.modifierLocalProvider(localString) { providedValue }
+ lateinit var readString: String
+ rule.setContent {
+ Box(Modifier.then(if (providerMoved) Modifier else providerModifier)) {
+ Box(Modifier.size(100.dp)) {
+ Box(Modifier.then(if (providerMoved) providerModifier else Modifier)) {
+ Box(Modifier.modifierLocalConsumer { readString = localString.current })
+ }
+ }
+ }
+ }
+
+ // Act.
+ rule.runOnIdle { providerMoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedValue) }
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrder.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrder.kt
new file mode 100644
index 0000000..d3f5768
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalProviderConsumerOrder.kt
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.modifier
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class ModifierLocalProviderConsumerOrder {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ private val defaultValue = "Default Value"
+ private val key = modifierLocalOf { defaultValue }
+
+ @Test
+ fun modifierDoesNotConsumeTheValueItProduced() {
+ // Arrange.
+ val providedValue = "Provided Value"
+ lateinit var consumedValue: String
+ rule.setContent {
+ Box(
+ ProviderConsumerModifier(key, { providedValue }) {
+ consumedValue = key.current
+ }
+ )
+ }
+
+ // Assert.
+ assertThat(consumedValue).isEqualTo(defaultValue)
+ }
+
+ @Test
+ fun modifierConsumesTheValueProducedByParent() {
+ // Arrange.
+ val parentProvidedValue = "Parent Provided Value"
+ val providedValue = "Provided Value"
+ lateinit var consumedValue: String
+ rule.setContent {
+ Box(ProviderConsumerModifier(key, { parentProvidedValue }) {}) {
+ Box(
+ ProviderConsumerModifier(key, { providedValue }) {
+ consumedValue = key.current
+ }
+ )
+ }
+ }
+
+ // Assert.
+ assertThat(consumedValue).isEqualTo(parentProvidedValue)
+ }
+}
+
+class ProviderConsumerModifier<T>(
+ override val key: ProvidableModifierLocal<T>,
+ value: () -> T,
+ private val consumer: ModifierLocalReadScope.() -> Unit
+) : ModifierLocalConsumer, ModifierLocalProvider<T> {
+ override val value by derivedStateOf(value)
+ override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+ consumer(scope)
+ }
+}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt
new file mode 100644
index 0000000..b3c6c88
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/modifier/ModifierLocalSameLayoutNodeTest.kt
@@ -0,0 +1,423 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.modifier
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import kotlin.test.assertFailsWith
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@OptIn(ExperimentalComposeUiApi::class)
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class ModifierLocalSameLayoutNodeTest {
+
+ @get:Rule
+ val rule = createComposeRule()
+
+ private val defaultValue = "Default Value"
+
+ @Test
+ fun exceptionInsteadOfDefaultValue() {
+ // Arrange.
+ val localString = modifierLocalOf<String> { error("No default value") }
+ rule.setContent {
+ Box(
+ Modifier.modifierLocalConsumer {
+ assertFailsWith<IllegalStateException>("No default value") {
+ localString.current
+ }
+ }
+ )
+ }
+ }
+
+ @Test
+ fun defaultValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ lateinit var readValue: String
+ rule.setContent {
+ Box(
+ Modifier.modifierLocalConsumer {
+ readValue = localString.current
+ }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun doesNotReadValuesProvidedAfterThisModifier() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Provided Value"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalConsumer { readValue = localString.current }
+ .modifierLocalProvider(localString) { providedValue }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun readValueProvidedImmediatelyBeforeThisModifier() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Provided Value"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedValue }
+ .modifierLocalConsumer { readValue = localString.current }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue) }
+ }
+
+ @Test
+ fun readValueProvidedBeforeThisModifier() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Provided Value"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedValue }
+ .size(100.dp)
+ .modifierLocalConsumer { readValue = localString.current }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue) }
+ }
+
+ @Test
+ fun readsTheLastValueProvidedBeforeThisModifier() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue1 = "Provided Value 1"
+ val providedValue2 = "Provided Value 2"
+ lateinit var readValue: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedValue1 }
+ .modifierLocalProvider(localString) { providedValue2 }
+ .modifierLocalConsumer { readValue = localString.current }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readValue).isEqualTo(providedValue2) }
+ }
+
+ @Test
+ fun multipleModifierLocalsOfSameDataType() {
+ // Arrange.
+ val localString1 = modifierLocalOf { defaultValue }
+ val localString2 = modifierLocalOf { defaultValue }
+ val providedValue1 = "Provided Value 1"
+ val providedValue2 = "Provided Value 2"
+ lateinit var readValue1: String
+ lateinit var readValue2: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString1) { providedValue1 }
+ .modifierLocalProvider(localString2) { providedValue2 }
+ .modifierLocalConsumer {
+ readValue1 = localString1.current
+ readValue2 = localString2.current
+ }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle {
+ assertThat(readValue1).isEqualTo(providedValue1)
+ assertThat(readValue2).isEqualTo(providedValue2)
+ }
+ }
+
+ @Test
+ fun multipleModifierLocalsWithDifferentDataType() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val localInteger = modifierLocalOf { Int.MIN_VALUE }
+ val providedString = "Provided Value"
+ val providedInteger = 100
+ lateinit var readString: String
+ var readInteger = 0
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedString }
+ .modifierLocalProvider(localInteger) { providedInteger }
+ .modifierLocalConsumer {
+ readString = localString.current
+ readInteger = localInteger.current
+ }
+ )
+ }
+
+ // Assert.
+ rule.runOnIdle {
+ assertThat(readString).isEqualTo(providedString)
+ assertThat(readInteger).isEqualTo(providedInteger)
+ }
+ }
+
+ @Test
+ fun modifierLocalProviderChanged() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val provider1value = "Provider1"
+ val provider2value = "Provider2"
+ var useFirstProvider by mutableStateOf(true)
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .then(
+ if (useFirstProvider) {
+ Modifier.modifierLocalProvider(localString) { provider1value }
+ } else {
+ Modifier.modifierLocalProvider(localString) { provider2value }
+ }
+ )
+ .modifierLocalConsumer { readString = localString.current }
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { useFirstProvider = false }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(provider2value) }
+ }
+
+ @Test
+ fun modifierLocalProviderValueChanged() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val value1 = "Value1"
+ val value2 = "Value2"
+ var useFirstValue by mutableStateOf(true)
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { if (useFirstValue) value1 else value2 }
+ .modifierLocalConsumer { readString = localString.current }
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { useFirstValue = false }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(value2) }
+ }
+
+ @Test
+ fun modifierLocalProviderAdded() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedByParent1 = "Parent1"
+ var secondParentAdded by mutableStateOf(false)
+ val providedByParent2 = "Parent2"
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedByParent1 }
+ .then(
+ if (secondParentAdded) {
+ Modifier.modifierLocalProvider(localString) { providedByParent2 }
+ } else {
+ Modifier
+ }
+ )
+ .modifierLocalConsumer { readString = localString.current }
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { secondParentAdded = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedByParent2) }
+ }
+
+ @Test
+ fun modifierLocalProviderRemoved_readsDefaultValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedValue = "Parent"
+ var providerRemoved by mutableStateOf(false)
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .then(
+ if (providerRemoved) {
+ Modifier
+ } else {
+ Modifier.modifierLocalProvider(localString) { providedValue }
+ }
+ )
+ .modifierLocalConsumer { readString = localString.current }
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { providerRemoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun modifierLocalProviderRemoved_readsPreviousParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedByParent1 = "Parent1"
+ var secondParentRemoved by mutableStateOf(false)
+ val providedByParent2 = "Parent2"
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedByParent1 }
+ .then(
+ if (secondParentRemoved) {
+ Modifier
+ } else {
+ Modifier.modifierLocalProvider(localString) { providedByParent2 }
+ }
+ )
+ .modifierLocalConsumer { readString = localString.current }
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { secondParentRemoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedByParent1) }
+ }
+
+ @Test
+ fun modifierLocalProviderMoved_readsDefaultValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ var providerMoved by mutableStateOf(false)
+ val providedValue = "ProvidedValue"
+ val providerModifier = Modifier.modifierLocalProvider(localString) { providedValue }
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .then(if (providerMoved) Modifier else providerModifier)
+ .modifierLocalConsumer { readString = localString.current }
+ .then(if (providerMoved) providerModifier else Modifier)
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { providerMoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(defaultValue) }
+ }
+
+ @Test
+ fun modifierLocalProviderMoved_readsPreviousParent() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ val providedByParent1 = "Parent1"
+ var secondParentMoved by mutableStateOf(false)
+ val providedByParent2 = "Parent2"
+ val parent2Modifier = Modifier.modifierLocalProvider(localString) { providedByParent2 }
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .modifierLocalProvider(localString) { providedByParent1 }
+ .then(if (secondParentMoved) Modifier else parent2Modifier)
+ .modifierLocalConsumer { readString = localString.current }
+ .then(if (secondParentMoved) parent2Modifier else Modifier)
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { secondParentMoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedByParent1) }
+ }
+
+ @Test
+ fun modifierLocalProviderMoved_readsSameValue() {
+ // Arrange.
+ val localString = modifierLocalOf { defaultValue }
+ var providerMoved by mutableStateOf(false)
+ val providedValue = "ProvidedValue"
+ val providerModifier = Modifier.modifierLocalProvider(localString) { providedValue }
+ lateinit var readString: String
+ rule.setContent {
+ Box(
+ Modifier
+ .then(if (providerMoved) Modifier else providerModifier)
+ .size(100.dp)
+ .then(if (providerMoved) providerModifier else Modifier)
+ .modifierLocalConsumer { readString = localString.current }
+ )
+ }
+
+ // Act.
+ rule.runOnIdle { providerMoved = true }
+
+ // Assert.
+ rule.runOnIdle { assertThat(readString).isEqualTo(providedValue) }
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt
index 637f93f..c671c55 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/ComposeViewOverlayTest.kt
@@ -137,6 +137,6 @@
}
private fun Recomposer.waitForIdle() = runBlocking {
- state.filter { it == Recomposer.State.Idle }.first()
+ currentState.filter { it == Recomposer.State.Idle }.first()
}
}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt
index 4ef6ca8..802339d 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/InspectableValueTest.kt
@@ -17,6 +17,7 @@
package androidx.compose.ui.platform
import androidx.compose.foundation.border
+import androidx.compose.testutils.first
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.padding
@@ -56,14 +57,11 @@
@Test
fun simpleLayoutTest() {
- val modifier = Modifier.simple(10, 3.dp).toList().first() as InspectableValue
+ val modifier = Modifier.simple(10, 3.dp).first() as InspectableValue
assertThat(modifier.nameFallback).isEqualTo("simple")
assertThat(modifier.inspectableElements.asIterable()).containsExactly(
ValueElement("padding", 10),
ValueElement("border", 3.0.dp)
)
}
-
- private fun Modifier.toList(): List<Modifier.Element> =
- foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
}
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
index 395b7a0..c182662 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/platform/WindowRecomposerTest.kt
@@ -25,6 +25,11 @@
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.text.BasicText
import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.collectAsState
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.runtime.snapshotFlow
import androidx.compose.ui.InternalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.background
@@ -36,12 +41,17 @@
import androidx.test.filters.MediumTest
import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope
+import kotlinx.coroutines.delay
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.withTimeoutOrNull
import org.junit.Assert.assertEquals
import org.junit.Assert.assertNotNull
import org.junit.Assert.assertNotSame
import org.junit.Assert.assertNull
+import org.junit.Assert.fail
import org.junit.Test
import org.junit.runner.RunWith
import java.lang.ref.WeakReference
@@ -130,4 +140,46 @@
assertNotSame(firstRecomposer, secondRecomposer)
}
}
+
+ @Test
+ fun setContentViewCalledMultipleTimes(): Unit = runBlocking {
+ var output by mutableStateOf("initial")
+ val input = MutableStateFlow(0)
+ lateinit var view: View
+ ActivityScenario.launch(ComponentActivity::class.java).use { scenario ->
+ scenario.onActivity { activity ->
+ view = ComposeView(activity).apply {
+ setContent {
+ val value by input.collectAsState()
+ output = "one $value"
+ }
+ }
+ activity.setContentView(view)
+ }
+
+ delay(3_000)
+
+ suspend fun assertOutput(expected: String) {
+ withTimeoutOrNull(1_000) {
+ snapshotFlow { output }
+ .first { it == expected }
+ } ?: fail("unexpected output; $output expected $expected")
+ }
+
+ assertOutput("one 0")
+
+ input.value = 1
+
+ assertOutput("one 1")
+
+ scenario.onActivity { activity ->
+ activity.setContentView(view)
+ }
+
+ assertOutput("one 1")
+
+ input.value = 2
+ assertOutput("one 2")
+ }
+ }
}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt
index 27a978e..e797fca 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/viewinterop/ComposeViewTest.kt
@@ -22,10 +22,20 @@
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
+import android.widget.FrameLayout
import androidx.activity.ComponentActivity
+import androidx.compose.foundation.horizontalScroll
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.text.BasicText
+import androidx.compose.foundation.verticalScroll
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Rect
@@ -33,13 +43,20 @@
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.AbstractComposeView
import androidx.compose.ui.platform.ComposeView
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalView
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.platform.testTag
import androidx.compose.ui.test.R
import androidx.compose.ui.test.assertTextEquals
import androidx.compose.ui.test.junit4.createAndroidComposeRule
import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performScrollTo
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.dp
+import androidx.core.view.setPadding
import androidx.lifecycle.Lifecycle
import androidx.test.espresso.Espresso
import androidx.test.espresso.assertion.ViewAssertions.matches
@@ -335,6 +352,245 @@
}
assertNotNull("test did not run", result?.getOrThrow())
}
+
+ @Test
+ fun canScrollVerticallyDown_returnsTrue_onlyAfterDownEventInScrollable() {
+ lateinit var composeView: View
+ rule.setContent {
+ composeView = LocalView.current
+ ScrollableAndNonScrollable(vertical = true)
+ }
+
+ rule.onNodeWithTag(SCROLLABLE_FIRST_TAG)
+ .performScrollTo()
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ // Send a down event.
+ rule.onNodeWithTag(SCROLLABLE_TAG)
+ .performTouchInput { down(center) }
+
+ rule.runOnIdle {
+ composeView.assertCanScroll(down = true)
+ }
+ }
+
+ @Test
+ fun canScrollVerticallyUp_returnsTrue_onlyAfterDownEventInScrollable() {
+ lateinit var composeView: View
+ rule.setContent {
+ composeView = LocalView.current
+ ScrollableAndNonScrollable(vertical = true)
+ }
+
+ rule.onNodeWithTag(SCROLLABLE_LAST_TAG)
+ .performScrollTo()
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ // Send a down event.
+ rule.onNodeWithTag(SCROLLABLE_TAG)
+ .performTouchInput {
+ down(center)
+ }
+
+ rule.runOnIdle {
+ composeView.assertCanScroll(up = true)
+ }
+ }
+
+ @Test
+ fun canScrollVertically_returnsFalse_afterDownEventOutsideScrollable() {
+ lateinit var composeView: View
+ rule.setContent {
+ composeView = LocalView.current
+ ScrollableAndNonScrollable(vertical = true)
+ }
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ // Send a down event.
+ rule.onNodeWithTag(NON_SCROLLABLE_TAG)
+ .performTouchInput { down(center) }
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+ }
+
+ @Test
+ fun canScrollHorizontallyRight_returnsTrue_onlyAfterDownEventInScrollable() {
+ lateinit var composeView: View
+ rule.setContent {
+ composeView = LocalView.current
+ ScrollableAndNonScrollable(vertical = false)
+ }
+
+ rule.onNodeWithTag(SCROLLABLE_FIRST_TAG)
+ .performScrollTo()
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ // Send a down event.
+ rule.onNodeWithTag(SCROLLABLE_TAG)
+ .performTouchInput { down(center) }
+
+ rule.runOnIdle {
+ composeView.assertCanScroll(right = true)
+ }
+ }
+
+ @Test
+ fun canScrollHorizontallyLeft_returnsTrue_onlyAfterDownEventInScrollable() {
+ lateinit var composeView: View
+ rule.setContent {
+ composeView = LocalView.current
+ ScrollableAndNonScrollable(vertical = false)
+ }
+
+ rule.onNodeWithTag(SCROLLABLE_LAST_TAG)
+ .performScrollTo()
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ // Send a down event.
+ rule.onNodeWithTag(SCROLLABLE_TAG)
+ .performTouchInput { down(center) }
+
+ rule.runOnIdle {
+ composeView.assertCanScroll(left = true)
+ }
+ }
+
+ @Test
+ fun canScrollHorizontally_returnsFalse_afterDownEventOutsideScrollable() {
+ lateinit var composeView: View
+ rule.setContent {
+ composeView = LocalView.current
+ ScrollableAndNonScrollable(vertical = false)
+ }
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ // Send a down event.
+ rule.onNodeWithTag(NON_SCROLLABLE_TAG)
+ .performTouchInput { down(center) }
+
+ // No down event yet, should not be scrollable in any direction
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+ }
+
+ /**
+ * Puts a scrollable area of size 1 px square inside a series of nested paddings, both compose-
+ * and view-based, to ensure that the pointer calculations account for all the offsets those
+ * paddings introduce.
+ *
+ * ```
+ * ┌───────────────61────────────────┐
+ * │AndroidComposeView (root) │
+ * │ │
+ * │ ┌─────────────41─────────────┐ │
+ * │ │AndroidView/FrameLayout │ │
+ * │ │ │ │
+ * │ │ ┌──────────21───────────┐ │ │
+ * 6 │ │ComposeView │ │ │
+ * 1 4 │ │ │ │
+ * │ 1 2 ┌─────────1────────┐ │ │ │
+ * │ │ 1 │Box (scrollable) │ │ │ │
+ * │ │ │ 1 │ │ │ │
+ * │ │ │ └──────────────────┘ │ │ │
+ * │ │ └───────────────────────┘ │ │
+ * │ └────────────────────────────┘ │
+ * └─────────────────────────────────┘
+ * ```
+ */
+ @Test
+ fun canScroll_accountsForViewAndNodeOffsets() {
+ lateinit var composeView: View
+ rule.setContent {
+ with(LocalDensity.current) {
+ AndroidView(
+ modifier = Modifier
+ .requiredSize(61.toDp())
+ .padding(10.toDp()),
+ factory = { context ->
+ FrameLayout(context).apply {
+ setPadding(10)
+ addView(ComposeView(context).apply {
+ setContent {
+ // Query the inner android view, not the outer one.
+ composeView = LocalView.current
+ Box(
+ Modifier
+ .padding(10.toDp())
+ .testTag(SCROLLABLE_TAG)
+ .horizontalScroll(rememberScrollState())
+ // Give it something to scroll.
+ .requiredSize(100.dp)
+ )
+ }
+ })
+ }
+ }
+ )
+ }
+ }
+
+ val scrollable = rule.onNodeWithTag(SCROLLABLE_TAG)
+ .fetchSemanticsNode()
+ assertEquals(IntSize(1, 1), scrollable.size)
+
+ rule.runOnIdle {
+ composeView.assertCanScroll()
+ }
+
+ rule.onNodeWithTag(SCROLLABLE_TAG)
+ .performTouchInput {
+ down(center)
+ }
+
+ rule.runOnIdle {
+ composeView.assertCanScroll(right = true)
+ }
+ }
+}
+
+private const val SCROLLABLE_TAG = "scrollable"
+private const val NON_SCROLLABLE_TAG = "non-scrollable"
+private const val SCROLLABLE_FIRST_TAG = "first-scrollable-child"
+private const val SCROLLABLE_LAST_TAG = "last-scrollable-child"
+
+private fun View.assertCanScroll(
+ left: Boolean = false,
+ up: Boolean = false,
+ right: Boolean = false,
+ down: Boolean = false
+) {
+ assertEquals(left, canScrollHorizontally(-1))
+ assertEquals(right, canScrollHorizontally(1))
+ assertEquals(up, canScrollVertically(-1))
+ assertEquals(down, canScrollVertically(1))
}
private inline fun ViewGroup.assertUnsupported(
@@ -353,6 +609,45 @@
)
}
+@Composable
+private fun ScrollableAndNonScrollable(vertical: Boolean) {
+ @Composable
+ fun layout(size: Dp, content: @Composable (Modifier) -> Unit) {
+ if (vertical) {
+ Column(Modifier.requiredSize(size)) {
+ content(Modifier.weight(1f).fillMaxWidth())
+ }
+ } else {
+ Row(Modifier.requiredSize(100.dp)) {
+ content(Modifier.weight(1f).fillMaxHeight())
+ }
+ }
+ }
+
+ val scrollState = rememberScrollState(0)
+ val scrollModifier = if (vertical) {
+ Modifier.verticalScroll(scrollState)
+ } else {
+ Modifier.horizontalScroll(scrollState)
+ }
+
+ layout(100.dp) { modifier ->
+ Box(
+ modifier
+ .testTag(SCROLLABLE_TAG)
+ .then(scrollModifier)
+ ) {
+ layout(10000.dp) {
+ Box(Modifier.testTag(SCROLLABLE_FIRST_TAG))
+ // Give the scrollable some content that actually requires scrolling.
+ Box(it)
+ Box(Modifier.testTag(SCROLLABLE_LAST_TAG))
+ }
+ }
+ Box(modifier.testTag(NON_SCROLLABLE_TAG))
+ }
+}
+
private class TestComposeView(
context: Context
) : AbstractComposeView(context) {
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupKeyboardTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupKeyboardTest.kt
new file mode 100644
index 0000000..c27d118
--- /dev/null
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupKeyboardTest.kt
@@ -0,0 +1,215 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.window
+
+import android.os.Build
+import android.view.View
+import android.view.WindowInsets
+import android.view.WindowInsetsAnimation
+import android.view.WindowManager
+import androidx.annotation.RequiresApi
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.foundation.interaction.collectIsFocusedAsState
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.text.BasicTextField
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.background
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalView
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.test.TestActivity
+import androidx.compose.ui.test.assertIsDisplayed
+import androidx.compose.ui.test.junit4.ComposeContentTestRule
+import androidx.compose.ui.test.junit4.createAndroidComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performClick
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class PopupKeyboardTest {
+ @get:Rule
+ val rule = createAndroidComposeRule<TestActivity>()
+
+ private lateinit var view: View
+ private val timeout = 10_000L
+
+ private val testTag = "testedPopup"
+ private val TFTag = "TextField"
+
+ @OptIn(ExperimentalComposeUiApi::class)
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
+ @Test
+ fun flagAltFocusableIMForNotFocusableDoesNotCloseKeyboardTest() {
+ rule.setContentForTest {
+ BoxWithAnchorAndPopupForTest(
+ testTag,
+ TFTag,
+ PopupProperties(
+ focusable = false,
+ updateAndroidWindowManagerFlags = { flags ->
+ flags or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ }
+ )
+ )
+ }
+
+ // Popup should not exist
+ rule.onNodeWithTag(testTag).assertDoesNotExist()
+
+ // Click on the TextField
+ rule.onNodeWithTag(TFTag).performClick()
+
+ // Popup should be visible
+ rule.onNodeWithTag(testTag).assertIsDisplayed()
+ view.waitUntil(timeout) { view.isSoftwareKeyboardShown() }
+
+ rule.runOnIdle { Truth.assertThat(view.isSoftwareKeyboardShown()).isTrue() }
+ }
+
+ @OptIn(ExperimentalComposeUiApi::class)
+ @SdkSuppress(minSdkVersion = Build.VERSION_CODES.R)
+ @Test
+ fun flagAltFocusableIMForFocusableDoesNotCloseKeyboardTest() {
+ rule.setContentForTest {
+ BoxWithAnchorAndPopupForTest(
+ testTag,
+ TFTag,
+ PopupProperties(
+ focusable = true,
+ updateAndroidWindowManagerFlags = { flags ->
+ flags or WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM
+ }
+ )
+ )
+ }
+
+ // Popup should not be visible
+ rule.onNodeWithTag(testTag).assertDoesNotExist()
+
+ // Click on the TextField
+ rule.onNodeWithTag(TFTag).performClick()
+
+ // Popup should be visible
+ rule.onNodeWithTag(testTag).assertIsDisplayed()
+ view.waitUntil(timeout) { view.isSoftwareKeyboardShown() }
+
+ rule.runOnIdle {
+ Truth.assertThat(view.isSoftwareKeyboardShown()).isTrue()
+ }
+ }
+
+ @RequiresApi(Build.VERSION_CODES.R)
+ private fun ComposeContentTestRule.setContentForTest(composable: @Composable () -> Unit) {
+ setContent {
+ view = LocalView.current
+ composable()
+ }
+ // We experienced some flakiness in tests if the keyboard was visible at the start of the
+ // test. So we make sure that the keyboard is hidden at the start of every test.
+ runOnIdle {
+ if (view.isSoftwareKeyboardShown()) {
+ view.hideKeyboard()
+ view.waitUntil(timeout) { !view.isSoftwareKeyboardShown() }
+ }
+ }
+ }
+}
+
+@RequiresApi(Build.VERSION_CODES.R)
+private fun View.waitUntil(timeoutMillis: Long, condition: () -> Boolean) {
+ val latch = CountDownLatch(1)
+ rootView.setWindowInsetsAnimationCallback(
+ InsetAnimationCallback {
+ if (condition()) {
+ latch.countDown()
+ }
+ }
+ )
+ latch.await(timeoutMillis, TimeUnit.MILLISECONDS)
+}
+
+@RequiresApi(Build.VERSION_CODES.R)
+private class InsetAnimationCallback(val block: () -> Unit) :
+ WindowInsetsAnimation.Callback(DISPATCH_MODE_CONTINUE_ON_SUBTREE) {
+
+ override fun onProgress(
+ insets: WindowInsets,
+ runningAnimations: MutableList<WindowInsetsAnimation>
+ ) = insets
+
+ override fun onEnd(animation: WindowInsetsAnimation) {
+ block()
+ super.onEnd(animation)
+ }
+}
+
+@RequiresApi(Build.VERSION_CODES.R)
+private fun View.isSoftwareKeyboardShown(): Boolean {
+ return rootWindowInsets != null && rootWindowInsets.isVisible(WindowInsets.Type.ime())
+}
+
+@RequiresApi(Build.VERSION_CODES.R)
+private fun View.hideKeyboard() {
+ windowInsetsController?.hide(WindowInsets.Type.ime())
+}
+
+@Composable
+fun BoxWithAnchorAndPopupForTest(
+ popupTag: String,
+ textFieldTag: String,
+ popupProperties: PopupProperties,
+) {
+ val focusRequester = remember { FocusRequester() }
+ val interactionSource = remember { MutableInteractionSource() }
+ val isTextFieldFocused by interactionSource.collectIsFocusedAsState()
+
+ Box {
+ BasicTextField(
+ "test",
+ {},
+ modifier = Modifier.focusRequester(focusRequester).testTag(textFieldTag),
+ interactionSource = interactionSource
+ )
+ if (isTextFieldFocused) {
+ Popup(
+ alignment = Alignment.Center,
+ onDismissRequest = { },
+ properties = popupProperties
+ ) {
+ Box(Modifier.background(Color.Red).size(50.dp).testTag(popupTag))
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt
index 4033f12..b222c57 100644
--- a/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt
+++ b/compose/ui/ui/src/androidAndroidTest/kotlin/androidx/compose/ui/window/PopupTest.kt
@@ -18,21 +18,27 @@
import android.view.View
import android.view.View.MEASURED_STATE_TOO_SMALL
import android.view.ViewGroup
+import android.view.WindowManager
+import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.requiredHeight
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.requiredWidth
+import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.layout.boundsInRoot
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.onSizeChanged
import androidx.compose.ui.node.Owner
@@ -362,6 +368,63 @@
@OptIn(ExperimentalComposeUiApi::class)
@Test
+ fun isNotDismissedOnAnchorClick_withCustomDismissOnOutsideClick() {
+ var anchorPosition = Rect.Zero
+ rule.setContent {
+ var showPopup by remember { mutableStateOf(true) }
+ Box(Modifier.wrapContentSize()) {
+ if (showPopup) {
+ Box(
+ modifier = Modifier.size(100.dp).onGloballyPositioned { layoutCoordinates ->
+ anchorPosition = layoutCoordinates.boundsInRoot()
+ }
+ )
+ Popup(
+ properties = PopupProperties(
+ focusable = true,
+ dismissOnOutsideClick = { offset, anchorBounds ->
+ if (offset == null) false
+ else {
+ offset.x < anchorBounds.left ||
+ offset.x > anchorBounds.right ||
+ offset.y < anchorBounds.top ||
+ offset.y > anchorBounds.bottom
+ }
+ }
+ ),
+ alignment = Alignment.Center,
+ onDismissRequest = { showPopup = false }
+ ) {
+ Box(Modifier.size(50.dp).testTag(testTag))
+ }
+ }
+ }
+ }
+
+ // Popup should be visible
+ rule.onNodeWithTag(testTag).assertIsDisplayed()
+
+ // Click on the anchor
+ UiDevice.getInstance(getInstrumentation()).click(
+ anchorPosition.center.x.toInt(),
+ anchorPosition.center.y.toInt()
+ )
+
+ // Popup should still be visible
+ rule.onNodeWithTag(testTag).assertIsDisplayed()
+
+ // Click outside the anchor
+ UiDevice.getInstance(getInstrumentation()).click(
+ anchorPosition.right.toInt() + 1,
+ anchorPosition.bottom.toInt() + 1
+ )
+
+ // Popup should not exist
+ rule.onNodeWithTag(testTag).assertDoesNotExist()
+ }
+
+ @OptIn(ExperimentalComposeUiApi::class)
+ @Test
fun canFillScreenWidth_dependingOnProperty() {
var box1Width = 0
var box2Width = 0
@@ -443,6 +506,55 @@
rule.popupMatches(testTag, matchesSize(30, 30))
}
+ @OptIn(ExperimentalComposeUiApi::class)
+ @Test
+ fun propagatesClicksIfNonTouchModalIsSet() {
+ var wasBoxClicked = false
+ rule.setContent {
+ Box(
+ Modifier.fillMaxSize().clickable {
+ wasBoxClicked = true
+ }
+ ) {
+ Popup(
+ alignment = Alignment.TopStart,
+ onDismissRequest = { },
+ properties = PopupProperties(
+ focusable = true,
+ updateAndroidWindowManagerFlags = { flags ->
+ flags or WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
+ }
+ )
+ ) {
+ Box(Modifier.size(10.dp).testTag(testTag))
+ }
+ }
+ }
+
+ // Popup should be visible
+ rule.onNodeWithTag(testTag).assertIsDisplayed()
+
+ // Click inside the popup
+ val insideX = with(rule.density) { 5.dp.toPx() }
+ val insideY = with(rule.density) { 5.dp.toPx() }
+ UiDevice.getInstance(getInstrumentation()).click(insideX.toInt(), insideY.toInt())
+
+ // Box should not have been clicked
+ rule.runOnIdle {
+ assertThat(wasBoxClicked).isFalse()
+ }
+
+ // Click outside the popup
+ val outsideX = with(rule.density) { 100.dp.toPx() }
+ val outsideY = with(rule.density) { 100.dp.toPx() }
+ UiDevice.getInstance(getInstrumentation()).click(outsideX.toInt(), outsideY.toInt())
+
+ // Box should've been clicked
+ rule.runOnIdle {
+ assertThat(wasBoxClicked).isTrue()
+ }
+ }
+
private fun matchesSize(width: Int, height: Int): BoundedMatcher<View, View> {
return object : BoundedMatcher<View, View>(View::class.java) {
override fun matchesSafely(item: View?): Boolean {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
index ace0b6f..caa7312 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/input/pointer/MotionEventAdapter.android.kt
@@ -30,6 +30,7 @@
import androidx.annotation.DoNotInline
import androidx.annotation.RequiresApi
import androidx.annotation.VisibleForTesting
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.geometry.Offset
/**
@@ -194,6 +195,7 @@
/**
* Creates a new PointerInputEventData.
*/
+ @OptIn(ExperimentalComposeUiApi::class)
private fun createPointerInputEventData(
positionCalculator: PositionCalculator,
motionEvent: MotionEvent,
@@ -232,13 +234,25 @@
else -> PointerType.Unknown
}
+ val historical = mutableListOf<HistoricalChange>()
+ with(motionEvent) {
+ repeat(getHistorySize()) { pos ->
+ val historicalChange = HistoricalChange(
+ getHistoricalEventTime(pos),
+ Offset(getHistoricalX(index, pos), getHistoricalY(index, pos))
+ )
+ historical.add(historicalChange)
+ }
+ }
+
return PointerInputEventData(
pointerId,
motionEvent.eventTime,
rawPosition,
position,
pressed,
- toolType
+ toolType,
+ historical
)
}
}
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
index 0eb9c49..5fce5d4 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeView.android.kt
@@ -52,7 +52,6 @@
import androidx.compose.ui.autofill.AutofillTree
import androidx.compose.ui.autofill.performAutofill
import androidx.compose.ui.autofill.populateViewStructure
-import androidx.compose.ui.focus.FocusTag
import androidx.compose.ui.focus.FocusDirection
import androidx.compose.ui.focus.FocusDirection.Companion.Down
import androidx.compose.ui.focus.FocusDirection.Companion.In
@@ -64,6 +63,7 @@
import androidx.compose.ui.focus.FocusDirection.Companion.Up
import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.focus.FocusManagerImpl
+import androidx.compose.ui.focus.FocusTag
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.graphics.CanvasHolder
@@ -71,6 +71,10 @@
import androidx.compose.ui.graphics.setFrom
import androidx.compose.ui.hapticfeedback.HapticFeedback
import androidx.compose.ui.hapticfeedback.PlatformHapticFeedback
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.input.InputModeManagerImpl
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
+import androidx.compose.ui.input.InputMode.Companion.Touch
import androidx.compose.ui.input.key.Key.Companion.Back
import androidx.compose.ui.input.key.Key.Companion.DirectionCenter
import androidx.compose.ui.input.key.Key.Companion.DirectionDown
@@ -134,6 +138,13 @@
ViewGroup(context), Owner, ViewRootForTest, PositionCalculator, DefaultLifecycleObserver {
/**
+ * Remembers the position of the last pointer input event that was down. This position will be
+ * used to calculate whether this view is considered scrollable via [canScrollHorizontally]/
+ * [canScrollVertically].
+ */
+ private var lastDownPointerPosition: Offset = Offset.Unspecified
+
+ /**
* Signal that AndroidComposeView's superclass constructors have finished running.
* If this is false, it's because the runtime's default uninitialized value is currently
* visible and AndroidComposeView's constructor hasn't started running yet. In this state
@@ -328,6 +339,11 @@
updatePositionCacheAndDispatch()
}
+ // executed whenever the touch mode changes.
+ private val touchModeChangeListener = ViewTreeObserver.OnTouchModeChangeListener { touchMode ->
+ _inputModeManager.inputMode = if (touchMode) Touch else Keyboard
+ }
+
private val textInputServiceAndroid = TextInputServiceAndroid(this)
@OptIn(InternalComposeUiApi::class)
@@ -348,6 +364,27 @@
PlatformHapticFeedback(this)
/**
+ * Provide an instance of [InputModeManager] which is available as a CompositionLocal.
+ */
+ private val _inputModeManager = InputModeManagerImpl(
+ initialInputMode = if (isInTouchMode) Touch else Keyboard,
+ onRequestInputModeChange = {
+ when (it) {
+ // Android doesn't support programmatically switching to touch mode, so we
+ // don't do anything, but just return true if we are already in touch mode.
+ Touch -> isInTouchMode
+
+ // If we are already in keyboard mode, we return true, otherwise, we call
+ // requestFocusFromTouch, which puts the system in non-touch mode.
+ Keyboard -> if (isInTouchMode) requestFocusFromTouch() else true
+
+ else -> false
+ }
+ }
+ )
+ override val inputModeManager: InputModeManager get() = _inputModeManager
+
+ /**
* Provide textToolbar to the user, for text-related operation. Use the Android version of
* floating toolbar(post-M) and primary toolbar(pre-M).
*/
@@ -836,6 +873,7 @@
viewTreeOwners!!.lifecycleOwner.lifecycle.addObserver(this)
viewTreeObserver.addOnGlobalLayoutListener(globalLayoutListener)
viewTreeObserver.addOnScrollChangedListener(scrollChangedListener)
+ viewTreeObserver.addOnTouchModeChangeListener(touchModeChangeListener)
}
override fun onDetachedFromWindow() {
@@ -849,6 +887,7 @@
}
viewTreeObserver.removeOnGlobalLayoutListener(globalLayoutListener)
viewTreeObserver.removeOnScrollChangedListener(scrollChangedListener)
+ viewTreeObserver.removeOnTouchModeChangeListener(touchModeChangeListener)
}
override fun onProvideAutofillVirtualStructure(structure: ViewStructure?, flags: Int) {
@@ -883,6 +922,15 @@
val pointerInputEvent =
motionEventAdapter.convertToPointerInputEvent(motionEvent, this)
if (pointerInputEvent != null) {
+ // Cache the last position of the last pointer to go down so we can check if
+ // it's in a scrollable region in canScroll{Vertically|Horizontally}. Those
+ // methods use semantics data, and because semantics coordinates are local to
+ // this view, the pointer _position_, not _positionOnScreen_, is the offset that
+ // needs to be cached.
+ pointerInputEvent.pointers.lastOrNull { it.down }?.position?.let {
+ lastDownPointerPosition = it
+ }
+
pointerInputEventProcessor.process(
pointerInputEvent,
this,
@@ -903,6 +951,22 @@
}
}
+ /**
+ * This method is required to correctly support swipe-to-dismiss layouts on WearOS, which search
+ * their children for scrollable views to determine whether or not to intercept touch events –
+ * a sort of simplified nested scrolling mechanism.
+ *
+ * Because a composition may contain many scrollable and non-scrollable areas, and this method
+ * doesn't know which part of the view the caller cares about, it uses the
+ * [lastDownPointerPosition] as the location to check.
+ */
+ override fun canScrollHorizontally(direction: Int): Boolean =
+ accessibilityDelegate.canScroll(vertical = false, direction, lastDownPointerPosition)
+
+ /** See [canScrollHorizontally]. */
+ override fun canScrollVertically(direction: Int): Boolean =
+ accessibilityDelegate.canScroll(vertical = true, direction, lastDownPointerPosition)
+
private fun isInBounds(motionEvent: MotionEvent): Boolean {
val x = motionEvent.x
val y = motionEvent.y
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
index 19d1ef7..5c06c55 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/AndroidComposeViewAccessibilityDelegateCompat.android.kt
@@ -38,16 +38,29 @@
import androidx.annotation.IntRange
import androidx.annotation.RequiresApi
import androidx.annotation.VisibleForTesting
+import androidx.annotation.VisibleForTesting.PRIVATE
import androidx.collection.ArraySet
import androidx.collection.SparseArrayCompat
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.R
+import androidx.compose.ui.fastJoinToString
+import androidx.compose.ui.focus.requestFocus
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
import androidx.compose.ui.graphics.toAndroidRect
+import androidx.compose.ui.graphics.toComposeRect
import androidx.compose.ui.layout.boundsInParent
+import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.node.HitTestResult
import androidx.compose.ui.node.LayoutNode
import androidx.compose.ui.node.OwnerScope
-import androidx.compose.ui.semantics.outerSemantics
+import androidx.compose.ui.platform.accessibility.hasCollectionInfo
+import androidx.compose.ui.platform.accessibility.setCollectionInfo
+import androidx.compose.ui.platform.accessibility.setCollectionItemInfo
+import androidx.compose.ui.semantics.AccessibilityAction
import androidx.compose.ui.semantics.CustomAccessibilityAction
+import androidx.compose.ui.semantics.LiveRegionMode
+import androidx.compose.ui.semantics.ProgressBarRangeInfo
import androidx.compose.ui.semantics.Role
import androidx.compose.ui.semantics.ScrollAxisRange
import androidx.compose.ui.semantics.SemanticsActions
@@ -57,23 +70,15 @@
import androidx.compose.ui.semantics.SemanticsProperties
import androidx.compose.ui.semantics.SemanticsWrapper
import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.semantics.outerSemantics
+import androidx.compose.ui.state.ToggleableState
import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.InternalTextApi
import androidx.compose.ui.text.TextLayoutResult
import androidx.compose.ui.text.platform.toAccessibilitySpannableString
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.toSize
import androidx.compose.ui.util.fastForEach
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.fastJoinToString
-import androidx.compose.ui.focus.requestFocus
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.node.HitTestResult
-import androidx.compose.ui.platform.accessibility.hasCollectionInfo
-import androidx.compose.ui.platform.accessibility.setCollectionInfo
-import androidx.compose.ui.platform.accessibility.setCollectionItemInfo
-import androidx.compose.ui.semantics.AccessibilityAction
-import androidx.compose.ui.semantics.LiveRegionMode
-import androidx.compose.ui.semantics.ProgressBarRangeInfo
-import androidx.compose.ui.state.ToggleableState
-import androidx.compose.ui.text.InternalTextApi
import androidx.compose.ui.util.fastForEachIndexed
import androidx.core.view.AccessibilityDelegateCompat
import androidx.core.view.ViewCompat
@@ -81,12 +86,15 @@
import androidx.core.view.ViewCompat.ACCESSIBILITY_LIVE_REGION_POLITE
import androidx.core.view.accessibility.AccessibilityEventCompat
import androidx.core.view.accessibility.AccessibilityNodeInfoCompat
+import androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat
import androidx.core.view.accessibility.AccessibilityNodeProviderCompat
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.delay
+import kotlin.math.abs
import kotlin.math.ceil
import kotlin.math.floor
import kotlin.math.roundToInt
+import kotlin.math.sign
private fun LayoutNode.findClosestParentNode(selector: (LayoutNode) -> Boolean): LayoutNode? {
var currentParent = this.parent
@@ -203,11 +211,14 @@
val toIndex: Int,
val traverseTime: Long
)
+
private var pendingTextTraversedEvent: PendingTextTraversedEvent? = null
- // Up to date semantics nodes in pruned semantics tree. It always reflects the current
- // semantics tree. They key is the virtual view id(the root node has a key of
- // AccessibilityNodeProviderCompat.HOST_VIEW_ID and other node has a key of its id).
+ /**
+ * Up to date semantics nodes in pruned semantics tree. It always reflects the current
+ * semantics tree. They key is the virtual view id(the root node has a key of
+ * AccessibilityNodeProviderCompat.HOST_VIEW_ID and other node has a key of its id).
+ */
private var currentSemanticsNodes: Map<Int, SemanticsNodeWithAdjustedBounds> = mapOf()
get() {
if (currentSemanticsNodesInvalidated) {
@@ -261,6 +272,63 @@
})
}
+ /**
+ * Returns true if there is any semantics node in the tree that can scroll in the given
+ * [orientation][vertical] and [direction] at the given [position] in the view associated with
+ * this delegate.
+ *
+ * @param direction The direction to check for scrolling: <0 means scrolling left or up, >0
+ * means scrolling right or down.
+ * @param position The position in the view to check in view-local coordinates.
+ */
+ internal fun canScroll(
+ vertical: Boolean,
+ direction: Int,
+ position: Offset
+ ): Boolean = canScroll(currentSemanticsNodes.values, vertical, direction, position)
+
+ @VisibleForTesting(otherwise = PRIVATE)
+ internal fun canScroll(
+ currentSemanticsNodes: Collection<SemanticsNodeWithAdjustedBounds>,
+ vertical: Boolean,
+ direction: Int,
+ position: Offset
+ ): Boolean {
+ // No down event has occurred yet which gives us a location to hit test.
+ if (position == Offset.Unspecified || !position.isValid()) return false
+
+ val scrollRangeProperty = when (vertical) {
+ true -> SemanticsProperties.VerticalScrollAxisRange
+ false -> SemanticsProperties.HorizontalScrollAxisRange
+ }
+
+ return currentSemanticsNodes.any { node ->
+ // Only consider nodes that are under the touch event. Checks the adjusted bounds to
+ // avoid overlapping siblings. Because position is a float (touch event can happen in-
+ // between pixels), convert the int-based Android Rect to a float-based Compose Rect
+ // before doing the comparison.
+ if (!node.adjustedBounds.toComposeRect().contains(position)) {
+ return@any false
+ }
+
+ val scrollRange = node.semanticsNode.config.getOrNull(scrollRangeProperty)
+ ?: return@any false
+
+ // A node simply having scrollable semantics doesn't mean it's necessarily scrollable
+ // in the given direction – it must also not be scrolled to its limit in that direction.
+ var actualDirection = if (scrollRange.reverseScrolling) -direction else direction
+ if (direction == 0 && scrollRange.reverseScrolling) {
+ // The View implementation of canScroll* treat zero as a positive direction, so
+ // this code should do the same. That means if scrolling is reversed, zero should be
+ // a negative direction. The actual number doesn't matter, just its sign.
+ actualDirection = -1
+ }
+
+ if (actualDirection < 0) scrollRange.value() > 0
+ else scrollRange.value() < scrollRange.maxValue()
+ }
+ }
+
private fun createNodeInfo(virtualViewId: Int): AccessibilityNodeInfo? {
val info: AccessibilityNodeInfoCompat = AccessibilityNodeInfoCompat.obtain()
val semanticsNodeWithAdjustedBounds = currentSemanticsNodes[virtualViewId]
@@ -362,16 +430,10 @@
// Manage internal accessibility focus state.
if (focusedVirtualViewId == virtualViewId) {
info.isAccessibilityFocused = true
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat
- .ACTION_CLEAR_ACCESSIBILITY_FOCUS
- )
+ info.addAction(AccessibilityActionCompat.ACTION_CLEAR_ACCESSIBILITY_FOCUS)
} else {
info.isAccessibilityFocused = false
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat
- .ACTION_ACCESSIBILITY_FOCUS
- )
+ info.addAction(AccessibilityActionCompat.ACTION_ACCESSIBILITY_FOCUS)
}
setText(semanticsNode, info)
@@ -487,7 +549,7 @@
info.isClickable = !isSelected
if (semanticsNode.enabled() && !isSelected) {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CLICK,
it.label
)
@@ -499,7 +561,7 @@
info.isLongClickable = true
if (semanticsNode.enabled()) {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_LONG_CLICK,
it.label
)
@@ -510,7 +572,7 @@
// The config will contain this action only if there is a text selection at the moment.
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.CopyText)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_COPY,
it.label
)
@@ -519,7 +581,7 @@
if (semanticsNode.enabled()) {
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.SetText)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SET_TEXT,
it.label
)
@@ -529,7 +591,7 @@
// The config will contain this action only if there is a text selection at the moment.
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.CutText)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_CUT,
it.label
)
@@ -541,7 +603,7 @@
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.PasteText)?.let {
if (info.isFocused && view.clipboardManager.hasText()) {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_PASTE,
it.label
)
@@ -561,7 +623,7 @@
// ACTION_SET_SELECTION should be provided even when SemanticsActions.SetSelection
// semantics action is not provided by the component
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_SET_SELECTION,
setSelectionAction?.label
)
@@ -640,16 +702,14 @@
) {
if (rangeInfo.current <
rangeInfo.range.endInclusive.coerceAtLeast(rangeInfo.range.start)
- )
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_FORWARD
- )
+ ) {
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_FORWARD)
+ }
if (rangeInfo.current >
rangeInfo.range.start.coerceAtMost(rangeInfo.range.endInclusive)
- )
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_BACKWARD
- )
+ ) {
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_BACKWARD)
+ }
}
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
@@ -659,47 +719,42 @@
setCollectionInfo(semanticsNode, info)
setCollectionItemInfo(semanticsNode, info)
+ // Will the scrollable scroll when ACTION_SCROLL_FORWARD is performed?
+ fun ScrollAxisRange.canScrollForward(): Boolean {
+ return value() < maxValue() && !reverseScrolling || value() > 0f && reverseScrolling
+ }
+
val xScrollState =
semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.HorizontalScrollAxisRange)
val scrollAction = semanticsNode.unmergedConfig.getOrNull(SemanticsActions.ScrollBy)
if (xScrollState != null && scrollAction != null) {
- val value = xScrollState.value()
- val maxValue = xScrollState.maxValue()
- val reverseScrolling = xScrollState.reverseScrolling
// Talkback defines SCROLLABLE_ROLE_FILTER_FOR_DIRECTION_NAVIGATION, so we need to
// assign a role for auto scroll to work. Node with collectionInfo resolved by
// Talkback to ROLE_LIST and supports autoscroll too
if (!semanticsNode.hasCollectionInfo()) {
info.className = "android.widget.HorizontalScrollView"
}
- if (maxValue > 0f) {
+ if (xScrollState.maxValue() > 0f) {
info.isScrollable = true
}
- if (semanticsNode.enabled() && value < maxValue) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_FORWARD
- )
- if (!reverseScrolling) {
+ if (semanticsNode.enabled()) {
+ if (xScrollState.canScrollForward()) {
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_FORWARD)
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_RIGHT
+ if (!semanticsNode.isRtl) {
+ AccessibilityActionCompat.ACTION_SCROLL_RIGHT
+ } else {
+ AccessibilityActionCompat.ACTION_SCROLL_LEFT
+ }
)
} else {
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_BACKWARD)
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_LEFT
- )
- }
- }
- if (semanticsNode.enabled() && value > 0f) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_BACKWARD
- )
- if (!reverseScrolling) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_LEFT
- )
- } else {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_RIGHT
+ if (!semanticsNode.isRtl) {
+ AccessibilityActionCompat.ACTION_SCROLL_LEFT
+ } else {
+ AccessibilityActionCompat.ACTION_SCROLL_RIGHT
+ }
)
}
}
@@ -707,44 +762,22 @@
val yScrollState =
semanticsNode.unmergedConfig.getOrNull(SemanticsProperties.VerticalScrollAxisRange)
if (yScrollState != null && scrollAction != null) {
- val value = yScrollState.value()
- val maxValue = yScrollState.maxValue()
- val reverseScrolling = yScrollState.reverseScrolling
// Talkback defines SCROLLABLE_ROLE_FILTER_FOR_DIRECTION_NAVIGATION, so we need to
// assign a role for auto scroll to work. Node with collectionInfo resolved by
// Talkback to ROLE_LIST and supports autoscroll too
if (!semanticsNode.hasCollectionInfo()) {
info.className = "android.widget.ScrollView"
}
- if (maxValue > 0f) {
+ if (yScrollState.maxValue() > 0f) {
info.isScrollable = true
}
- if (semanticsNode.enabled() && value < maxValue) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_FORWARD
- )
- if (!reverseScrolling) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_DOWN
- )
+ if (semanticsNode.enabled()) {
+ if (yScrollState.canScrollForward()) {
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_FORWARD)
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_DOWN)
} else {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_UP
- )
- }
- }
- if (semanticsNode.enabled() && value > 0f) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_BACKWARD
- )
- if (!reverseScrolling) {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_UP
- )
- } else {
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_DOWN
- )
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_BACKWARD)
+ info.addAction(AccessibilityActionCompat.ACTION_SCROLL_UP)
}
}
}
@@ -754,7 +787,7 @@
if (semanticsNode.enabled()) {
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.Expand)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_EXPAND,
it.label
)
@@ -763,7 +796,7 @@
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.Collapse)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_COLLAPSE,
it.label
)
@@ -772,7 +805,7 @@
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.Dismiss)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
AccessibilityNodeInfoCompat.ACTION_DISMISS,
it.label
)
@@ -803,11 +836,7 @@
currentActionIdToLabel.put(actionId!!, action.label)
currentLabelToActionId[action.label] = actionId
availableIds.remove(actionId)
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
- actionId, action.label
- )
- )
+ info.addAction(AccessibilityActionCompat(actionId, action.label))
} else {
unassignedActions.add(action)
}
@@ -816,22 +845,14 @@
val actionId = availableIds[index]
currentActionIdToLabel.put(actionId, action.label)
currentLabelToActionId[action.label] = actionId
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
- actionId, action.label
- )
- )
+ info.addAction(AccessibilityActionCompat(actionId, action.label))
}
} else {
customActions.fastForEachIndexed { index, action ->
val actionId = AccessibilityActionsResourceIds[index]
currentActionIdToLabel.put(actionId, action.label)
currentLabelToActionId[action.label] = actionId
- info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
- actionId, action.label
- )
- )
+ info.addAction(AccessibilityActionCompat(actionId, action.label))
}
}
actionIdToLabel.put(virtualViewId, currentActionIdToLabel)
@@ -1114,9 +1135,18 @@
android.R.id.accessibilityActionScrollUp,
android.R.id.accessibilityActionScrollRight,
android.R.id.accessibilityActionScrollLeft -> {
- if (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD ||
- action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
- ) {
+ // Introduce a few shorthands:
+ val scrollForward = action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD
+ val scrollBackward = action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD
+ val scrollLeft = action == android.R.id.accessibilityActionScrollLeft
+ val scrollRight = action == android.R.id.accessibilityActionScrollRight
+ val scrollUp = action == android.R.id.accessibilityActionScrollUp
+ val scrollDown = action == android.R.id.accessibilityActionScrollDown
+
+ val scrollHorizontal = scrollLeft || scrollRight || scrollForward || scrollBackward
+ val scrollVertical = scrollUp || scrollDown || scrollForward || scrollBackward
+
+ if (scrollForward || scrollBackward) {
val rangeInfo =
node.unmergedConfig.getOrNull(SemanticsProperties.ProgressBarRangeInfo)
val setProgressAction =
@@ -1129,7 +1159,7 @@
} else {
(max - min) / AccessibilitySliderStepsCount
}
- if (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD) {
+ if (scrollBackward) {
increment = -increment
}
return setProgressAction.action?.invoke(rangeInfo.current + increment)
@@ -1137,79 +1167,48 @@
}
}
+ // Will the scrollable scroll when ScrollBy is invoked with the given [amount]?
+ fun ScrollAxisRange.canScroll(amount: Float): Boolean {
+ return amount < 0 && value() > 0 || amount > 0 && value() < maxValue()
+ }
+
val viewport = node.layoutInfo.coordinates.boundsInParent().size
val scrollAction =
node.unmergedConfig.getOrNull(SemanticsActions.ScrollBy) ?: return false
+
val xScrollState =
node.unmergedConfig.getOrNull(SemanticsProperties.HorizontalScrollAxisRange)
- if (xScrollState != null) {
- if ((
- (
- !xScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollRight
- ) ||
- (
- xScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollLeft
- ) ||
- (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
- ) &&
- xScrollState.value() < xScrollState.maxValue()
- ) {
- // here and below innerLayoutNodeWrapper is used to calculate the width
- // and height to exclude the paddings
- return scrollAction.action?.invoke(viewport.width, 0f) ?: false
+ if (xScrollState != null && scrollHorizontal) {
+ var amountToScroll = viewport.width
+ if (scrollLeft || scrollBackward) {
+ amountToScroll = -amountToScroll
}
- if ((
- (
- xScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollRight
- ) ||
- (
- !xScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollLeft
- ) ||
- (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
- ) &&
- xScrollState.value() > 0
- ) {
- return scrollAction.action?.invoke(-viewport.width, 0f) ?: false
+ if (xScrollState.reverseScrolling) {
+ amountToScroll = -amountToScroll
+ }
+ if (node.isRtl && (scrollLeft || scrollRight)) {
+ amountToScroll = -amountToScroll
+ }
+ if (xScrollState.canScroll(amountToScroll)) {
+ return scrollAction.action?.invoke(amountToScroll, 0f) ?: false
}
}
+
val yScrollState =
node.unmergedConfig.getOrNull(SemanticsProperties.VerticalScrollAxisRange)
- if (yScrollState != null) {
- if ((
- (
- !yScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollDown
- ) ||
- (
- yScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollUp
- ) ||
- (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD)
- ) &&
- yScrollState.value() < yScrollState.maxValue()
- ) {
- return scrollAction.action?.invoke(0f, viewport.height) ?: false
+ if (yScrollState != null && scrollVertical) {
+ var amountToScroll = viewport.height
+ if (scrollUp || scrollBackward) {
+ amountToScroll = -amountToScroll
}
- if ((
- (
- yScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollDown
- ) ||
- (
- !yScrollState.reverseScrolling &&
- action == android.R.id.accessibilityActionScrollUp
- ) ||
- (action == AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD)
- ) &&
- yScrollState.value() > 0
- ) {
- return scrollAction.action?.invoke(0f, -viewport.height) ?: false
+ if (yScrollState.reverseScrolling) {
+ amountToScroll = -amountToScroll
+ }
+ if (yScrollState.canScroll(amountToScroll)) {
+ return scrollAction.action?.invoke(0f, amountToScroll) ?: false
}
}
+
return false
}
android.R.id.accessibilityActionSetProgress -> {
@@ -1288,16 +1287,37 @@
}
// TalkBack expects the minimum amount of movement to fully reveal the node.
- var xDelta = node.size.width - node.boundsInWindow.width
- if (node.boundsInWindow.left == scrollableAncestor.positionInWindow.x) {
- xDelta = -xDelta
- }
- var yDelta = node.size.height - node.boundsInWindow.height
- if (node.boundsInWindow.top == scrollableAncestor.positionInWindow.y) {
- yDelta = -yDelta
- }
+ // First, get the viewport and the target bounds in root coordinates
+ val viewportInParent = scrollableAncestor.layoutInfo.coordinates.boundsInParent()
+ val parentInRoot = scrollableAncestor.layoutInfo.coordinates
+ .parentLayoutCoordinates?.positionInRoot() ?: Offset.Zero
+ val viewport = viewportInParent.translate(parentInRoot)
+ val target = Rect(node.positionInRoot, node.size.toSize())
- return scrollAction?.action?.invoke(xDelta, yDelta) ?: false
+ val xScrollState = scrollableAncestor.unmergedConfig
+ .getOrNull(SemanticsProperties.HorizontalScrollAxisRange)
+ val yScrollState = scrollableAncestor.unmergedConfig
+ .getOrNull(SemanticsProperties.VerticalScrollAxisRange)
+
+ // Given the desired scroll value to align either side of the target with the
+ // viewport, what delta should we go with?
+ // If we need to scroll in opposite directions for both sides, don't scroll at all.
+ // Otherwise, take the delta that scrolls the least amount.
+ fun scrollDelta(a: Float, b: Float): Float =
+ if (sign(a) == sign(b)) if (abs(a) < abs(b)) a else b else 0f
+
+ // Get the desired delta X
+ var dx = scrollDelta(target.left - viewport.left, target.right - viewport.right)
+ // And adjust for reversing properties
+ if (xScrollState?.reverseScrolling == true) dx = -dx
+ if (node.isRtl) dx = -dx
+
+ // Get the desired delta Y
+ var dy = scrollDelta(target.top - viewport.top, target.bottom - viewport.bottom)
+ // And adjust for reversing properties
+ if (yScrollState?.reverseScrolling == true) dy = -dy
+
+ return scrollAction?.action?.invoke(dx, dy) ?: false
}
// TODO: handling for other system actions
else -> {
@@ -2386,7 +2406,7 @@
if (semanticsNode.enabled()) {
semanticsNode.unmergedConfig.getOrNull(SemanticsActions.SetProgress)?.let {
info.addAction(
- AccessibilityNodeInfoCompat.AccessibilityActionCompat(
+ AccessibilityActionCompat(
android.R.id.accessibilityActionSetProgress,
it.label
)
@@ -2424,6 +2444,7 @@
private fun SemanticsNode.hasPaneTitle() = config.contains(SemanticsProperties.PaneTitle)
private val SemanticsNode.isPassword: Boolean get() = config.contains(SemanticsProperties.Password)
private val SemanticsNode.isTextField get() = this.unmergedConfig.contains(SemanticsActions.SetText)
+private val SemanticsNode.isRtl get() = layoutInfo.layoutDirection == LayoutDirection.Rtl
private fun SemanticsNode.excludeLineAndPageGranularities(): Boolean {
// text field that is not in focus
@@ -2540,9 +2561,11 @@
}
}
-// These objects are used as snapshot observation scopes for the purpose of sending accessibility
-// scroll events whenever the scroll offset changes. There is one per scroller and their lifecycle
-// is the same as the scroller's lifecycle in the semantics tree.
+/**
+ * These objects are used as snapshot observation scopes for the purpose of sending accessibility
+ * scroll events whenever the scroll offset changes. There is one per scroller and their lifecycle
+ * is the same as the scroller's lifecycle in the semantics tree.
+ */
internal class ScrollObservationScope(
val semanticsNodeId: Int,
val allScopes: List<ScrollObservationScope>,
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
index 52e7258..1768fea 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/platform/ComposeView.android.kt
@@ -24,12 +24,14 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composition
import androidx.compose.runtime.CompositionContext
+import androidx.compose.runtime.Recomposer
import androidx.compose.runtime.mutableStateOf
import androidx.compose.ui.InternalComposeUiApi
import androidx.compose.ui.node.InternalCoreApi
import androidx.compose.ui.node.Owner
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.ViewTreeLifecycleOwner
+import java.lang.ref.WeakReference
/**
* Base class for custom [android.view.View]s implemented using Jetpack Compose UI.
@@ -61,8 +63,10 @@
* If this View moves to the [android.view.ViewOverlay] we won't be able
* to find view tree dependencies; this happens when using transition APIs
* to animate views out in particular.
+ *
+ * We only ever set this when we're attached to a window.
*/
- private var cachedViewTreeCompositionContext: CompositionContext? = null
+ private var cachedViewTreeCompositionContext: WeakReference<CompositionContext>? = null
/**
* The [getWindowToken] of the window this view was last attached to.
@@ -203,6 +207,24 @@
}
/**
+ * `true` if the [CompositionContext] can be considered to be "alive" for the purposes
+ * of locally caching it in case the view is placed into a ViewOverlay.
+ * [Recomposer]s that are in the [Recomposer.State.ShuttingDown] state or lower should
+ * not be cached or reusedif currently cached, as they will never recompose content.
+ */
+ private val CompositionContext.isAlive: Boolean
+ get() = this !is Recomposer || currentState.value > Recomposer.State.ShuttingDown
+
+ /**
+ * Cache this [CompositionContext] in [cachedViewTreeCompositionContext] if it [isAlive]
+ * and return the [CompositionContext] itself either way.
+ */
+ private fun CompositionContext.cacheIfAlive(): CompositionContext = also { context ->
+ context.takeIf { it.isAlive }
+ ?.let { cachedViewTreeCompositionContext = WeakReference(it) }
+ }
+
+ /**
* Determine the correct [CompositionContext] to use as the parent of this view's
* composition. This can result in caching a looked-up [CompositionContext] for use
* later. See [cachedViewTreeCompositionContext] for more details.
@@ -217,9 +239,9 @@
* to do it, as well as still locate any view tree dependencies.
*/
private fun resolveParentCompositionContext() = parentContext
- ?: findViewTreeCompositionContext()?.also { cachedViewTreeCompositionContext = it }
- ?: cachedViewTreeCompositionContext
- ?: windowRecomposer.also { cachedViewTreeCompositionContext = it }
+ ?: findViewTreeCompositionContext()?.cacheIfAlive()
+ ?: cachedViewTreeCompositionContext?.get()?.takeIf { it.isAlive }
+ ?: windowRecomposer.cacheIfAlive()
@Suppress("DEPRECATION") // Still using ViewGroup.setContent for now
private fun ensureCompositionCreated() {
diff --git a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
index a180752..190faaa 100644
--- a/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
+++ b/compose/ui/ui/src/androidMain/kotlin/androidx/compose/ui/window/AndroidPopup.android.kt
@@ -51,6 +51,7 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.R
import androidx.compose.ui.draw.alpha
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.layout.onSizeChanged
@@ -85,8 +86,12 @@
* If true, pressing the back button will call onDismissRequest. Note that [focusable] must be
* set to true in order to receive key events such as the back button - if the popup is not
* focusable then this property does nothing.
- * @property dismissOnClickOutside Whether the popup can be dismissed by clicking outside the
- * popup's bounds. If true, clicking outside the popup will call onDismissRequest.
+ * @property dismissOnOutsideClick Whether the popup should be dismissed when a click outside
+ * the popup happens. This lambda will be called for every click which is about to request popup
+ * dismissal, and returns whether the dismiss request should happen or not. The lambda receives
+ * the anchor bounds as well the click offset, relative to the application window.
+ * Note the offset might be unknown (`null`) when the click happens on a different window
+ * (not the main application window) and the touch position is obscured.
* @property securePolicy Policy for setting [WindowManager.LayoutParams.FLAG_SECURE] on the popup's
* window.
* @property excludeFromSystemGesture A flag to check whether to set the systemGestureExclusionRects.
@@ -97,19 +102,37 @@
* The default value is true.
* @property usePlatformDefaultWidth Whether the width of the popup's content should be limited to
* the platform default, which is smaller than the screen width.
+ * @property updateAndroidWindowManagerFlags Offers low-level control over the flags passed
+ * by the [Popup] to the Android WindowManager. The parameter of the lambda is the flags
+ * calculated from the [PopupProperties] values that result in WindowManager flags: e.g. focusable.
+ * The return value will be the final flags, which will be passed to the Android WindowManager.
+ * By default, it will leave the flags calculated from parameters unchanged.
+ * This API should be used with caution, only in cases where the popup has very specific behaviour
+ * requirements.
*/
@Immutable
class PopupProperties @ExperimentalComposeUiApi constructor(
val focusable: Boolean = false,
val dismissOnBackPress: Boolean = true,
- val dismissOnClickOutside: Boolean = true,
+ @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+ @get:ExperimentalComposeUiApi
+ val dismissOnOutsideClick: (Offset?, IntRect) -> Boolean = alwaysDismissOnOutsideClick,
val securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
val excludeFromSystemGesture: Boolean = true,
val clippingEnabled: Boolean = true,
@Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
@get:ExperimentalComposeUiApi
- val usePlatformDefaultWidth: Boolean = false
+ val usePlatformDefaultWidth: Boolean = false,
+ @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+ @get:ExperimentalComposeUiApi
+ val updateAndroidWindowManagerFlags: (Int) -> Int = PreserveFlags
) {
+ @Deprecated(
+ "Superseded by dismissOnOutsideClick",
+ level = DeprecationLevel.WARNING
+ )
+ val dismissOnClickOutside = dismissOnOutsideClick == alwaysDismissOnOutsideClick
+
@OptIn(ExperimentalComposeUiApi::class)
constructor(
focusable: Boolean = false,
@@ -118,14 +141,16 @@
securePolicy: SecureFlagPolicy = SecureFlagPolicy.Inherit,
excludeFromSystemGesture: Boolean = true,
clippingEnabled: Boolean = true,
- ) : this (
+ ) : this(
focusable = focusable,
dismissOnBackPress = dismissOnBackPress,
- dismissOnClickOutside = dismissOnClickOutside,
+ dismissOnOutsideClick =
+ if (dismissOnClickOutside) alwaysDismissOnOutsideClick else { _, _ -> false },
securePolicy = securePolicy,
excludeFromSystemGesture = excludeFromSystemGesture,
clippingEnabled = clippingEnabled,
- usePlatformDefaultWidth = false
+ usePlatformDefaultWidth = false,
+ updateAndroidWindowManagerFlags = PreserveFlags
)
@OptIn(ExperimentalComposeUiApi::class)
@@ -135,11 +160,12 @@
if (focusable != other.focusable) return false
if (dismissOnBackPress != other.dismissOnBackPress) return false
- if (dismissOnClickOutside != other.dismissOnClickOutside) return false
+ if (dismissOnOutsideClick != other.dismissOnOutsideClick) return false
if (securePolicy != other.securePolicy) return false
if (excludeFromSystemGesture != other.excludeFromSystemGesture) return false
if (clippingEnabled != other.clippingEnabled) return false
if (usePlatformDefaultWidth != other.usePlatformDefaultWidth) return false
+ if (updateAndroidWindowManagerFlags != other.updateAndroidWindowManagerFlags) return false
return true
}
@@ -149,15 +175,22 @@
var result = dismissOnBackPress.hashCode()
result = 31 * result + focusable.hashCode()
result = 31 * result + dismissOnBackPress.hashCode()
- result = 31 * result + dismissOnClickOutside.hashCode()
+ result = 31 * result + dismissOnOutsideClick.hashCode()
result = 31 * result + securePolicy.hashCode()
result = 31 * result + excludeFromSystemGesture.hashCode()
result = 31 * result + clippingEnabled.hashCode()
result = 31 * result + usePlatformDefaultWidth.hashCode()
+ result = 31 * result + updateAndroidWindowManagerFlags.hashCode()
return result
}
}
+private val alwaysDismissOnOutsideClick = { _: Offset?, _: IntRect ->
+ true
+}
+
+private val PreserveFlags: (Int) -> Int = { flags -> flags }
+
/**
* Opens a popup with the given content.
*
@@ -544,6 +577,7 @@
setIsFocusable(properties.focusable)
setSecurePolicy(properties.securePolicy)
setClippingEnabled(properties.clippingEnabled)
+ applyNewFlags(properties.updateAndroidWindowManagerFlags(params.flags))
superSetLayoutDirection(layoutDirection)
}
@@ -598,23 +632,39 @@
* users clicks outside the popup.
*/
override fun onTouchEvent(event: MotionEvent?): Boolean {
- if (!properties.dismissOnClickOutside) {
- return super.onTouchEvent(event)
- }
+ event ?: return super.onTouchEvent(event)
+
// Note that this implementation is taken from PopupWindow. It actually does not seem to
// matter whether we return true or false as some upper layer decides on whether the
// event is propagated to other windows or not. So for focusable the event is consumed but
// for not focusable it is propagated to other windows.
- if ((event?.action == MotionEvent.ACTION_DOWN) &&
- ((event.x < 0) || (event.x >= width) || (event.y < 0) || (event.y >= height))
+ if (
+ (
+ (event.action == MotionEvent.ACTION_DOWN) &&
+ (
+ (event.x < 0) ||
+ (event.x >= width) ||
+ (event.y < 0) ||
+ (event.y >= height)
+ )
+ ) ||
+ event.action == MotionEvent.ACTION_OUTSIDE
) {
- onDismissRequest?.invoke()
- return true
- } else if (event?.action == MotionEvent.ACTION_OUTSIDE) {
- onDismissRequest?.invoke()
- return true
+ val parentBounds = parentBounds
+ val shouldDismiss = parentBounds == null || properties.dismissOnOutsideClick(
+ if (event.x != 0f || event.y != 0f) {
+ Offset(
+ params.x + event.x,
+ params.y + event.y
+ )
+ } else null,
+ parentBounds
+ )
+ if (shouldDismiss) {
+ onDismissRequest?.invoke()
+ return true
+ }
}
-
return super.onTouchEvent(event)
}
@@ -645,13 +695,18 @@
WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES or
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE or
WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE or
+ WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL or
+ WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS or
WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM or
- WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
+ WindowManager.LayoutParams.FLAG_SPLIT_TOUCH or
+ WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED
).inv()
// Enables us to intercept outside clicks even when popup is not focusable
flags = flags or WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
+ softInputMode = WindowManager.LayoutParams.SOFT_INPUT_STATE_UNCHANGED
+
type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL
// Get the Window token from the parent view
diff --git a/compose/ui/ui/src/androidMain/res/values-af/strings.xml b/compose/ui/ui/src/androidMain/res/values-af/strings.xml
index 8df3813..a7d0976 100644
--- a/compose/ui/ui/src/androidMain/res/values-af/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-af/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Besig"</string>
<string name="tab" msgid="1672349317127674378">"Oortjie"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigasiekieslys"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Aftrekkieslys"</string>
<string name="close_drawer" msgid="406453423630273620">"Maak navigasiekieslys toe"</string>
<string name="close_sheet" msgid="7573152094250666567">"Maak sigblad toe"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ongeldige invoer"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-am/strings.xml b/compose/ui/ui/src/androidMain/res/values-am/strings.xml
index 6b73ce6..f708834 100644
--- a/compose/ui/ui/src/androidMain/res/values-am/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-am/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"በሂደት ላይ"</string>
<string name="tab" msgid="1672349317127674378">"ትር"</string>
<string name="navigation_menu" msgid="542007171693138492">"የዳሰሳ ምናሌ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ተቆልቋይ ምናሌ"</string>
<string name="close_drawer" msgid="406453423630273620">"የዳሰሳ ምናሌን ዝጋ"</string>
<string name="close_sheet" msgid="7573152094250666567">"ሉህን ዝጋ"</string>
<string name="default_error_message" msgid="8038256446254964252">"ልክ ያልሆነ ግቤት"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ar/strings.xml b/compose/ui/ui/src/androidMain/res/values-ar/strings.xml
index 7bc2c30..6b13b69 100644
--- a/compose/ui/ui/src/androidMain/res/values-ar/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ar/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"قيد التقدم"</string>
<string name="tab" msgid="1672349317127674378">"علامة تبويب"</string>
<string name="navigation_menu" msgid="542007171693138492">"قائمة تنقل"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"قائمة منسدلة"</string>
<string name="close_drawer" msgid="406453423630273620">"إغلاق قائمة التنقل"</string>
<string name="close_sheet" msgid="7573152094250666567">"إغلاق الورقة"</string>
<string name="default_error_message" msgid="8038256446254964252">"إدخال غير صالح"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-as/strings.xml b/compose/ui/ui/src/androidMain/res/values-as/strings.xml
index 09e5c66..a0adbf45 100644
--- a/compose/ui/ui/src/androidMain/res/values-as/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-as/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"প্ৰক্ৰিয়াকৰণ কৰি থকা হৈছে"</string>
<string name="tab" msgid="1672349317127674378">"টেব"</string>
<string name="navigation_menu" msgid="542007171693138492">"নেভিগেশ্বন মেনু"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ড্ৰপডাউনৰ মেনু"</string>
<string name="close_drawer" msgid="406453423630273620">"নেভিগেশ্বন মেনু বন্ধ কৰক"</string>
<string name="close_sheet" msgid="7573152094250666567">"শ্বীট বন্ধ কৰক"</string>
<string name="default_error_message" msgid="8038256446254964252">"অমান্য ইনপুট"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-az/strings.xml b/compose/ui/ui/src/androidMain/res/values-az/strings.xml
index 3e535ef..887848b 100644
--- a/compose/ui/ui/src/androidMain/res/values-az/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-az/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Davam edir"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Naviqasiya menyusu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Aşağı açılan menyu"</string>
<string name="close_drawer" msgid="406453423630273620">"Naviqasiya menyusunu bağlayın"</string>
<string name="close_sheet" msgid="7573152094250666567">"Səhifəni bağlayın"</string>
<string name="default_error_message" msgid="8038256446254964252">"Yanlış daxiletmə"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml b/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
index ab82f65..aac33f4 100644
--- a/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-b+sr+Latn/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"U toku"</string>
<string name="tab" msgid="1672349317127674378">"Kartica"</string>
<string name="navigation_menu" msgid="542007171693138492">"Meni za navigaciju"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Padajući meni"</string>
<string name="close_drawer" msgid="406453423630273620">"Zatvori meni za navigaciju"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zatvorite tabelu"</string>
<string name="default_error_message" msgid="8038256446254964252">"Unos je nevažeći"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-be/strings.xml b/compose/ui/ui/src/androidMain/res/values-be/strings.xml
index 49d540d..4d283f2 100644
--- a/compose/ui/ui/src/androidMain/res/values-be/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-be/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"У працэсе"</string>
<string name="tab" msgid="1672349317127674378">"Укладка"</string>
<string name="navigation_menu" msgid="542007171693138492">"Меню навігацыі"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Выпадное меню"</string>
<string name="close_drawer" msgid="406453423630273620">"Закрыць меню навігацыі"</string>
<string name="close_sheet" msgid="7573152094250666567">"Закрыць аркуш"</string>
<string name="default_error_message" msgid="8038256446254964252">"Памылка ўводу"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-bg/strings.xml b/compose/ui/ui/src/androidMain/res/values-bg/strings.xml
index d0551d7..1392899 100644
--- a/compose/ui/ui/src/androidMain/res/values-bg/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-bg/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"В ход"</string>
<string name="tab" msgid="1672349317127674378">"Раздел"</string>
<string name="navigation_menu" msgid="542007171693138492">"Меню за навигация"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Падащо меню"</string>
<string name="close_drawer" msgid="406453423630273620">"Затваряне на менюто за навигация"</string>
<string name="close_sheet" msgid="7573152094250666567">"Затваряне на таблицата"</string>
<string name="default_error_message" msgid="8038256446254964252">"Въведеното е невалидно"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-bn/strings.xml b/compose/ui/ui/src/androidMain/res/values-bn/strings.xml
index 1d55845..583c2cc 100644
--- a/compose/ui/ui/src/androidMain/res/values-bn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-bn/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"কাজ চলছে"</string>
<string name="tab" msgid="1672349317127674378">"ট্যাব"</string>
<string name="navigation_menu" msgid="542007171693138492">"নেভিগেশন মেনু"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ড্রপডাউন মেনু"</string>
<string name="close_drawer" msgid="406453423630273620">"নেভিগেশন মেনু বন্ধ করুন"</string>
<string name="close_sheet" msgid="7573152094250666567">"শিট বন্ধ করুন"</string>
<string name="default_error_message" msgid="8038256446254964252">"ভুল ইনপুট"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-bs/strings.xml b/compose/ui/ui/src/androidMain/res/values-bs/strings.xml
index 67467e3..181d6f8 100644
--- a/compose/ui/ui/src/androidMain/res/values-bs/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-bs/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"U toku"</string>
<string name="tab" msgid="1672349317127674378">"Kartica"</string>
<string name="navigation_menu" msgid="542007171693138492">"Meni za navigaciju"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Padajući meni"</string>
<string name="close_drawer" msgid="406453423630273620">"Zatvaranje navigacionog menija"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zatvaranje tabele"</string>
<string name="default_error_message" msgid="8038256446254964252">"Pogrešan unos"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ca/strings.xml b/compose/ui/ui/src/androidMain/res/values-ca/strings.xml
index 809474d..df7e308 100644
--- a/compose/ui/ui/src/androidMain/res/values-ca/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ca/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"En curs"</string>
<string name="tab" msgid="1672349317127674378">"Pestanya"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menú de navegació"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menú desplegable"</string>
<string name="close_drawer" msgid="406453423630273620">"Tanca el menú de navegació"</string>
<string name="close_sheet" msgid="7573152094250666567">"Tanca el full"</string>
<string name="default_error_message" msgid="8038256446254964252">"L\'entrada no és vàlida"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-cs/strings.xml b/compose/ui/ui/src/androidMain/res/values-cs/strings.xml
index 42d455e..508c90d 100644
--- a/compose/ui/ui/src/androidMain/res/values-cs/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-cs/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Probíhá"</string>
<string name="tab" msgid="1672349317127674378">"Karta"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigační nabídka"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Rozbalovací nabídka"</string>
<string name="close_drawer" msgid="406453423630273620">"Zavřít navigační panel"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zavřít sešit"</string>
<string name="default_error_message" msgid="8038256446254964252">"Neplatný údaj"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-da/strings.xml b/compose/ui/ui/src/androidMain/res/values-da/strings.xml
index a7ac27a..fb81f4a 100644
--- a/compose/ui/ui/src/androidMain/res/values-da/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-da/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"I gang"</string>
<string name="tab" msgid="1672349317127674378">"Fane"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigationsmenu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Rullemenu"</string>
<string name="close_drawer" msgid="406453423630273620">"Luk navigationsmenuen"</string>
<string name="close_sheet" msgid="7573152094250666567">"Luk arket"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ugyldigt input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-de/strings.xml b/compose/ui/ui/src/androidMain/res/values-de/strings.xml
index 05cb660..d740c8e 100644
--- a/compose/ui/ui/src/androidMain/res/values-de/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-de/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In Bearbeitung"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigationsmenü"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Drop-down-Menü"</string>
<string name="close_drawer" msgid="406453423630273620">"Navigationsmenü schließen"</string>
<string name="close_sheet" msgid="7573152094250666567">"Tabelle schließen"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ungültige Eingabe"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-el/strings.xml b/compose/ui/ui/src/androidMain/res/values-el/strings.xml
index 82bc0b2..8e983781 100644
--- a/compose/ui/ui/src/androidMain/res/values-el/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-el/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Σε εξέλιξη"</string>
<string name="tab" msgid="1672349317127674378">"Καρτέλα"</string>
<string name="navigation_menu" msgid="542007171693138492">"Μενού πλοήγησης"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Αναπτυσσόμενο μενού"</string>
<string name="close_drawer" msgid="406453423630273620">"Κλείσιμο του μενού πλοήγησης"</string>
<string name="close_sheet" msgid="7573152094250666567">"Κλείσιμο φύλλου"</string>
<string name="default_error_message" msgid="8038256446254964252">"Μη έγκυρη καταχώριση"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml
index cfaa99d..355cf42 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rAU/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In progress"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigation menu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Drop-down menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Close navigation menu"</string>
<string name="close_sheet" msgid="7573152094250666567">"Close sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Invalid input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml
index cfaa99d..355cf42 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rCA/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In progress"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigation menu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Drop-down menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Close navigation menu"</string>
<string name="close_sheet" msgid="7573152094250666567">"Close sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Invalid input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml
index cfaa99d..355cf42 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rGB/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In progress"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigation menu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Drop-down menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Close navigation menu"</string>
<string name="close_sheet" msgid="7573152094250666567">"Close sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Invalid input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml
index cfaa99d..355cf42 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rIN/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In progress"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigation menu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Drop-down menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Close navigation menu"</string>
<string name="close_sheet" msgid="7573152094250666567">"Close sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Invalid input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml b/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml
index 0d38b3a..8928d90 100644
--- a/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-en-rXC/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In progress"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigation menu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Dropdown menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Close navigation menu"</string>
<string name="close_sheet" msgid="7573152094250666567">"Close sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Invalid input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml b/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml
index 2dd8dfe..028edb8 100644
--- a/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-es-rUS/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"En curso"</string>
<string name="tab" msgid="1672349317127674378">"Pestaña"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menú de navegación"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menú desplegable"</string>
<string name="close_drawer" msgid="406453423630273620">"Cerrar el menú de navegación"</string>
<string name="close_sheet" msgid="7573152094250666567">"Cerrar hoja"</string>
<string name="default_error_message" msgid="8038256446254964252">"Entrada no válida"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-es/strings.xml b/compose/ui/ui/src/androidMain/res/values-es/strings.xml
index 087d3cc..e5750e8 100644
--- a/compose/ui/ui/src/androidMain/res/values-es/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-es/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"En curso"</string>
<string name="tab" msgid="1672349317127674378">"Pestaña"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menú de navegación"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menú desplegable"</string>
<string name="close_drawer" msgid="406453423630273620">"Cerrar menú de navegación"</string>
<string name="close_sheet" msgid="7573152094250666567">"Cerrar hoja"</string>
<string name="default_error_message" msgid="8038256446254964252">"Entrada no válida"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-et/strings.xml b/compose/ui/ui/src/androidMain/res/values-et/strings.xml
index 914fddf..d046205 100644
--- a/compose/ui/ui/src/androidMain/res/values-et/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-et/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Pooleli"</string>
<string name="tab" msgid="1672349317127674378">"Vaheleht"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigeerimismenüü"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Rippmenüü"</string>
<string name="close_drawer" msgid="406453423630273620">"Sule navigeerimismenüü"</string>
<string name="close_sheet" msgid="7573152094250666567">"Sule leht"</string>
<string name="default_error_message" msgid="8038256446254964252">"Sobimatu sisend"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-eu/strings.xml b/compose/ui/ui/src/androidMain/res/values-eu/strings.xml
index 26831b1..20cfc12 100644
--- a/compose/ui/ui/src/androidMain/res/values-eu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-eu/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Abian"</string>
<string name="tab" msgid="1672349317127674378">"Fitxa"</string>
<string name="navigation_menu" msgid="542007171693138492">"Nabigazio-menua"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Goitibeherako menua"</string>
<string name="close_drawer" msgid="406453423630273620">"Itxi nabigazio-menua"</string>
<string name="close_sheet" msgid="7573152094250666567">"Itxi orria"</string>
<string name="default_error_message" msgid="8038256446254964252">"Sarrerak ez du balio"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fa/strings.xml b/compose/ui/ui/src/androidMain/res/values-fa/strings.xml
index 6b61c8f..0443911 100644
--- a/compose/ui/ui/src/androidMain/res/values-fa/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fa/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"درحال انجام"</string>
<string name="tab" msgid="1672349317127674378">"برگه"</string>
<string name="navigation_menu" msgid="542007171693138492">"منوی پیمایش"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"منوی کرکرهای"</string>
<string name="close_drawer" msgid="406453423630273620">"بستن منوی پیمایش"</string>
<string name="close_sheet" msgid="7573152094250666567">"بستن برگ"</string>
<string name="default_error_message" msgid="8038256446254964252">"ورودی نامعتبر"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fi/strings.xml b/compose/ui/ui/src/androidMain/res/values-fi/strings.xml
index 0d1f721..e8b883e 100644
--- a/compose/ui/ui/src/androidMain/res/values-fi/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fi/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Kesken"</string>
<string name="tab" msgid="1672349317127674378">"Välilehti"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigointivalikko"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Avattava valikko"</string>
<string name="close_drawer" msgid="406453423630273620">"Sulje navigointivalikko"</string>
<string name="close_sheet" msgid="7573152094250666567">"Sulje taulukko"</string>
<string name="default_error_message" msgid="8038256446254964252">"Virheellinen syöte"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml b/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml
index d8077f0..49a9c32 100644
--- a/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fr-rCA/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"En cours…"</string>
<string name="tab" msgid="1672349317127674378">"Onglet"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu de navigation"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu déroulant"</string>
<string name="close_drawer" msgid="406453423630273620">"Fermer le menu de navigation"</string>
<string name="close_sheet" msgid="7573152094250666567">"Fermer la feuille"</string>
<string name="default_error_message" msgid="8038256446254964252">"Entrée incorrecte"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-fr/strings.xml b/compose/ui/ui/src/androidMain/res/values-fr/strings.xml
index 4754c50..fe75531 100644
--- a/compose/ui/ui/src/androidMain/res/values-fr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-fr/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"En cours"</string>
<string name="tab" msgid="1672349317127674378">"Onglet"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu de navigation"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu déroulant"</string>
<string name="close_drawer" msgid="406453423630273620">"Fermer le menu de navigation"</string>
<string name="close_sheet" msgid="7573152094250666567">"Fermer la feuille"</string>
<string name="default_error_message" msgid="8038256446254964252">"Données incorrectes"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-gl/strings.xml b/compose/ui/ui/src/androidMain/res/values-gl/strings.xml
index bf71de5..26136fc 100644
--- a/compose/ui/ui/src/androidMain/res/values-gl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-gl/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"En curso"</string>
<string name="tab" msgid="1672349317127674378">"Tabulador"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menú de navegación"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menú despregable"</string>
<string name="close_drawer" msgid="406453423630273620">"Pechar menú de navegación"</string>
<string name="close_sheet" msgid="7573152094250666567">"Pechar folla"</string>
<string name="default_error_message" msgid="8038256446254964252">"O texto escrito non é válido"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-gu/strings.xml b/compose/ui/ui/src/androidMain/res/values-gu/strings.xml
index 0c778bc..1143395 100644
--- a/compose/ui/ui/src/androidMain/res/values-gu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-gu/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"પ્રક્રિયામાં છે"</string>
<string name="tab" msgid="1672349317127674378">"ટૅબ"</string>
<string name="navigation_menu" msgid="542007171693138492">"નૅવિગેશન મેનૂ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ડ્રૉપડાઉન મેનૂ"</string>
<string name="close_drawer" msgid="406453423630273620">"નૅવિગેશન મેનૂ બંધ કરો"</string>
<string name="close_sheet" msgid="7573152094250666567">"શીટ બંધ કરો"</string>
<string name="default_error_message" msgid="8038256446254964252">"અમાન્ય ઇનપુટ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hi/strings.xml b/compose/ui/ui/src/androidMain/res/values-hi/strings.xml
index 0c5e25c..392d090 100644
--- a/compose/ui/ui/src/androidMain/res/values-hi/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hi/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"जारी है"</string>
<string name="tab" msgid="1672349317127674378">"टैब"</string>
<string name="navigation_menu" msgid="542007171693138492">"नेविगेशन मेन्यू"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ड्रॉपडाउन मेन्यू"</string>
<string name="close_drawer" msgid="406453423630273620">"नेविगेशन मेन्यू बंद करें"</string>
<string name="close_sheet" msgid="7573152094250666567">"शीट बंद करें"</string>
<string name="default_error_message" msgid="8038256446254964252">"अमान्य इनपुट"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hr/strings.xml b/compose/ui/ui/src/androidMain/res/values-hr/strings.xml
index 2c68af7..83392fe 100644
--- a/compose/ui/ui/src/androidMain/res/values-hr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hr/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"U tijeku"</string>
<string name="tab" msgid="1672349317127674378">"Kartica"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigacijski izbornik"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Padajući izbornik"</string>
<string name="close_drawer" msgid="406453423630273620">"Zatvaranje izbornika za navigaciju"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zatvaranje lista"</string>
<string name="default_error_message" msgid="8038256446254964252">"Nevažeći unos"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hu/strings.xml b/compose/ui/ui/src/androidMain/res/values-hu/strings.xml
index 4352718..fafa341 100644
--- a/compose/ui/ui/src/androidMain/res/values-hu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hu/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Folyamatban"</string>
<string name="tab" msgid="1672349317127674378">"Lap"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigációs menü"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Legördülő menü"</string>
<string name="close_drawer" msgid="406453423630273620">"Navigációs menü bezárása"</string>
<string name="close_sheet" msgid="7573152094250666567">"Munkalap bezárása"</string>
<string name="default_error_message" msgid="8038256446254964252">"Érvénytelen adat"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-hy/strings.xml b/compose/ui/ui/src/androidMain/res/values-hy/strings.xml
index 3271a19..01ed1d9 100644
--- a/compose/ui/ui/src/androidMain/res/values-hy/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-hy/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Ընթացքում է"</string>
<string name="tab" msgid="1672349317127674378">"Ներդիր"</string>
<string name="navigation_menu" msgid="542007171693138492">"Նավիգացիայի ընտրացանկ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Իջնող ցանկ"</string>
<string name="close_drawer" msgid="406453423630273620">"Փակել նավիգացիայի ընտրացանկը"</string>
<string name="close_sheet" msgid="7573152094250666567">"Փակել թերթը"</string>
<string name="default_error_message" msgid="8038256446254964252">"Սխալ ներածում"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-in/strings.xml b/compose/ui/ui/src/androidMain/res/values-in/strings.xml
index fdd9d85..77b0d18 100644
--- a/compose/ui/ui/src/androidMain/res/values-in/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-in/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Dalam proses"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu navigasi"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu dropdown"</string>
<string name="close_drawer" msgid="406453423630273620">"Tutup menu navigasi"</string>
<string name="close_sheet" msgid="7573152094250666567">"Tutup sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Input tidak valid"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-is/strings.xml b/compose/ui/ui/src/androidMain/res/values-is/strings.xml
index a800efc..a7b42c8 100644
--- a/compose/ui/ui/src/androidMain/res/values-is/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-is/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Í vinnslu"</string>
<string name="tab" msgid="1672349317127674378">"Flipi"</string>
<string name="navigation_menu" msgid="542007171693138492">"Yfirlitsvalmynd"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Fellivalmynd"</string>
<string name="close_drawer" msgid="406453423630273620">"Loka yfirlitsvalmynd"</string>
<string name="close_sheet" msgid="7573152094250666567">"Loka blaði"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ógildur innsláttur"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-it/strings.xml b/compose/ui/ui/src/androidMain/res/values-it/strings.xml
index 9b330f6e..6c4ade3 100644
--- a/compose/ui/ui/src/androidMain/res/values-it/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-it/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"In corso"</string>
<string name="tab" msgid="1672349317127674378">"Scheda"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu di navigazione"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu a discesa"</string>
<string name="close_drawer" msgid="406453423630273620">"Chiudi il menu di navigazione"</string>
<string name="close_sheet" msgid="7573152094250666567">"Chiudi il foglio"</string>
<string name="default_error_message" msgid="8038256446254964252">"Valore non valido"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-iw/strings.xml b/compose/ui/ui/src/androidMain/res/values-iw/strings.xml
index 0e573ad..cba7e5a 100644
--- a/compose/ui/ui/src/androidMain/res/values-iw/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-iw/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"בתהליך"</string>
<string name="tab" msgid="1672349317127674378">"מקש Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"תפריט הניווט"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"תפריט נפתח"</string>
<string name="close_drawer" msgid="406453423630273620">"סגירת תפריט הניווט"</string>
<string name="close_sheet" msgid="7573152094250666567">"סגירת הגיליון"</string>
<string name="default_error_message" msgid="8038256446254964252">"הקלט לא תקין"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ja/strings.xml b/compose/ui/ui/src/androidMain/res/values-ja/strings.xml
index 466b58a7..1aa4d25 100644
--- a/compose/ui/ui/src/androidMain/res/values-ja/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ja/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"処理しています"</string>
<string name="tab" msgid="1672349317127674378">"タブ"</string>
<string name="navigation_menu" msgid="542007171693138492">"ナビゲーションメニュー"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"プルダウン メニュー"</string>
<string name="close_drawer" msgid="406453423630273620">"ナビゲーションメニューを閉じる"</string>
<string name="close_sheet" msgid="7573152094250666567">"シートを閉じる"</string>
<string name="default_error_message" msgid="8038256446254964252">"入力値が無効です"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ka/strings.xml b/compose/ui/ui/src/androidMain/res/values-ka/strings.xml
index 9d1d1c9..86c9859 100644
--- a/compose/ui/ui/src/androidMain/res/values-ka/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ka/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"მუშავდება"</string>
<string name="tab" msgid="1672349317127674378">"ჩანართი"</string>
<string name="navigation_menu" msgid="542007171693138492">"ნავიგაციის მენიუ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ჩამოსაშლელი მენიუ"</string>
<string name="close_drawer" msgid="406453423630273620">"ნავიგაციის მენიუს დახურვა"</string>
<string name="close_sheet" msgid="7573152094250666567">"ფურცლის დახურვა"</string>
<string name="default_error_message" msgid="8038256446254964252">"შენატანი არასწორია"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-kk/strings.xml b/compose/ui/ui/src/androidMain/res/values-kk/strings.xml
index 2fe727d..2f4e653 100644
--- a/compose/ui/ui/src/androidMain/res/values-kk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-kk/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Орындалуда"</string>
<string name="tab" msgid="1672349317127674378">"Қойынды"</string>
<string name="navigation_menu" msgid="542007171693138492">"Навигация мәзірі"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Ашылмалы мәзір"</string>
<string name="close_drawer" msgid="406453423630273620">"Навигация мәзірін жабу"</string>
<string name="close_sheet" msgid="7573152094250666567">"Парақты жабу"</string>
<string name="default_error_message" msgid="8038256446254964252">"Енгізілген мән жарамсыз."</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-km/strings.xml b/compose/ui/ui/src/androidMain/res/values-km/strings.xml
index 3130bd6..a3c89f7 100644
--- a/compose/ui/ui/src/androidMain/res/values-km/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-km/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"កំពុងដំណើរការ"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"ម៉ឺនុយរុករក"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ម៉ឺនុយធ្លាក់ចុះ"</string>
<string name="close_drawer" msgid="406453423630273620">"បិទម៉ឺនុយរុករក"</string>
<string name="close_sheet" msgid="7573152094250666567">"បិទសន្លឹក"</string>
<string name="default_error_message" msgid="8038256446254964252">"ការបញ្ចូលមិនត្រឹមត្រូវ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-kn/strings.xml b/compose/ui/ui/src/androidMain/res/values-kn/strings.xml
index eacd0cc..0199e8f 100644
--- a/compose/ui/ui/src/androidMain/res/values-kn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-kn/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ಪ್ರಗತಿಯಲ್ಲಿದೆ"</string>
<string name="tab" msgid="1672349317127674378">"ಟ್ಯಾಬ್"</string>
<string name="navigation_menu" msgid="542007171693138492">"ನ್ಯಾವಿಗೇಶನ್ ಮೆನು"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ಡ್ರಾಪ್ಡೌನ್ ಮೆನು"</string>
<string name="close_drawer" msgid="406453423630273620">"ನ್ಯಾವಿಗೇಷನ್ ಮೆನು ಮುಚ್ಚಿರಿ"</string>
<string name="close_sheet" msgid="7573152094250666567">"ಶೀಟ್ ಮುಚ್ಚಿರಿ"</string>
<string name="default_error_message" msgid="8038256446254964252">"ಅಮಾನ್ಯ ಇನ್ಪುಟ್"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ko/strings.xml b/compose/ui/ui/src/androidMain/res/values-ko/strings.xml
index 169dc0f..31555c3 100644
--- a/compose/ui/ui/src/androidMain/res/values-ko/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ko/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"진행 중"</string>
<string name="tab" msgid="1672349317127674378">"탭"</string>
<string name="navigation_menu" msgid="542007171693138492">"탐색 메뉴"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"드롭다운 메뉴"</string>
<string name="close_drawer" msgid="406453423630273620">"탐색 메뉴 닫기"</string>
<string name="close_sheet" msgid="7573152094250666567">"시트 닫기"</string>
<string name="default_error_message" msgid="8038256446254964252">"입력이 잘못됨"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ky/strings.xml b/compose/ui/ui/src/androidMain/res/values-ky/strings.xml
index 9df8ec3..5dd0b50 100644
--- a/compose/ui/ui/src/androidMain/res/values-ky/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ky/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Аткарылууда"</string>
<string name="tab" msgid="1672349317127674378">"Өтмөк"</string>
<string name="navigation_menu" msgid="542007171693138492">"Чабыттоо менюсу"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Түрүлмө меню"</string>
<string name="close_drawer" msgid="406453423630273620">"Чабыттоо менюсун жабуу"</string>
<string name="close_sheet" msgid="7573152094250666567">"Баракты жабуу"</string>
<string name="default_error_message" msgid="8038256446254964252">"Киргизилген маалымат жараксыз"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-lo/strings.xml b/compose/ui/ui/src/androidMain/res/values-lo/strings.xml
index 61ff110..05d6f84 100644
--- a/compose/ui/ui/src/androidMain/res/values-lo/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-lo/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ກຳລັງດຳເນີນການ"</string>
<string name="tab" msgid="1672349317127674378">"ແຖບ"</string>
<string name="navigation_menu" msgid="542007171693138492">"ເມນູການນຳທາງ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ເມນູແບບເລື່ອນລົງ"</string>
<string name="close_drawer" msgid="406453423630273620">"ປິດເມນູການນຳທາງ"</string>
<string name="close_sheet" msgid="7573152094250666567">"ປິດຊີດ"</string>
<string name="default_error_message" msgid="8038256446254964252">"ຂໍ້ມູນທີ່ປ້ອນເຂົ້າບໍ່ຖືກຕ້ອງ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-lt/strings.xml b/compose/ui/ui/src/androidMain/res/values-lt/strings.xml
index f9784df..2514594 100644
--- a/compose/ui/ui/src/androidMain/res/values-lt/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-lt/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Vyksta"</string>
<string name="tab" msgid="1672349317127674378">"Tabuliavimo klavišas"</string>
<string name="navigation_menu" msgid="542007171693138492">"Naršymo meniu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Išskleidžiamasis meniu"</string>
<string name="close_drawer" msgid="406453423630273620">"Uždaryti naršymo meniu"</string>
<string name="close_sheet" msgid="7573152094250666567">"Uždaryti lapą"</string>
<string name="default_error_message" msgid="8038256446254964252">"Netinkama įvestis"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-lv/strings.xml b/compose/ui/ui/src/androidMain/res/values-lv/strings.xml
index f4fbef3..6c928be 100644
--- a/compose/ui/ui/src/androidMain/res/values-lv/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-lv/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Notiek apstrāde"</string>
<string name="tab" msgid="1672349317127674378">"Cilne"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigācijas izvēlne"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Nolaižamā izvēlne"</string>
<string name="close_drawer" msgid="406453423630273620">"Aizvērt navigācijas izvēlni"</string>
<string name="close_sheet" msgid="7573152094250666567">"Aizvērt izklājlapu"</string>
<string name="default_error_message" msgid="8038256446254964252">"Nederīga ievade"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-mk/strings.xml b/compose/ui/ui/src/androidMain/res/values-mk/strings.xml
index 45b005f..838261e 100644
--- a/compose/ui/ui/src/androidMain/res/values-mk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-mk/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Во тек"</string>
<string name="tab" msgid="1672349317127674378">"Картичка"</string>
<string name="navigation_menu" msgid="542007171693138492">"Мени за навигација"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Паѓачко мени"</string>
<string name="close_drawer" msgid="406453423630273620">"Затворете го менито за навигација"</string>
<string name="close_sheet" msgid="7573152094250666567">"Затворете го листот"</string>
<string name="default_error_message" msgid="8038256446254964252">"Неважечки запис"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ml/strings.xml b/compose/ui/ui/src/androidMain/res/values-ml/strings.xml
index 9c38df2..2a1c7f9 100644
--- a/compose/ui/ui/src/androidMain/res/values-ml/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ml/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"പുരോഗമിക്കുന്നു"</string>
<string name="tab" msgid="1672349317127674378">"ടാബ്"</string>
<string name="navigation_menu" msgid="542007171693138492">"നാവിഗേഷൻ മെനു"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ഡ്രോപ്പ്ഡൗൺ മെനു"</string>
<string name="close_drawer" msgid="406453423630273620">"നാവിഗേഷൻ മെനു അടയ്ക്കുക"</string>
<string name="close_sheet" msgid="7573152094250666567">"ഷീറ്റ് അടയ്ക്കുക"</string>
<string name="default_error_message" msgid="8038256446254964252">"ഇൻപുട്ട് അസാധുവാണ്"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-mn/strings.xml b/compose/ui/ui/src/androidMain/res/values-mn/strings.xml
index ae3aaeb..ddbcfc3 100644
--- a/compose/ui/ui/src/androidMain/res/values-mn/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-mn/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Үргэлжилж байна"</string>
<string name="tab" msgid="1672349317127674378">"Таб"</string>
<string name="navigation_menu" msgid="542007171693138492">"Навигацын цэс"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Унадаг цэс"</string>
<string name="close_drawer" msgid="406453423630273620">"Навигацын цэсийг хаах"</string>
<string name="close_sheet" msgid="7573152094250666567">"Хүснэгтийг хаах"</string>
<string name="default_error_message" msgid="8038256446254964252">"Буруу оролт"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-mr/strings.xml b/compose/ui/ui/src/androidMain/res/values-mr/strings.xml
index 4c8fc27a..53de7d5 100644
--- a/compose/ui/ui/src/androidMain/res/values-mr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-mr/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"प्रगतीपथावर आहे"</string>
<string name="tab" msgid="1672349317127674378">"टॅब"</string>
<string name="navigation_menu" msgid="542007171693138492">"नेव्हिगेशन मेनू"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ड्रॉपडाउन मेनू"</string>
<string name="close_drawer" msgid="406453423630273620">"नेव्हिगेशन मेनू बंद करा"</string>
<string name="close_sheet" msgid="7573152094250666567">"शीट बंद करा"</string>
<string name="default_error_message" msgid="8038256446254964252">"इनपुट चुकीचे आहे"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ms/strings.xml b/compose/ui/ui/src/androidMain/res/values-ms/strings.xml
index 2d23d7e..cd366df 100644
--- a/compose/ui/ui/src/androidMain/res/values-ms/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ms/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Dalam proses"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu navigasi"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu lungsur"</string>
<string name="close_drawer" msgid="406453423630273620">"Tutup menu navigasi"</string>
<string name="close_sheet" msgid="7573152094250666567">"Tutup helaian"</string>
<string name="default_error_message" msgid="8038256446254964252">"Input tidak sah"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-my/strings.xml b/compose/ui/ui/src/androidMain/res/values-my/strings.xml
index 33d95ba..f866ebb 100644
--- a/compose/ui/ui/src/androidMain/res/values-my/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-my/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ဆောင်ရွက်နေဆဲ"</string>
<string name="tab" msgid="1672349317127674378">"တဘ်"</string>
<string name="navigation_menu" msgid="542007171693138492">"လမ်းညွှန် မီနူး"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ဆွဲချမီနူး"</string>
<string name="close_drawer" msgid="406453423630273620">"လမ်းညွှန် မီနူး ပိတ်ရန်"</string>
<string name="close_sheet" msgid="7573152094250666567">"စာမျက်နှာ ပိတ်ရန်"</string>
<string name="default_error_message" msgid="8038256446254964252">"ထည့်သွင်းမှု မမှန်ကန်ပါ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-nb/strings.xml b/compose/ui/ui/src/androidMain/res/values-nb/strings.xml
index f0ce844..b1c526c 100644
--- a/compose/ui/ui/src/androidMain/res/values-nb/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-nb/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Pågår"</string>
<string name="tab" msgid="1672349317127674378">"Fane"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigasjonsmeny"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Rullegardinmeny"</string>
<string name="close_drawer" msgid="406453423630273620">"Lukk navigasjonsmenyen"</string>
<string name="close_sheet" msgid="7573152094250666567">"Lukk arket"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ugyldige inndata"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ne/strings.xml b/compose/ui/ui/src/androidMain/res/values-ne/strings.xml
index f9efb22..94c0dea 100644
--- a/compose/ui/ui/src/androidMain/res/values-ne/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ne/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"काम हुँदै छ"</string>
<string name="tab" msgid="1672349317127674378">"ट्याब"</string>
<string name="navigation_menu" msgid="542007171693138492">"नेभिगेसन मेनु"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ड्रपडाउन मेनु"</string>
<string name="close_drawer" msgid="406453423630273620">"नेभिगेसन मेनु बन्द गर्नुहोस्"</string>
<string name="close_sheet" msgid="7573152094250666567">"पाना बन्द गर्नुहोस्"</string>
<string name="default_error_message" msgid="8038256446254964252">"अवैद्य इन्पुट"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-nl/strings.xml b/compose/ui/ui/src/androidMain/res/values-nl/strings.xml
index 01cdc95..46b14c4 100644
--- a/compose/ui/ui/src/androidMain/res/values-nl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-nl/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Bezig"</string>
<string name="tab" msgid="1672349317127674378">"Tabblad"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigatiemenu"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Dropdownmenu"</string>
<string name="close_drawer" msgid="406453423630273620">"Navigatiemenu sluiten"</string>
<string name="close_sheet" msgid="7573152094250666567">"Blad sluiten"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ongeldige invoer"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-or/strings.xml b/compose/ui/ui/src/androidMain/res/values-or/strings.xml
index b313945..7ccc125 100644
--- a/compose/ui/ui/src/androidMain/res/values-or/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-or/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ଚାଲିଛି"</string>
<string name="tab" msgid="1672349317127674378">"ଟାବ୍"</string>
<string name="navigation_menu" msgid="542007171693138492">"ନାଭିଗେସନ୍ ମେନୁ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ଡ୍ରପଡାଉନ ମେନୁ"</string>
<string name="close_drawer" msgid="406453423630273620">"ନାଭିଗେସନ୍ ମେନୁ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="close_sheet" msgid="7573152094250666567">"ସିଟ୍ ବନ୍ଦ କରନ୍ତୁ"</string>
<string name="default_error_message" msgid="8038256446254964252">"ଅବୈଧ ଇନପୁଟ୍"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pa/strings.xml b/compose/ui/ui/src/androidMain/res/values-pa/strings.xml
index 90d2ad1..09d94be 100644
--- a/compose/ui/ui/src/androidMain/res/values-pa/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pa/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ਜਾਰੀ ਹੈ"</string>
<string name="tab" msgid="1672349317127674378">"ਟੈਬ"</string>
<string name="navigation_menu" msgid="542007171693138492">"ਨੈਵੀਗੇਸ਼ਨ ਮੀਨੂ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ਡ੍ਰੌਪ-ਡਾਊਨ ਮੀਨੂ"</string>
<string name="close_drawer" msgid="406453423630273620">"ਨੈਵੀਗੇਸ਼ਨ ਮੀਨੂ ਬੰਦ ਕਰੋ"</string>
<string name="close_sheet" msgid="7573152094250666567">"ਸ਼ੀਟ ਬੰਦ ਕਰੋ"</string>
<string name="default_error_message" msgid="8038256446254964252">"ਅਵੈਧ ਇਨਪੁੱਟ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pl/strings.xml b/compose/ui/ui/src/androidMain/res/values-pl/strings.xml
index 6331054..a533009 100644
--- a/compose/ui/ui/src/androidMain/res/values-pl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pl/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"W toku"</string>
<string name="tab" msgid="1672349317127674378">"Karta"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu nawigacyjne"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Zamknij menu nawigacyjne"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zamknij arkusz"</string>
<string name="default_error_message" msgid="8038256446254964252">"Nieprawidłowe dane wejściowe"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml b/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml
index a2a2a92..c60184a 100644
--- a/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pt-rBR/strings.xml
@@ -28,6 +28,7 @@
<string name="in_progress" msgid="6827826412747255547">"Em andamento"</string>
<string name="tab" msgid="1672349317127674378">"Guia"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu de navegação"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu suspenso"</string>
<string name="close_drawer" msgid="406453423630273620">"Fechar menu de navegação"</string>
<string name="close_sheet" msgid="7573152094250666567">"Fechar planilha"</string>
<string name="default_error_message" msgid="8038256446254964252">"Entrada inválida"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml b/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml
index ffb2fc5..d3de6809 100644
--- a/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pt-rPT/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Em curso"</string>
<string name="tab" msgid="1672349317127674378">"Separador"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu de navegação"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu pendente"</string>
<string name="close_drawer" msgid="406453423630273620">"Fechar menu de navegação"</string>
<string name="close_sheet" msgid="7573152094250666567">"Fechar folha"</string>
<string name="default_error_message" msgid="8038256446254964252">"Entrada inválida"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-pt/strings.xml b/compose/ui/ui/src/androidMain/res/values-pt/strings.xml
index a2a2a92..c60184a 100644
--- a/compose/ui/ui/src/androidMain/res/values-pt/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-pt/strings.xml
@@ -28,6 +28,7 @@
<string name="in_progress" msgid="6827826412747255547">"Em andamento"</string>
<string name="tab" msgid="1672349317127674378">"Guia"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu de navegação"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menu suspenso"</string>
<string name="close_drawer" msgid="406453423630273620">"Fechar menu de navegação"</string>
<string name="close_sheet" msgid="7573152094250666567">"Fechar planilha"</string>
<string name="default_error_message" msgid="8038256446254964252">"Entrada inválida"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ro/strings.xml b/compose/ui/ui/src/androidMain/res/values-ro/strings.xml
index 6be9d06..515d0ed 100644
--- a/compose/ui/ui/src/androidMain/res/values-ro/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ro/strings.xml
@@ -28,6 +28,7 @@
<string name="in_progress" msgid="6827826412747255547">"În curs"</string>
<string name="tab" msgid="1672349317127674378">"Filă"</string>
<string name="navigation_menu" msgid="542007171693138492">"Meniu de navigare"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Meniu drop-down"</string>
<string name="close_drawer" msgid="406453423630273620">"Închideți meniul de navigare"</string>
<string name="close_sheet" msgid="7573152094250666567">"Închideți foaia"</string>
<string name="default_error_message" msgid="8038256446254964252">"Intrare nevalidă"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ru/strings.xml b/compose/ui/ui/src/androidMain/res/values-ru/strings.xml
index 14ae6fe..1b63a6e 100644
--- a/compose/ui/ui/src/androidMain/res/values-ru/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ru/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Выполняется"</string>
<string name="tab" msgid="1672349317127674378">"Вкладка"</string>
<string name="navigation_menu" msgid="542007171693138492">"Меню навигации"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Раскрывающееся меню"</string>
<string name="close_drawer" msgid="406453423630273620">"Закрыть меню навигации"</string>
<string name="close_sheet" msgid="7573152094250666567">"Закрыть лист"</string>
<string name="default_error_message" msgid="8038256446254964252">"Неправильный ввод"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-si/strings.xml b/compose/ui/ui/src/androidMain/res/values-si/strings.xml
index bc373a8..5dfc85b 100644
--- a/compose/ui/ui/src/androidMain/res/values-si/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-si/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ප්රගතියේ පවතී"</string>
<string name="tab" msgid="1672349317127674378">"ටැබය"</string>
<string name="navigation_menu" msgid="542007171693138492">"සංචාලන මෙනුව"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"පතන මෙනුව"</string>
<string name="close_drawer" msgid="406453423630273620">"සංචාලන මෙනුව වසන්න"</string>
<string name="close_sheet" msgid="7573152094250666567">"පත්රය වසන්න"</string>
<string name="default_error_message" msgid="8038256446254964252">"වලංගු නොවන ආදානයකි"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sk/strings.xml b/compose/ui/ui/src/androidMain/res/values-sk/strings.xml
index 4bef33a..85eaf05 100644
--- a/compose/ui/ui/src/androidMain/res/values-sk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sk/strings.xml
@@ -28,6 +28,7 @@
<string name="in_progress" msgid="6827826412747255547">"Prebieha"</string>
<string name="tab" msgid="1672349317127674378">"Karta"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigačná ponuka"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Rozbaľovacia ponuka"</string>
<string name="close_drawer" msgid="406453423630273620">"Zavrieť navigačnú ponuku"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zavrieť hárok"</string>
<string name="default_error_message" msgid="8038256446254964252">"Neplatný vstup"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sl/strings.xml b/compose/ui/ui/src/androidMain/res/values-sl/strings.xml
index dffec92..dae269f 100644
--- a/compose/ui/ui/src/androidMain/res/values-sl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sl/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Poteka"</string>
<string name="tab" msgid="1672349317127674378">"Zavihek"</string>
<string name="navigation_menu" msgid="542007171693138492">"Meni za krmarjenje"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Spustni meni"</string>
<string name="close_drawer" msgid="406453423630273620">"Zapri meni za krmarjenje"</string>
<string name="close_sheet" msgid="7573152094250666567">"Zapri list"</string>
<string name="default_error_message" msgid="8038256446254964252">"Neveljaven vnos"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sq/strings.xml b/compose/ui/ui/src/androidMain/res/values-sq/strings.xml
index a148b38..f6ab8dd9a 100644
--- a/compose/ui/ui/src/androidMain/res/values-sq/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sq/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Në vazhdim"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menyja e navigimit"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menyja me lëshim poshtë"</string>
<string name="close_drawer" msgid="406453423630273620">"Mbyll menynë e navigimit"</string>
<string name="close_sheet" msgid="7573152094250666567">"Mbyll fletën"</string>
<string name="default_error_message" msgid="8038256446254964252">"Hyrje e pavlefshme"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sr/strings.xml b/compose/ui/ui/src/androidMain/res/values-sr/strings.xml
index ff69341..aa693dc 100644
--- a/compose/ui/ui/src/androidMain/res/values-sr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sr/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"У току"</string>
<string name="tab" msgid="1672349317127674378">"Картица"</string>
<string name="navigation_menu" msgid="542007171693138492">"Мени за навигацију"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Падајући мени"</string>
<string name="close_drawer" msgid="406453423630273620">"Затвори мени за навигацију"</string>
<string name="close_sheet" msgid="7573152094250666567">"Затворите табелу"</string>
<string name="default_error_message" msgid="8038256446254964252">"Унос је неважећи"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sv/strings.xml b/compose/ui/ui/src/androidMain/res/values-sv/strings.xml
index e5e948a..68542b9 100644
--- a/compose/ui/ui/src/androidMain/res/values-sv/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sv/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Pågår"</string>
<string name="tab" msgid="1672349317127674378">"Flik"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigeringsmeny"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Rullgardinsmeny"</string>
<string name="close_drawer" msgid="406453423630273620">"Stäng navigeringsmenyn"</string>
<string name="close_sheet" msgid="7573152094250666567">"Stäng kalkylarket"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ogiltiga indata"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-sw/strings.xml b/compose/ui/ui/src/androidMain/res/values-sw/strings.xml
index ee82679..a48ceb0 100644
--- a/compose/ui/ui/src/androidMain/res/values-sw/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-sw/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Inaendelea"</string>
<string name="tab" msgid="1672349317127674378">"Kichupo"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menyu ya kusogeza"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Menyu kunjuzi"</string>
<string name="close_drawer" msgid="406453423630273620">"Funga menyu ya kusogeza"</string>
<string name="close_sheet" msgid="7573152094250666567">"Funga laha"</string>
<string name="default_error_message" msgid="8038256446254964252">"Ulichoweka si sahihi"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ta/strings.xml b/compose/ui/ui/src/androidMain/res/values-ta/strings.xml
index 1bb5fe5..9bfb9a1 100644
--- a/compose/ui/ui/src/androidMain/res/values-ta/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ta/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"செயலிலுள்ளது"</string>
<string name="tab" msgid="1672349317127674378">"பிரிவு"</string>
<string name="navigation_menu" msgid="542007171693138492">"வழிசெலுத்தல் மெனு"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"கீழ்த்தோன்றல் மெனு"</string>
<string name="close_drawer" msgid="406453423630273620">"வழிசெலுத்தல் மெனுவை மூடும்"</string>
<string name="close_sheet" msgid="7573152094250666567">"ஷீட்டை மூடும்"</string>
<string name="default_error_message" msgid="8038256446254964252">"தவறான உள்ளீடு"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-te/strings.xml b/compose/ui/ui/src/androidMain/res/values-te/strings.xml
index ee67508..4a39a93 100644
--- a/compose/ui/ui/src/androidMain/res/values-te/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-te/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"ప్రోగ్రెస్లో ఉంది"</string>
<string name="tab" msgid="1672349317127674378">"ట్యాబ్"</string>
<string name="navigation_menu" msgid="542007171693138492">"నావిగేషన్ మెనూ"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"డ్రాప్డౌన్ మెనూ"</string>
<string name="close_drawer" msgid="406453423630273620">"నావిగేషన్ మెనూను మూసివేయి"</string>
<string name="close_sheet" msgid="7573152094250666567">"షీట్ను మూసివేయి"</string>
<string name="default_error_message" msgid="8038256446254964252">"ఇన్పుట్ చెల్లదు"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-th/strings.xml b/compose/ui/ui/src/androidMain/res/values-th/strings.xml
index e158f0c..164c459 100644
--- a/compose/ui/ui/src/androidMain/res/values-th/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-th/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"กำลังดำเนินการ"</string>
<string name="tab" msgid="1672349317127674378">"แท็บ"</string>
<string name="navigation_menu" msgid="542007171693138492">"เมนูการนำทาง"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"เมนูแบบเลื่อนลง"</string>
<string name="close_drawer" msgid="406453423630273620">"ปิดเมนูการนำทาง"</string>
<string name="close_sheet" msgid="7573152094250666567">"ปิดชีต"</string>
<string name="default_error_message" msgid="8038256446254964252">"อินพุตไม่ถูกต้อง"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-tl/strings.xml b/compose/ui/ui/src/androidMain/res/values-tl/strings.xml
index 9cbbace5..09789e4 100644
--- a/compose/ui/ui/src/androidMain/res/values-tl/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-tl/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Isinasagawa"</string>
<string name="tab" msgid="1672349317127674378">"Tab"</string>
<string name="navigation_menu" msgid="542007171693138492">"Menu ng navigation"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Drop-down na menu"</string>
<string name="close_drawer" msgid="406453423630273620">"Isara ang menu ng navigation"</string>
<string name="close_sheet" msgid="7573152094250666567">"Isara ang sheet"</string>
<string name="default_error_message" msgid="8038256446254964252">"Invalid na input"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-tr/strings.xml b/compose/ui/ui/src/androidMain/res/values-tr/strings.xml
index f088899..6a0a351 100644
--- a/compose/ui/ui/src/androidMain/res/values-tr/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-tr/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Devam ediyor"</string>
<string name="tab" msgid="1672349317127674378">"Sekme"</string>
<string name="navigation_menu" msgid="542007171693138492">"Gezinme menüsü"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Açılır menü"</string>
<string name="close_drawer" msgid="406453423630273620">"Gezinme menüsünü kapat"</string>
<string name="close_sheet" msgid="7573152094250666567">"Sayfayı kapat"</string>
<string name="default_error_message" msgid="8038256446254964252">"Geçersiz giriş"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-uk/strings.xml b/compose/ui/ui/src/androidMain/res/values-uk/strings.xml
index 2979564..8753298 100644
--- a/compose/ui/ui/src/androidMain/res/values-uk/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-uk/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Виконується"</string>
<string name="tab" msgid="1672349317127674378">"Вкладка"</string>
<string name="navigation_menu" msgid="542007171693138492">"Меню навігації"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Спадне меню"</string>
<string name="close_drawer" msgid="406453423630273620">"Закрити меню навігації"</string>
<string name="close_sheet" msgid="7573152094250666567">"Закрити аркуш"</string>
<string name="default_error_message" msgid="8038256446254964252">"Введено недійсні дані"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-ur/strings.xml b/compose/ui/ui/src/androidMain/res/values-ur/strings.xml
index 034fe1e..1657099 100644
--- a/compose/ui/ui/src/androidMain/res/values-ur/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-ur/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"پیشرفت میں"</string>
<string name="tab" msgid="1672349317127674378">"ٹیب"</string>
<string name="navigation_menu" msgid="542007171693138492">"نیویگیشن مینو"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"ڈراپ ڈاؤن مینو"</string>
<string name="close_drawer" msgid="406453423630273620">"نیویگیشن مینو بند کریں"</string>
<string name="close_sheet" msgid="7573152094250666567">"شیٹ بند کریں"</string>
<string name="default_error_message" msgid="8038256446254964252">"غلط ان پٹ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-uz/strings.xml b/compose/ui/ui/src/androidMain/res/values-uz/strings.xml
index 612ce12..ffd212b 100644
--- a/compose/ui/ui/src/androidMain/res/values-uz/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-uz/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Bajarilmoqda"</string>
<string name="tab" msgid="1672349317127674378">"Varaq"</string>
<string name="navigation_menu" msgid="542007171693138492">"Navigatsiya menyusi"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Pastga ochiluvchi menyu"</string>
<string name="close_drawer" msgid="406453423630273620">"Navigatsiya menyusini yopish"</string>
<string name="close_sheet" msgid="7573152094250666567">"Varaqni yopish"</string>
<string name="default_error_message" msgid="8038256446254964252">"Kiritilgan axborot xato"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-vi/strings.xml b/compose/ui/ui/src/androidMain/res/values-vi/strings.xml
index f1fd2ba..cbf4201 100644
--- a/compose/ui/ui/src/androidMain/res/values-vi/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-vi/strings.xml
@@ -28,6 +28,7 @@
<string name="in_progress" msgid="6827826412747255547">"Đang thực hiện"</string>
<string name="tab" msgid="1672349317127674378">"Thẻ"</string>
<string name="navigation_menu" msgid="542007171693138492">"Trình đơn điều hướng"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Trình đơn thả xuống"</string>
<string name="close_drawer" msgid="406453423630273620">"Đóng trình đơn điều hướng"</string>
<string name="close_sheet" msgid="7573152094250666567">"Đóng trang tính"</string>
<string name="default_error_message" msgid="8038256446254964252">"Giá trị nhập không hợp lệ"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml
index 67b8c12..e315466 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rCN/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"进行中"</string>
<string name="tab" msgid="1672349317127674378">"标签页"</string>
<string name="navigation_menu" msgid="542007171693138492">"导航菜单"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"下拉菜单"</string>
<string name="close_drawer" msgid="406453423630273620">"关闭导航菜单"</string>
<string name="close_sheet" msgid="7573152094250666567">"关闭工作表"</string>
<string name="default_error_message" msgid="8038256446254964252">"输入无效"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml
index 366ea35..96830e6 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rHK/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"進行中"</string>
<string name="tab" msgid="1672349317127674378">"分頁"</string>
<string name="navigation_menu" msgid="542007171693138492">"導覽選單"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"下拉式選單"</string>
<string name="close_drawer" msgid="406453423630273620">"閂導覽選單"</string>
<string name="close_sheet" msgid="7573152094250666567">"閂表單"</string>
<string name="default_error_message" msgid="8038256446254964252">"輸入嘅資料無效"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml b/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
index 85979bb..22beba0 100644
--- a/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zh-rTW/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"處理中"</string>
<string name="tab" msgid="1672349317127674378">"Tab 鍵"</string>
<string name="navigation_menu" msgid="542007171693138492">"導覽選單"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"下拉式選單"</string>
<string name="close_drawer" msgid="406453423630273620">"關閉導覽選單"</string>
<string name="close_sheet" msgid="7573152094250666567">"關閉功能表"</string>
<string name="default_error_message" msgid="8038256446254964252">"輸入內容無效"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values-zu/strings.xml b/compose/ui/ui/src/androidMain/res/values-zu/strings.xml
index 1aa553f..3d87da5 100644
--- a/compose/ui/ui/src/androidMain/res/values-zu/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values-zu/strings.xml
@@ -26,6 +26,7 @@
<string name="in_progress" msgid="6827826412747255547">"Kuyaqhubeka"</string>
<string name="tab" msgid="1672349317127674378">"Ithebhu"</string>
<string name="navigation_menu" msgid="542007171693138492">"Imenyu yokuzulazula"</string>
+ <string name="dropdown_menu" msgid="1890207353314751437">"Imenyu eya phansi"</string>
<string name="close_drawer" msgid="406453423630273620">"Vala imenyu yokuzulazula"</string>
<string name="close_sheet" msgid="7573152094250666567">"Vala ishidi"</string>
<string name="default_error_message" msgid="8038256446254964252">"Okufakwayo okungalungile"</string>
diff --git a/compose/ui/ui/src/androidMain/res/values/strings.xml b/compose/ui/ui/src/androidMain/res/values/strings.xml
index abde736..cfa3a7b 100644
--- a/compose/ui/ui/src/androidMain/res/values/strings.xml
+++ b/compose/ui/ui/src/androidMain/res/values/strings.xml
@@ -34,6 +34,8 @@
<string name="tab">Tab</string>
<!-- Spoken title when a navigation drawer opens. -->
<string name="navigation_menu">"Navigation menu"</string>
+ <!-- Spoken title of a dropdown menu. -->
+ <string name="dropdown_menu">"Dropdown menu"</string>
<!--
Spoken content description of an element which will close the navigation menu when clicked.
-->
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
new file mode 100644
index 0000000..c4e69bc
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/InputModeManager.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.input
+
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+
+/**
+ * The [InputModeManager] is accessible as a CompositionLocal, that provides the current
+ * [InputMode].
+ */
+interface InputModeManager {
+ /**
+ * The current [InputMode].
+ */
+ val inputMode: InputMode
+
+ /**
+ * Send a request to change the [InputMode].
+ *
+ * @param inputMode The requested [InputMode].
+ * @return true if the system is in the requested mode, after processing this request.
+ */
+ @ExperimentalComposeUiApi
+ fun requestInputMode(inputMode: InputMode): Boolean
+}
+
+/**
+ * This value is used to represent the InputMode that the system is currently in.
+ */
+@Suppress("INLINE_CLASS_DEPRECATED")
+inline class InputMode internal constructor (@Suppress("unused") private val value: Int) {
+ override fun toString() = when (this) {
+ Touch -> "touch mode"
+ Keyboard -> "Keyboard mode"
+ else -> "invalid mode"
+ }
+
+ companion object {
+ /**
+ * The system is put into [Touch] mode when a user touches the screen.
+ */
+ val Touch = InputMode(1)
+
+ /**
+ * The system is put into [Keyboard] mode when a user presses a hardware key.
+ */
+ val Keyboard = InputMode(2)
+ }
+}
+
+internal class InputModeManagerImpl(
+ initialInputMode: InputMode,
+ private val onRequestInputModeChange: (InputMode) -> Boolean
+) : InputModeManager {
+ override var inputMode: InputMode by mutableStateOf(initialInputMode)
+
+ @ExperimentalComposeUiApi
+ override fun requestInputMode(inputMode: InputMode) = onRequestInputModeChange.invoke(inputMode)
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
index f1c9a97..f1e51280 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/HitPathTracker.kt
@@ -18,6 +18,7 @@
import androidx.compose.runtime.collection.MutableVector
import androidx.compose.runtime.collection.mutableVectorOf
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.layout.LayoutCoordinates
import androidx.compose.ui.node.InternalCoreApi
import androidx.compose.ui.util.fastForEach
@@ -327,12 +328,23 @@
coordinates = pointerInputFilter.layoutCoordinates
+ @OptIn(ExperimentalComposeUiApi::class)
for ((key, change) in changes) {
// Filter for changes that are associated with pointer ids that are relevant to this
// node
if (key in pointerIds) {
// And translate their position relative to the parent coordinates, to give us a
// change local to the PointerInputFilter's coordinates
+ val historical = mutableListOf<HistoricalChange>()
+ change.historical.fastForEach {
+ historical.add(
+ HistoricalChange(
+ it.uptimeMillis,
+ coordinates!!.localPositionOf(parentCoordinates, it.position)
+ )
+ )
+ }
+
relevantChanges[key] = change.copy(
previousPosition = coordinates!!.localPositionOf(
parentCoordinates,
@@ -341,7 +353,8 @@
currentPosition = coordinates!!.localPositionOf(
parentCoordinates,
change.position
- )
+ ),
+ historical = historical
)
}
}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
index 21dab8f..b5ba973 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerInput.kt
@@ -16,6 +16,7 @@
package androidx.compose.ui.input.pointer
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.node.InternalCoreApi
@@ -34,15 +35,18 @@
/**
* Data that describes a particular pointer
*
- * [positionOnScreen] is relative to the device screen. [position] is relative to the owner.
+ * @param positionOnScreen The position of the event relative to the device screen.
+ * @param position The position of the event relative to the owner.
*/
+@OptIn(ExperimentalComposeUiApi::class)
internal data class PointerInputEventData(
val id: PointerId,
val uptime: Long,
val positionOnScreen: Offset,
val position: Offset,
val down: Boolean,
- val type: PointerType
+ val type: PointerType,
+ val historical: List<HistoricalChange> = mutableListOf()
)
/**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
index fec50ed..9219a64 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.kt
@@ -19,6 +19,7 @@
package androidx.compose.ui.input.pointer
import androidx.compose.runtime.Immutable
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Size
@@ -379,6 +380,7 @@
* or [touch][PointerType.Touch].git
*/
@Immutable
+@OptIn(ExperimentalComposeUiApi::class)
class PointerInputChange(
val id: PointerId,
val uptimeMillis: Long,
@@ -390,6 +392,46 @@
val consumed: ConsumedData,
val type: PointerType = PointerType.Touch
) {
+ /**
+ * Optional high-frequency pointer moves in between the last two dispatched events.
+ * Can be used for extra accuracy when touchscreen rate exceeds framerate.
+ */
+ // With these experimental annotations, the API can be either cleanly removed or
+ // stabilized. It doesn't appear in current.txt; and in experimental_current.txt,
+ // it has the same effect as a primary constructor val.
+ @Suppress("EXPERIMENTAL_ANNOTATION_ON_WRONG_TARGET")
+ @ExperimentalComposeUiApi
+ @get:ExperimentalComposeUiApi
+ val historical: List<HistoricalChange>
+ get() = _historical ?: listOf()
+ private var _historical: List<HistoricalChange>? = null
+
+ @ExperimentalComposeUiApi
+ constructor(
+ id: PointerId,
+ uptimeMillis: Long,
+ position: Offset,
+ pressed: Boolean,
+ previousUptimeMillis: Long,
+ previousPosition: Offset,
+ previousPressed: Boolean,
+ consumed: ConsumedData,
+ type: PointerType,
+ historical: List<HistoricalChange>
+ ) : this(
+ id,
+ uptimeMillis,
+ position,
+ pressed,
+ previousUptimeMillis,
+ previousPosition,
+ previousPressed,
+ consumed,
+ type
+ ) {
+ _historical = historical
+ }
+
fun copy(
id: PointerId = this.id,
currentTime: Long = this.uptimeMillis,
@@ -409,7 +451,33 @@
previousPosition,
previousPressed,
consumed,
- type
+ type,
+ this.historical
+ )
+
+ @ExperimentalComposeUiApi
+ fun copy(
+ id: PointerId = this.id,
+ currentTime: Long = this.uptimeMillis,
+ currentPosition: Offset = this.position,
+ currentPressed: Boolean = this.pressed,
+ previousTime: Long = this.previousUptimeMillis,
+ previousPosition: Offset = this.previousPosition,
+ previousPressed: Boolean = this.previousPressed,
+ consumed: ConsumedData = this.consumed,
+ type: PointerType = this.type,
+ historical: List<HistoricalChange>
+ ): PointerInputChange = PointerInputChange(
+ id,
+ currentTime,
+ currentPosition,
+ currentPressed,
+ previousTime,
+ previousPosition,
+ previousPressed,
+ consumed,
+ type,
+ historical
)
override fun toString(): String {
@@ -421,7 +489,31 @@
"previousPosition=$previousPosition, " +
"previousPressed=$previousPressed, " +
"consumed=$consumed, " +
- "type=$type)"
+ "type=$type, " +
+ "historical=$historical)"
+ }
+}
+
+/**
+ * Data structure for "historical" pointer moves.
+ *
+ * Optional high-frequency pointer moves in between the last two dispatched events:
+ * can be used for extra accuracy when touchscreen rate exceeds framerate.
+ *
+ * @param uptimeMillis The time of the historical pointer event, in milliseconds. In between
+ * the current and previous pointer event times.
+ * @param position The [Offset] of the historical pointer event, relative to the containing
+ * element.
+ */
+@Immutable
+@ExperimentalComposeUiApi
+class HistoricalChange(
+ val uptimeMillis: Long,
+ val position: Offset
+) {
+ override fun toString(): String {
+ return "HistoricalChange(uptimeMillis=$uptimeMillis, " +
+ "position=$position)"
}
}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
index ad3ee3c..6f3d1b5 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEventProcessor.kt
@@ -16,6 +16,7 @@
package androidx.compose.ui.input.pointer
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.node.HitTestResult
import androidx.compose.ui.node.InternalCoreApi
@@ -108,7 +109,7 @@
/**
* Produces [InternalPointerEvent]s by tracking changes between [PointerInputEvent]s
*/
-@OptIn(InternalCoreApi::class)
+@OptIn(InternalCoreApi::class, ExperimentalComposeUiApi::class)
private class PointerInputChangeEventProducer {
private val previousPointerInputData: MutableMap<PointerId, PointerInputData> = mutableMapOf()
@@ -149,7 +150,8 @@
previousPosition,
previousDown,
ConsumedData(),
- it.type
+ it.type,
+ it.historical
)
if (it.down) {
previousPointerInputData[it.id] = PointerInputData(
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt
index 5ccbdd5..2cc81e6 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/input/pointer/util/VelocityTracker.kt
@@ -16,7 +16,10 @@
package androidx.compose.ui.input.pointer.util
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.pointer.PointerInputChange
+import androidx.compose.ui.util.fastForEach
import androidx.compose.ui.unit.Velocity
import kotlin.math.abs
import kotlin.math.sqrt
@@ -157,6 +160,22 @@
}
}
+/**
+ * Track the positions and timestamps inside this event change.
+ *
+ * For optimal tracking, this should be called for the DOWN event and all MOVE
+ * events, including any touch-slop-captured MOVE event.
+ *
+ * @param event Pointer change to track.
+ */
+fun VelocityTracker.addPointerInputChange(event: PointerInputChange) {
+ @OptIn(ExperimentalComposeUiApi::class)
+ event.historical.fastForEach {
+ addPosition(it.uptimeMillis, it.position)
+ }
+ addPosition(event.uptimeMillis, event.position)
+}
+
private data class PointAtTime(val point: Offset, val time: Long)
/**
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
index 1497fa8..a3d48fe6 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/LayoutInfo.kt
@@ -18,6 +18,7 @@
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.ViewConfiguration
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.LayoutDirection
@@ -69,6 +70,11 @@
val layoutDirection: LayoutDirection
/**
+ * The [ViewConfiguration] in use for this layout.
+ */
+ val viewConfiguration: ViewConfiguration
+
+ /**
* Returns true if this layout is currently a part of the layout tree.
*/
val isAttached: Boolean
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
index 8753c20..02f2403 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/MeasurePolicy.kt
@@ -58,8 +58,8 @@
* [Measurable.measure] method. This method takes the [Constraints] which the child should
* respect; different children can be measured with different constraints.
* Measuring a child returns a [Placeable], which reveals the size chosen by the child as a
- * result of its own measurement. According to the children sizes, the parent is defining the
- * positioning of the children, by [placing][Placeable.PlacementScope.place] the [Placeable]s in
+ * result of its own measurement. According to the children sizes, the parent defines the
+ * position of the children, by [placing][Placeable.PlacementScope.place] the [Placeable]s in
* the [MeasureResult.placeChildren] of the returned [MeasureResult]. Therefore the parent needs
* to measure its children with appropriate [Constraints], such that whatever valid sizes
* children choose, they can be laid out correctly according to the parent's layout algorithm.
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt
index 0198aed..067c8ef 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/layout/ParentDataModifier.kt
@@ -22,7 +22,7 @@
/**
* A [Modifier] that provides data to the parent [Layout]. This can be read from within the
* the [Layout] during measurement and positioning, via [IntrinsicMeasurable.parentData].
- * Th parent data is commonly used to inform the parent how the child [Layout] should be measured
+ * The parent data is commonly used to inform the parent how the child [Layout] should be measured
* and positioned.
*/
interface ParentDataModifier : Modifier.Element {
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt
new file mode 100644
index 0000000..db74961
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocal.kt
@@ -0,0 +1,109 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.modifier
+
+import androidx.compose.runtime.Stable
+
+/**
+ * [ModifierLocal]s provide a means of inter-modifier communication. When a modifier provides a
+ * [ModifierLocal], it is available to modifiers on the right of the providing modifier for the
+ * current layout node. The provided [ModifierLocal]s are also available to layout nodes that are
+ * children of the current layout node.
+ *
+ * One must create a [ModifierLocal] instance, which cah be referenced by consumers statically.
+ * [ModifierLocal] instances themselves hold no data, and can be thought of as a type-safe
+ * identifier for the data being passed to other modifiers to the right of the providing
+ * modifier or down the tree. [ModifierLocal] factory functions take a single parameter: a
+ * factory to create a default value in cases where a [ModifierLocal] is used without a Provider.
+ * If this is a situation you would rather not handle, you can throw an error in this factory.
+ *
+ * To add a value that can be accessed by other modifiers, create an instance of a
+ * [ProvidableModifierLocal] and add it to the tree by using a [modifierLocalProvider]. Now other
+ * modifiers can access the provided value by using a [modifierLocalConsumer].
+ *
+ * @see ProvidableModifierLocal
+ * @see modifierLocalOf
+ * @see modifierLocalProvider
+ * @see modifierLocalConsumer
+ */
+@Stable
+sealed class ModifierLocal<T> private constructor(internal val defaultFactory: () -> T)
+
+/**
+ * [ProvidableModifierLocal]s are [ModifierLocal]s that can be used to provide values using a
+ * [ModifierLocalProvider].
+ *
+ * When you create an instance of a [ProvidableModifierLocal], and want to prevent users of
+ * your library from providing new values but want to allow the values to be consumed, expose a
+ * [ModifierLocal] instead.
+ *
+ * @see ModifierLocal
+ * @see modifierLocalOf
+ * @see modifierLocalProvider
+ * @see modifierLocalConsumer
+ */
+@Stable
+class ProvidableModifierLocal<T>(defaultFactory: () -> T) : ModifierLocal<T>(defaultFactory)
+
+/**
+ * Creates a [ProvidableModifierLocal] and specifies a default factory.
+ *
+ * @param defaultFactory a factory to create a default value in cases where a [ModifierLocal] is
+ * consumed without a Provider. If this is a situation you would rather not handle, you can throw
+ * an error in this factory.
+ *
+ * Here are examples where a modifier can communicate with another in the same modifier chain:
+ *
+ * Sample 1: Modifier sending a message to another to its right.
+ *
+ * @sample androidx.compose.ui.samples.ModifierLocalParentChildCommunicationWithinLayoutNodeSample
+ *
+ * Sample 2: Modifier sending a message to another to its left.
+ *
+ * @sample androidx.compose.ui.samples.ModifierLocalChildParentCommunicationWithinLayoutNodeSample
+ *
+ * Here are examples where a modifier can communicate with another across layout nodes:
+ *
+ * Sample 1: Modifier sending a message to a modifier on a child layout node.
+ *
+ * @sample androidx.compose.ui.samples.ModifierLocalParentChildCommunicationInterLayoutNodeSample
+ *
+ * Sample 2: Modifier sending a message to a modifier on a parent layout node.
+ *
+ * @sample androidx.compose.ui.samples.ModifierLocalChildParentCommunicationInterLayoutNodeSample
+ *
+ * @see ProvidableModifierLocal
+ * @see ModifierLocal
+ * @see modifierLocalProvider
+ * @see modifierLocalConsumer
+ */
+fun <T> modifierLocalOf(defaultFactory: () -> T): ProvidableModifierLocal<T> =
+ ProvidableModifierLocal(defaultFactory)
+
+/**
+ * This scope gives us access to modifier locals that are provided by other modifiers to the left
+ * of this modifier, or above this modifier in the layout tree.
+ *
+ * @see modifierLocalOf
+ */
+interface ModifierLocalReadScope {
+ /**
+ * Read a [ModifierLocal] that was provided by other modifiers to the left of this modifier,
+ * or above this modifier in the layout tree.
+ */
+ val <T> ModifierLocal<T>.current: T
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt
new file mode 100644
index 0000000..9cc527d
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalConsumer.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.modifier
+
+import androidx.compose.runtime.Stable
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.InspectorInfo
+import androidx.compose.ui.platform.InspectorValueInfo
+import androidx.compose.ui.platform.debugInspectorInfo
+
+/**
+ * A Modifier that can be used to consume [ModifierLocal]s that were provided by other modifiers to
+ * the left of this modifier, or above this modifier in the layout tree.
+ */
+@Stable
+interface ModifierLocalConsumer : Modifier.Element {
+ /**
+ * This function is called whenever one of the consumed values has changed.
+ * This could be called in response to the modifier being added, removed or re-ordered.
+ */
+ fun onModifierLocalsUpdated(scope: ModifierLocalReadScope)
+}
+
+/**
+ * A Modifier that can be used to consume [ModifierLocal]s that were provided by other modifiers to
+ * the left of this modifier, or above this modifier in the layout tree.
+ */
+@Stable
+@ExperimentalComposeUiApi
+fun Modifier.modifierLocalConsumer(consumer: ModifierLocalReadScope.() -> Unit): Modifier {
+ return this.then(
+ ModifierLocalConsumerImpl(
+ consumer,
+ debugInspectorInfo {
+ name = "modifierLocalConsumer"
+ properties["consumer"] = consumer
+ }
+ )
+ )
+}
+
+@Stable
+private class ModifierLocalConsumerImpl(
+ val consumer: ModifierLocalReadScope.() -> Unit,
+ debugInspectorInfo: InspectorInfo.() -> Unit
+) : ModifierLocalConsumer, InspectorValueInfo(debugInspectorInfo) {
+
+ override fun onModifierLocalsUpdated(scope: ModifierLocalReadScope) {
+ consumer.invoke(scope)
+ }
+
+ override fun equals(other: Any?): Boolean {
+ return other is ModifierLocalConsumerImpl && other.consumer == consumer
+ }
+
+ override fun hashCode() = consumer.hashCode()
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt
new file mode 100644
index 0000000..15a2dfc
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/modifier/ModifierLocalProvider.kt
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.modifier
+
+import androidx.compose.runtime.Stable
+import androidx.compose.runtime.derivedStateOf
+import androidx.compose.runtime.getValue
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.platform.InspectorValueInfo
+import androidx.compose.ui.platform.debugInspectorInfo
+
+/**
+ * A Modifier that can be used to provide [ModifierLocal]s that can be read by other modifiers to
+ * the right of this modifier, or modifiers that are children of the layout node that this
+ * modifier is attached to.
+ */
+@Stable
+interface ModifierLocalProvider<T> : Modifier.Element {
+ /**
+ * Each [ModifierLocalProvider] stores a [ModifierLocal] instance that can be used as a key
+ * by a [ModifierLocalConsumer] to read the provided value.
+ */
+ val key: ProvidableModifierLocal<T>
+
+ /**
+ * The provided value, that can be read by modifiers on the right of this modifier, and
+ * modifiers added to children of the composable using this modifier.
+ */
+ val value: T
+}
+
+/**
+ * A Modifier that can be used to provide [ModifierLocal]s that can be read by other modifiers to
+ * the right of this modifier, or modifiers that are children of the layout node that this
+ * modifier is attached to.
+ */
+@ExperimentalComposeUiApi
+fun <T> Modifier.modifierLocalProvider(key: ProvidableModifierLocal<T>, value: () -> T): Modifier {
+ return this.then(
+ object : ModifierLocalProvider<T>,
+ InspectorValueInfo(
+ debugInspectorInfo {
+ name = "modifierLocalProvider"
+ properties["key"] = key
+ properties["value"] = value
+ }
+ ) {
+ override val key: ProvidableModifierLocal<T> = key
+ override val value by derivedStateOf(value)
+ }
+ )
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
index 9e3a1fd..f285a7b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNode.kt
@@ -50,6 +50,8 @@
import androidx.compose.ui.layout.RelocationRequesterModifier
import androidx.compose.ui.layout.Remeasurement
import androidx.compose.ui.layout.RemeasurementModifier
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalProvider
import androidx.compose.ui.node.LayoutNode.LayoutState.LayingOut
import androidx.compose.ui.node.LayoutNode.LayoutState.Measuring
import androidx.compose.ui.node.LayoutNode.LayoutState.NeedsRelayout
@@ -86,7 +88,7 @@
// but just a holder for its children - allows us to combine some children into something we
// can subcompose in(LayoutNode) without being required to define it as a real layout - we
// don't want to define the layout strategy for such nodes, instead the children of the
- // virtual nodes will be threated as the direct children of the virtual node parent.
+ // virtual nodes will be treated as the direct children of the virtual node parent.
// This whole concept will be replaced with a proper subcomposition logic which allows to
// subcompose multiple times into the same LayoutNode and define offsets.
@@ -676,6 +678,13 @@
// DrawModifier block should be before the LayoutModifier block so that a
// Modifier that implements both DrawModifier and LayoutModifier will have
// it's draw bounds reflect the dimensions defined by the LayoutModifier.
+ // Please ensure that ModifierLocalProvider is the first item here so that
+ // other layoutNodeWrappers don't accidentally use values that they provided.
+ // Also ensure that ModifierLocalConsumer is the last item here, so that the
+ // other modifiers can access ModifierLocals read by the ModifierLocalConsumer.
+ if (mod is ModifierLocalProvider<*>) {
+ wrapper = ModifierLocalProviderNode(wrapper, mod).assignChained(toWrap)
+ }
if (mod is DrawModifier) {
wrapper = ModifiedDrawNode(wrapper, mod)
}
@@ -725,6 +734,9 @@
OnGloballyPositionedModifierWrapper(wrapper, mod).assignChained(toWrap)
getOrCreateOnPositionedCallbacks() += wrapper
}
+ if (mod is ModifierLocalConsumer) {
+ wrapper = ModifierLocalConsumerNode(wrapper, mod).assignChained(toWrap)
+ }
}
wrapper
}
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
index 17e93c0..607c31b 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/LayoutNodeWrapper.kt
@@ -42,6 +42,7 @@
import androidx.compose.ui.layout.VerticalAlignmentLine
import androidx.compose.ui.layout.findRoot
import androidx.compose.ui.layout.positionInRoot
+import androidx.compose.ui.modifier.ModifierLocal
import androidx.compose.ui.semantics.SemanticsWrapper
import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
@@ -824,6 +825,16 @@
layer?.invalidate()
}
+ /**
+ * Called when a [ModifierLocalConsumer][androidx.compose.ui.modifier.ModifierLocalConsumer]
+ * reads a value. Ths function walks up the tree and reads any value provided by a parent. If
+ * no value is available it returns the default value associated with the specified
+ * [ModifierLocal].
+ */
+ open fun <T> onModifierLocalRead(modifierLocal: ModifierLocal<T>): T {
+ return wrappedBy?.onModifierLocalRead(modifierLocal) ?: modifierLocal.defaultFactory()
+ }
+
internal fun findCommonAncestor(other: LayoutNodeWrapper): LayoutNodeWrapper {
var ancestor1 = other.layoutNode
var ancestor2 = layoutNode
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalConsumerNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalConsumerNode.kt
new file mode 100644
index 0000000..8966754
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalConsumerNode.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.node
+
+import androidx.compose.ui.modifier.ModifierLocal
+import androidx.compose.ui.modifier.ModifierLocalConsumer
+import androidx.compose.ui.modifier.ModifierLocalReadScope
+
+internal class ModifierLocalConsumerNode(
+ wrapped: LayoutNodeWrapper,
+ modifier: ModifierLocalConsumer
+) : DelegatingLayoutNodeWrapper<ModifierLocalConsumer>(wrapped, modifier), ModifierLocalReadScope {
+
+ override fun onModifierChanged() {
+ super.onModifierChanged()
+ if (isAttached) notifyConsumerOfChanges()
+ }
+
+ override fun attach() {
+ super.attach()
+ notifyConsumerOfChanges()
+ }
+
+ override val <T> ModifierLocal<T>.current: T
+ get() = onModifierLocalRead(this)
+
+ private fun notifyConsumerOfChanges() {
+ layoutNode.requireOwner().snapshotObserver.observeReads(this, onReadValuesChanged) {
+ modifier.onModifierLocalsUpdated(this)
+ }
+ }
+
+ companion object {
+ val onReadValuesChanged: (ModifierLocalConsumerNode) -> Unit = { node ->
+ node.notifyConsumerOfChanges()
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalProviderNode.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalProviderNode.kt
new file mode 100644
index 0000000..1e1f2d4
--- /dev/null
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/ModifierLocalProviderNode.kt
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.node
+
+import androidx.compose.ui.modifier.ModifierLocal
+import androidx.compose.ui.modifier.ModifierLocalProvider
+
+internal class ModifierLocalProviderNode <T> (
+ wrapped: LayoutNodeWrapper,
+ modifier: ModifierLocalProvider<T>
+) : DelegatingLayoutNodeWrapper<ModifierLocalProvider<T>>(wrapped, modifier) {
+
+ override fun <V> onModifierLocalRead(modifierLocal: ModifierLocal<V>): V {
+ return if (modifier.key == modifierLocal) {
+ // We need a cast because type information is erased.
+ // When we check for equality of the key it implies that the types are equal too.
+ @Suppress("UNCHECKED_CAST")
+ modifier.value as V
+ } else {
+ super.onModifierLocalRead(modifierLocal)
+ }
+ }
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
index 20e01f1..c975eb4 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/node/Owner.kt
@@ -23,6 +23,7 @@
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Canvas
import androidx.compose.ui.hapticfeedback.HapticFeedback
+import androidx.compose.ui.input.InputModeManager
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.platform.AccessibilityManager
import androidx.compose.ui.platform.ClipboardManager
@@ -59,6 +60,12 @@
val hapticFeedBack: HapticFeedback
/**
+ * Provide information about the current input mode, and a way to programmatically change the
+ * input mode.
+ */
+ val inputModeManager: InputModeManager
+
+ /**
* Provide clipboard manager to the user. Use the Android version of clipboard manager.
*/
val clipboardManager: ClipboardManager
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
index 139b476..57eb120 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/platform/CompositionLocals.kt
@@ -25,6 +25,7 @@
import androidx.compose.ui.draw.DrawModifier
import androidx.compose.ui.focus.FocusManager
import androidx.compose.ui.hapticfeedback.HapticFeedback
+import androidx.compose.ui.input.InputModeManager
import androidx.compose.ui.layout.Layout
import androidx.compose.ui.node.Owner
import androidx.compose.ui.text.font.Font
@@ -73,8 +74,6 @@
* pixel units. This is typically used when a
* [DP][androidx.compose.ui.unit.Dp] is provided and it must be converted in the body of
* [Layout] or [DrawModifier].
- *
- * @sample androidx.compose.ui.unit.samples.WithDensitySample
*/
val LocalDensity = staticCompositionLocalOf<Density> {
noLocalProvidedFor("LocalDensity")
@@ -105,6 +104,14 @@
}
/**
+ * The CompositionLocal to provide an instance of InputModeManager which controls the current
+ * input mode.
+ */
+val LocalInputModeManager = staticCompositionLocalOf<InputModeManager> {
+ noLocalProvidedFor("LocalInputManager")
+}
+
+/**
* The CompositionLocal to provide the layout direction.
*/
val LocalLayoutDirection = staticCompositionLocalOf<LayoutDirection> {
@@ -160,6 +167,7 @@
LocalFocusManager provides owner.focusManager,
LocalFontLoader provides owner.fontLoader,
LocalHapticFeedback provides owner.hapticFeedBack,
+ LocalInputModeManager provides owner.inputModeManager,
LocalLayoutDirection provides owner.layoutDirection,
LocalTextInputService provides owner.textInputService,
LocalTextToolbar provides owner.textToolbar,
diff --git a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
index d24f050..23c5517 100644
--- a/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
+++ b/compose/ui/ui/src/commonMain/kotlin/androidx/compose/ui/semantics/SemanticsProperties.kt
@@ -530,7 +530,11 @@
val value: () -> Float,
val maxValue: () -> Float,
val reverseScrolling: Boolean = false
-)
+) {
+ override fun toString(): String =
+ "ScrollAxisRange(value=${value()}, maxValue=${maxValue()}, " +
+ "reverseScrolling=$reverseScrolling)"
+}
/**
* The type of user interface element. Accessibility services might use this to describe the
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt
deleted file mode 100644
index 10b03a9..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppFrame.desktop.kt
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-package androidx.compose.desktop
-
-import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.window.v1.MenuBar
-import java.awt.event.MouseListener
-import java.awt.event.MouseMotionListener
-import java.awt.image.BufferedImage
-import javax.swing.JFrame
-
-/**
- * AppFrame is an abstract class that represents a window.
- * <p>
- * Known subclasses: AppWindow
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Window_API_new)"
-)
-abstract class AppFrame {
-
- /**
- * Gets ComposeWindow object.
- */
- abstract val window: ComposeWindow
-
- internal var menuBar: MenuBar? = null
-
- /**
- * Gets the parent window. If the value is not null, the current window is a dialog.
- */
- var invoker: AppFrame? = null
- protected set
-
- /**
- * Gets the title of the window. The title is displayed in the windows's native border.
- */
- val title: String
- get() = window.title
-
- /**
- * Gets the width of the window.
- */
- val width: Int
- get() = window.width
-
- /**
- * Gets the height of the window.
- */
- val height: Int
- get() = window.height
-
- /**
- * Gets the current x coordinate of the window.
- */
- val x: Int
- get() = window.x
-
- /**
- * Gets the current y coordinate of the window.
- */
- val y: Int
- get() = window.y
-
- /**
- * Returns true if the winodw is closed, false otherwise.
- */
- var isClosed: Boolean = false
- internal set
-
- /**
- * Returns the icon image of the window. If the icon is not set, null is returned.
- */
- var icon: BufferedImage? = null
- internal set
-
- /**
- * Returns events of the window. Each event is described as a lambda that is invoked when
- * needed.
- */
- var events: WindowEvents = WindowEvents()
- internal set
-
- internal var onDispose: (() -> Unit)? = null
-
- internal var onDismiss: (() -> Unit)? = null
-
- /**
- * Sets the title of the window.
- *
- * @param title Window title text.
- */
- abstract fun setTitle(title: String)
-
- /**
- * Sets the image icon of the window.
- *
- * @param image Image of the icon.
- */
- abstract fun setIcon(image: BufferedImage?)
-
- /**
- * Sets the menu bar of the window. The menu bar can be displayed inside a window (Windows,
- * Linux) or at the top of the screen (Mac OS).
- *
- * @param menuBar Window menu bar.
- */
- abstract fun setMenuBar(menuBar: MenuBar)
-
- /**
- * Removes the menu bar of the window.
- */
- abstract fun removeMenuBar()
-
- /**
- * Switches the window to fullscreen mode if the window is resizable. If the window is in
- * fullscreen mode [minimize] and [maximize] methods are ignored.
- */
- abstract fun makeFullscreen()
-
- /**
- * Returns true if the window is in fullscreen state, false otherwise.
- */
- abstract val isFullscreen: Boolean
- get
-
- /**
- * Minimizes the window to the taskbar.
- */
- abstract fun minimize()
-
- /**
- * Returns true if the window is minimized, false otherwise.
- */
- val isMinimized: Boolean
- get() = window.extendedState == JFrame.ICONIFIED
-
- /**
- * Maximizes the window to fill all available screen space.
- */
- abstract fun maximize()
-
- /**
- * Returns true if the window is maximized, false otherwise.
- */
- val isMaximized: Boolean
- get() = window.extendedState == JFrame.MAXIMIZED_BOTH
-
- /**
- * Restores the previous state and size of the window after
- * maximizing/minimizing/fullscreen mode.
- */
- abstract fun restore()
-
- /**
- * Sets the ability to resize the window. True - the window can be resized,
- * false - the window cannot be resized. If the window is in fullscreen mode
- * setter of this property is ignored. If this property is true the [makeFullscreen()]
- * method is ignored.
- */
- abstract var resizable: Boolean
-
- /**
- * Sets the new position of the window on the screen.
- *
- * @param x the new x-coordinate of the window.
- * @param y the new y-coordinate of the window.
- */
- abstract fun setLocation(x: Int, y: Int)
-
- /**
- * Sets the window to the center of the screen.
- */
- abstract fun setWindowCentered()
-
- /**
- * Sets the new size of the window.
- *
- * @param width the new width of the window.
- * @param height the new height of the window.
- */
- abstract fun setSize(width: Int, height: Int)
-
- /**
- * Adds the specified mouse listener to receive mouse events from layer component.
- * @param listener the mouse listener.
- */
- abstract fun addMouseListener(listener: MouseListener)
-
- /**
- * Removes the specified mouse listener so that it no longer receives mouse events
- * from layer component.
- * @param listener the mouse listener.
- */
- abstract fun removeMouseListener(listener: MouseListener)
-
- /**
- * Adds the specified mouse motion listener to receive mouse events from layer component.
- * @param listener the mouse listener.
- */
- abstract fun addMouseMotionListener(listener: MouseMotionListener)
-
- /**
- * Removes the specified mouse motion listener so that it no longer receives mouse events
- * from layer component.
- * @param listener the mouse listener.
- */
- abstract fun removeMouseMotionListener(listener: MouseMotionListener)
-
- // TODO(demin): uncomment this after b/175234629 will be fixed
-// /**
-// * Shows a window with the given Compose content.
-// *
-// * @param parentComposition The parent composition reference to coordinate
-// * scheduling of composition updates.
-// * If null then default root composition will be used.
-// * @param content Composable content of the window.
-// */
-// abstract fun show(
-// parentComposition: CompositionContext? = null,
-// content: @Composable () -> Unit
-// )
-
- /**
- * Closes the window.
- */
- abstract fun close()
-
- internal abstract fun dispose()
-
- internal abstract fun connectPair(window: AppFrame)
-
- internal abstract fun disconnectPair()
-
- internal abstract fun lockWindow()
-
- internal abstract fun unlockWindow()
-}
-
-/**
- * WindowEvents is the class that contains all the events supported by window.
- *
- * @param onOpen The event that is invoked after the window appears.
- * @param onClose The event that is invoked after the window is closed.
- * @param onMinimize The event that is invoked after the window is minimized.
- * @param onMaximize The event that is invoked after the window is maximized.
- * @param onRestore The event that is invoked when the window is restored after the window has been
- * maximized or minimized.
- * @param onFocusGet The event that is invoked when the window gets focus.
- * @param onFocusLost The event that is invoked when the window lost focus.
- * @param onResize The event that is invoked when the window is resized.
- * @param onRelocate The event that is invoked when the window is relocated.
- */
-class WindowEvents(
- var onOpen: (() -> Unit)? = null,
- var onClose: (() -> Unit)? = null,
- var onMinimize: (() -> Unit)? = null,
- var onMaximize: (() -> Unit)? = null,
- var onRestore: (() -> Unit)? = null,
- var onFocusGet: (() -> Unit)? = null,
- var onFocusLost: (() -> Unit)? = null,
- var onResize: ((IntSize) -> Unit)? = null,
- var onRelocate: ((IntOffset) -> Unit)? = null
-) {
-
- internal fun invokeOnOpen() {
- onOpen?.invoke()
- }
-
- internal fun invokeOnClose() {
- onClose?.invoke()
- }
-
- internal fun invokeOnMinimize() {
- onMinimize?.invoke()
- }
-
- internal fun invokeOnMaximize() {
- onMaximize?.invoke()
- }
-
- internal fun invokeOnRestore() {
- onRestore?.invoke()
- }
-
- internal fun invokeOnFocusGet() {
- onFocusGet?.invoke()
- }
-
- internal fun invokeOnFocusLost() {
- onFocusLost?.invoke()
- }
-
- internal fun invokeOnResize(size: IntSize) {
- onResize?.invoke(size)
- }
-
- internal fun invokeOnRelocate(location: IntOffset) {
- onRelocate?.invoke(location)
- }
-}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppManager.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppManager.desktop.kt
deleted file mode 100644
index 8427584..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppManager.desktop.kt
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-package androidx.compose.desktop
-
-import androidx.compose.ui.window.v1.MenuBar
-
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Window_API_new)"
-)
-object AppManager {
-
- init {
- Runtime.getRuntime().addShutdownHook(object : Thread() {
- public override fun run() {
- onAppExit?.invoke()
- }
- })
- }
-
- internal var sharedMenuBar: MenuBar? = null
-
- val defaultActionOnWindowsEmpty: () -> Unit = { System.exit(0) }
-
- private var onWindowsEmptyAction: (() -> Unit)? = defaultActionOnWindowsEmpty
-
- private var onAppStart: (() -> Unit)? = null
-
- private var onAppExit: (() -> Unit)? = null
-
- private val windowsList = mutableSetOf<AppFrame>()
-
- val windows: List<AppFrame>
- get() = windowsList.toList()
-
- val focusedWindow: AppFrame?
- get() = currentFocusedWindow()
-
- private fun currentFocusedWindow(): AppFrame? {
- for (current in windowsList) {
- if (current.window.isFocused) {
- return current
- }
- }
- return null
- }
-
- internal fun addWindow(window: AppFrame): Boolean {
- if (windowsList.isEmpty()) {
- onAppStart?.invoke()
- }
- if (windowsList.contains(window)) {
- return false
- }
- windowsList.add(window)
- return true
- }
-
- internal fun removeWindow(window: AppFrame) {
- windowsList.remove(window)
- window.dispose()
- if (windowsList.isEmpty()) {
- onWindowsEmptyAction?.invoke()
- }
- }
-
- fun setEvents(
- onAppStart: (() -> Unit)? = null,
- onAppExit: (() -> Unit)? = null,
- onWindowsEmpty: (() -> Unit)? = null
- ) {
- this.onAppStart = onAppStart
- this.onAppExit = onAppExit
- this.onWindowsEmptyAction = onWindowsEmpty
- }
-
- fun setMenu(menuBar: MenuBar?) {
- sharedMenuBar = menuBar
- }
-
- fun exit() {
- val dialogOrderedWindowsList = mutableListOf<AppFrame>()
- for (frame in windowsList) {
- if (frame.invoker != null) {
- dialogOrderedWindowsList.add(frame)
- }
- }
- for (frame in dialogOrderedWindowsList.union(windowsList)) {
- frame.close()
- }
- }
-}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
deleted file mode 100644
index 7a8c107..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/AppWindow.desktop.kt
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-package androidx.compose.desktop
-
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.CompositionContext
-import androidx.compose.runtime.CompositionLocalProvider
-import androidx.compose.runtime.compositionLocalOf
-import androidx.compose.ui.configureSwingGlobalsForCompose
-import androidx.compose.ui.awt.ComposeWindow
-import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntSize
-import androidx.compose.ui.window.v1.MenuBar
-import java.awt.Frame
-import java.awt.event.ComponentAdapter
-import java.awt.event.ComponentEvent
-import java.awt.event.MouseListener
-import java.awt.event.MouseMotionListener
-import java.awt.event.WindowAdapter
-import java.awt.event.WindowEvent
-import java.awt.image.BufferedImage
-import javax.swing.JFrame
-import javax.swing.JMenuBar
-import javax.swing.SwingUtilities
-import javax.swing.WindowConstants
-
-/**
- * Local composition of [AppWindow]. [AppWindow] is a high level window implementation. This local
- * composition is used to get the current [AppWindow].
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Window_API_new)"
-)
-val LocalAppWindow = compositionLocalOf<AppWindow> {
- error("CompositionLocal LocalAppWindow not provided")
-}
-
-/**
- * Opens a window with the given content.
- *
- * @param title The title of the window.
- * The title is displayed in the windows's native border.
- * @param size The initial size of the window.
- * @param location The initial position of the window in screen space. This parameter is
- * ignored if [center] is set to true.
- * @param centered Determines if the window is centered on startup. The default value for the
- * window is true.
- * @param icon The icon for the window displayed on the system taskbar.
- * @param menuBar Window menu bar. The menu bar can be displayed inside a window (Windows,
- * Linux) or at the top of the screen (Mac OS).
- * @param undecorated Removes the native window border if set to true. The default value is false.
- * @param resizable Makes the window resizable if is set to true and unresizable if is set to
- * false. The default value is true.
- * @param events Allows to describe events of the window.
- * Supported events: onOpen, onClose, onMinimize, onMaximize, onRestore, onFocusGet, onFocusLost,
- * onResize, onRelocate.
- * @param onDismissRequest Executes when the user tries to close the Window.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Window_API_new)"
-)
-fun Window(
- title: String = "JetpackDesktopWindow",
- size: IntSize = IntSize(800, 600),
- location: IntOffset = IntOffset.Zero,
- centered: Boolean = true,
- icon: BufferedImage? = null,
- menuBar: MenuBar? = null,
- undecorated: Boolean = false,
- resizable: Boolean = true,
- events: WindowEvents = WindowEvents(),
- onDismissRequest: (() -> Unit)? = null,
- content: @Composable () -> Unit = { }
-) {
- if (System.getProperty("compose.application.configure.swing.globals") == "true") {
- configureSwingGlobalsForCompose()
- }
- SwingUtilities.invokeLater {
- AppWindow(
- title = title,
- size = size,
- location = location,
- centered = centered,
- icon = icon,
- menuBar = menuBar,
- undecorated = undecorated,
- resizable = resizable,
- events = events,
- onDismissRequest = onDismissRequest
- ).show {
- content()
- }
- }
-}
-
-/**
- * AppWindow is a class that represents a window.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new)"
-)
-class AppWindow : AppFrame {
-
- /**
- * Gets ComposeWindow object.
- */
- override val window: ComposeWindow
-
- init {
- require(SwingUtilities.isEventDispatchThread()) {
- "AppWindow should be created inside AWT Event Thread (use SwingUtilities.invokeLater " +
- "or just dsl for creating window: Window { })"
- }
- window = ComposeWindow()
- window.apply {
- defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
- addWindowListener(object : WindowAdapter() {
- override fun windowClosing(event: WindowEvent) {
- if (!isClosed) {
- isClosed = true
- if (defaultCloseOperation != WindowConstants.DO_NOTHING_ON_CLOSE) {
- onDispose?.invoke()
- onDismiss?.invoke()
- events.invokeOnClose()
- AppManager.removeWindow(this@AppWindow)
- }
- }
- }
- override fun windowIconified(event: WindowEvent) {
- events.invokeOnMinimize()
- }
- override fun windowDeiconified(event: WindowEvent) {
- events.invokeOnRestore()
- }
- })
- addWindowFocusListener(object : WindowAdapter() {
- override fun windowGainedFocus(event: WindowEvent) {
- // Dialogs should not receive a common application menu bar
- if (invoker == null) {
- window.setJMenuBar(this@AppWindow.menuBar?.menuBar)
- }
- events.invokeOnFocusGet()
- }
- override fun windowLostFocus(event: WindowEvent) {
- events.invokeOnFocusLost()
- }
- })
- addWindowStateListener(object : WindowAdapter() {
- override fun windowStateChanged(event: WindowEvent) {
- val state = getState()
- if (state != Frame.NORMAL && state != Frame.ICONIFIED) {
- events.invokeOnMaximize()
- }
- }
- })
- addComponentListener(object : ComponentAdapter() {
- override fun componentResized(e: ComponentEvent) {
- val size = IntSize(width, height)
- events.invokeOnResize(size)
- }
- override fun componentMoved(e: ComponentEvent) {
- val location = IntOffset(x, y)
- events.invokeOnRelocate(location)
- }
- })
- }
- }
-
- internal constructor(
- attached: AppFrame? = null,
- title: String = "JetpackDesktopWindow",
- size: IntSize = IntSize(800, 600),
- location: IntOffset = IntOffset.Zero,
- centered: Boolean = true,
- icon: BufferedImage? = null,
- menuBar: MenuBar? = null,
- undecorated: Boolean = false,
- resizable: Boolean = true,
- events: WindowEvents = WindowEvents(),
- onDismissRequest: (() -> Unit)? = null
- ) : this(
- title = title,
- size = size,
- location = location,
- centered = centered,
- icon = icon,
- menuBar = menuBar,
- undecorated = undecorated,
- resizable = resizable,
- events = events,
- onDismissRequest = onDismissRequest
- ) {
- this.invoker = attached
- }
-
- /**
- * Creates an instance of AppWindow. AppWindow is a class that represents a window.
- *
- * @param title The title of the window.
- * The title is displayed in the windows's native border.
- * @param size The initial size of the window.
- * @param location The initial position of the window in screen space. This parameter is
- * ignored if [center] is set to true.
- * @param centered Determines if the window is centered on startup. The default value for the
- * window is true.
- * @param icon The icon for the window displayed on the system taskbar.
- * @param menuBar Window menu bar. The menu bar can be displayed inside a window (Windows,
- * Linux) or at the top of the screen (Mac OS).
- * @param undecorated Removes the native window border if set to true. The default value is false.
- * @param resizable Makes the window resizable if is set to true and unresizable if is set to
- * false. The default value is true.
- * @param events Allows to describe events of the window.
- * Supported events: onOpen, onClose, onMinimize, onMaximize, onRestore, onFocusGet, onFocusLost,
- * onResize, onRelocate.
- * @param onDismissRequest Executes when the user tries to close the AppWindow.
- */
- constructor(
- title: String = "JetpackDesktopWindow",
- size: IntSize = IntSize(800, 600),
- location: IntOffset = IntOffset.Zero,
- centered: Boolean = true,
- icon: BufferedImage? = null,
- menuBar: MenuBar? = null,
- undecorated: Boolean = false,
- resizable: Boolean = true,
- events: WindowEvents = WindowEvents(),
- onDismissRequest: (() -> Unit)? = null
- ) {
- AppManager.addWindow(this)
-
- setTitle(title)
- setIcon(icon)
- setSize(size.width, size.height)
- this.resizable = resizable
- if (centered) {
- setWindowCentered()
- } else {
- setLocation(location.x, location.y)
- }
-
- this.menuBar = menuBar
-
- if (this.menuBar == null && AppManager.sharedMenuBar != null) {
- this.menuBar = AppManager.sharedMenuBar!!
- }
-
- this.events = events
-
- window.setUndecorated(undecorated)
- onDismiss = onDismissRequest
- }
-
- internal var pair: AppFrame? = null
- internal override fun connectPair(window: AppFrame) {
- pair = window
- }
- internal override fun disconnectPair() {
- pair = null
- }
-
- /**
- * Sets the title of the window.
- *
- * @param title Window title text.
- */
- override fun setTitle(title: String) {
- window.setTitle(title)
- }
-
- /**
- * Sets the image icon of the window.
- *
- * @param image Image of the icon.
- */
- override fun setIcon(image: BufferedImage?) {
- this.icon = image
- if (icon != null) {
- try {
- val taskbar = java.awt.Taskbar.getTaskbar()
- taskbar.setIconImage(icon)
- } catch (e: UnsupportedOperationException) {
- println("The os does not support: 'Taskbar.setIconImage'")
- }
- window.setIconImage(icon)
- }
- }
-
- /**
- * Sets the menu bar of the window. The menu bar can be displayed inside a window (Windows,
- * Linux) or at the top of the screen (Mac OS).
- *
- * @param menuBar Window menu bar.
- */
- override fun setMenuBar(menuBar: MenuBar) {
- this.menuBar = menuBar
- window.setJMenuBar(menuBar.menuBar)
- }
-
- /**
- * Removes the menu bar of the window.
- */
- override fun removeMenuBar() {
- this.menuBar = null
- window.setJMenuBar(JMenuBar())
- }
-
- /**
- * Returns true if the window is in fullscreen mode, false otherwise.
- */
- override val isFullscreen: Boolean
- get() = window.layer.wrapped.fullscreen
-
- /**
- * Switches the window to fullscreen mode if the window is resizable. If the window is in
- * fullscreen mode [minimize] and [maximize] methods are ignored.
- */
- override fun makeFullscreen() {
- if (!isFullscreen && resizable) {
- window.layer.wrapped.fullscreen = true
- }
- }
-
- /**
- * Minimizes the window to the taskbar. If the window is in fullscreen mode this method
- * is ignored.
- */
- override fun minimize() {
- if (!isFullscreen) {
- window.setExtendedState(JFrame.ICONIFIED)
- }
- }
-
- /**
- * Maximizes the window to fill all available screen space. If the window is in fullscreen mode
- * this method is ignored.
- */
- override fun maximize() {
- if (!isFullscreen) {
- window.setExtendedState(JFrame.MAXIMIZED_BOTH)
- }
- }
-
- /**
- * Restores the previous state and size of the window after
- * maximizing/minimizing/fullscreen mode.
- */
- override fun restore() {
- if (isFullscreen) {
- window.layer.wrapped.fullscreen = false
- }
- window.setExtendedState(JFrame.NORMAL)
- }
-
- private var _resizable: Boolean = true
-
- /**
- * Sets the ability to resize the window. True - the window can be resized,
- * false - the window cannot be resized. If the window is in fullscreen mode
- * setter of this property is ignored. If this property is true the [makeFullscreen()]
- * method is ignored.
- */
- override var resizable: Boolean
- get() {
- return window.isResizable()
- }
- set(value) {
- if (!isFullscreen) {
- _resizable = value
- window.setResizable(value)
- }
- }
-
- /**
- * Sets the new size of the window.
- *
- * @param width the new width of the window.
- * @param height the new height of the window.
- */
- override fun setSize(width: Int, height: Int) {
- // better check min/max values of current window size
- var w = width
- if (w <= 0) {
- w = this.width
- }
-
- var h = height
- if (h <= 0) {
- h = this.height
- }
- window.setSize(w, h)
- }
-
- /**
- * Sets the new position of the window on the screen.
- *
- * @param x the new x-coordinate of the window.
- * @param y the new y-coordinate of the window.
- */
- override fun setLocation(x: Int, y: Int) {
- window.setLocation(x, y)
- }
-
- /**
- * Sets the window to the center of the current screen.
- */
- override fun setWindowCentered() {
- val screenBounds = window.graphicsConfiguration.getBounds()
- val x = (screenBounds.width - width) / 2 + screenBounds.x
- val y = (screenBounds.height - height) / 2 + screenBounds.y
- window.setLocation(x, y)
- }
-
- private fun onCreate(
- parentComposition: CompositionContext? = null,
- content: @Composable () -> Unit
- ) {
- window.setContent(parentComposition) {
- CompositionLocalProvider(
- LocalAppWindow provides this@AppWindow,
- content = content
- )
- }
- }
-
- /**
- * Shows a window with the given Compose content.
- *
- * @param parentComposition The parent composition reference to coordinate
- * scheduling of composition updates.
- * If null then default root composition will be used.
- * @param content Composable content of the window.
- */
- fun show(
- parentComposition: CompositionContext? = null,
- content: @Composable () -> Unit
- ) {
- if (invoker != null) {
- invoker!!.lockWindow()
- window.setAlwaysOnTop(true)
- }
-
- onCreate(parentComposition) {
- content()
- }
-
- window.setVisible(true)
- events.invokeOnOpen()
- }
-
- /**
- * Closes the window.
- */
- override fun close() {
- window.dispatchEvent(WindowEvent(window, WindowEvent.WINDOW_CLOSING))
- }
-
- internal override fun dispose() {
- invoker?.unlockWindow()
- }
-
- internal override fun lockWindow() {
- window.apply {
- defaultCloseOperation = WindowConstants.DO_NOTHING_ON_CLOSE
- setFocusableWindowState(false)
- setResizable(false)
- setEnabled(false)
- }
- invoker?.connectPair(this)
- }
-
- internal override fun unlockWindow() {
- window.apply {
- defaultCloseOperation = WindowConstants.DISPOSE_ON_CLOSE
- setFocusableWindowState(true)
- setEnabled(true)
- toFront()
- requestFocus()
- }
- resizable = _resizable
- disconnectPair()
- }
-
- /**
- * Adds the specified mouse listener to receive mouse events from layer component.
- * @param listener the mouse listener.
- */
- override fun addMouseListener(listener: MouseListener) {
- window.layer.component.addMouseListener(listener)
- }
-
- /**
- * Removes the specified mouse listener so that it no longer receives mouse events
- * from layer component.
- * @param listener the mouse listener.
- */
- override fun removeMouseListener(listener: MouseListener) {
- window.layer.component.removeMouseListener(listener)
- }
-
- /**
- * Adds the specified mouse motion listener to receive mouse events from layer component.
- * @param listener the mouse listener.
- */
- override fun addMouseMotionListener(listener: MouseMotionListener) {
- window.layer.component.addMouseMotionListener(listener)
- }
-
- /**
- * Removes the specified mouse motion listener so that it no longer receives mouse events
- * from layer component.
- * @param listener the mouse listener.
- */
- override fun removeMouseMotionListener(listener: MouseMotionListener) {
- window.layer.component.removeMouseMotionListener(listener)
- }
-}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/Deprecated.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/Deprecated.desktop.kt
deleted file mode 100644
index 1b88351..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/desktop/Deprecated.desktop.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.desktop
-
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.awt.NoOpUpdate
-import androidx.compose.ui.graphics.Color
-import java.awt.Component
-
-@Deprecated(
- "Use androidx.compose.ui.awt.ComposeWindow",
- replaceWith = ReplaceWith(
- "ComposeWindow",
- "androidx.compose.ui.awt.ComposeWindow"
- )
-)
-typealias ComposeWindow = androidx.compose.ui.awt.ComposeWindow
-
-@Deprecated(
- "Use androidx.compose.ui.awt.ComposeDialog",
- replaceWith = ReplaceWith(
- "ComposeDialog",
- "androidx.compose.ui.awt.ComposeDialog"
- )
-)
-typealias ComposeDialog = androidx.compose.ui.awt.ComposeDialog
-
-@Deprecated(
- "Use androidx.compose.ui.awt.ComposePanel",
- replaceWith = ReplaceWith(
- "ComposePanel",
- "androidx.compose.ui.awt.ComposePanel"
- )
-)
-typealias ComposePanel = androidx.compose.ui.awt.ComposePanel
-
-/**
- * Composes an AWT/Swing component obtained from [factory]. The [factory]
- * block will be called to obtain the [Component] to be composed. The Swing component is
- * placed on top of the Compose layer.
- * The [update] block runs due to recomposition, this is the place to set [Component] properties
- * depending on state. When state changes, the block will be reexecuted to set the new properties.
- *
- * @param background Background color of SwingPanel
- * @param factory The block creating the [Component] to be composed.
- * @param modifier The modifier to be applied to the layout.
- * @param update The callback to be invoked after the layout is inflated.
- */
-@Composable
-@Deprecated(
- "Use androidx.compose.ui.awt.SwingPanel",
- replaceWith = ReplaceWith(
- "SwingPanel(background, factory, modifier, update)",
- "androidx.compose.ui.awt.SwingPanel"
- )
-)
-fun <T : Component> SwingPanel(
- background: Color = Color.White,
- factory: () -> T,
- modifier: Modifier = Modifier,
- update: (T) -> Unit = NoOpUpdate
-) = androidx.compose.ui.awt.SwingPanel(
- background, factory, modifier, update
-)
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
new file mode 100644
index 0000000..0e457f9
--- /dev/null
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ComposeScene.desktop.kt
@@ -0,0 +1,494 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui
+
+import androidx.compose.runtime.BroadcastFrameClock
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Composition
+import androidx.compose.runtime.CompositionContext
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.Recomposer
+import androidx.compose.runtime.rememberCoroutineScope
+import androidx.compose.runtime.snapshots.Snapshot
+import androidx.compose.runtime.staticCompositionLocalOf
+import androidx.compose.runtime.withFrameNanos
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.input.mouse.MouseScrollEvent
+import androidx.compose.ui.input.mouse.MouseScrollOrientation
+import androidx.compose.ui.input.mouse.MouseScrollUnit
+import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.PointerId
+import androidx.compose.ui.input.pointer.PointerInputEvent
+import androidx.compose.ui.input.pointer.PointerInputEventData
+import androidx.compose.ui.input.pointer.PointerType
+import androidx.compose.ui.node.LayoutNode
+import androidx.compose.ui.platform.DesktopComponent
+import androidx.compose.ui.platform.DesktopOwner
+import androidx.compose.ui.platform.DesktopPlatformInput
+import androidx.compose.ui.platform.DesktopRootForTest
+import androidx.compose.ui.platform.DummyDesktopComponent
+import androidx.compose.ui.platform.EmptyDispatcher
+import androidx.compose.ui.platform.FlushCoroutineDispatcher
+import androidx.compose.ui.platform.GlobalSnapshotManager
+import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.node.RootForTest
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Popup
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.CoroutineStart
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.launch
+import org.jetbrains.skia.Canvas
+import java.awt.event.InputMethodEvent
+import java.awt.event.MouseEvent
+import kotlin.coroutines.CoroutineContext
+import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
+
+internal val LocalComposeScene = staticCompositionLocalOf<ComposeScene> {
+ error("CompositionLocal LocalComposeScene not provided")
+}
+
+/**
+ * Virtual container that encapsulates Compose UI content. UI content can be constructed via
+ * [setContent] method and with any Composable that manipulates [LayoutNode] tree.
+ *
+ * To draw content on [Canvas], you can use [render] method.
+ *
+ * To specify available size for the content, you should use [constraints].
+ *
+ * After [ComposeScene] will no longer needed, you should call [dispose] method, so all resources
+ * and subscriptions will be properly closed. Otherwise there can be a memory leak.
+ */
+class ComposeScene internal constructor(
+ coroutineContext: CoroutineContext,
+ component: DesktopComponent,
+ density: Density,
+ private val invalidate: () -> Unit
+) {
+ /**
+ * Constructs [ComposeScene]
+ *
+ * @param coroutineContext Context which will be used to launch effects ([LaunchedEffect],
+ * [rememberCoroutineScope]) and run recompositions.
+ * @param density Initial density of the content which will be used to convert [dp] units.
+ * @param invalidate Callback which will be called when the content need to be recomposed or
+ * rerendered. If you draw your content using [render] method, in this callback you should
+ * schedule the next [render] in your rendering loop.
+ */
+ constructor(
+ coroutineContext: CoroutineContext = EmptyDispatcher,
+ density: Density = Density(1f),
+ invalidate: () -> Unit = {}
+ ) : this(
+ coroutineContext,
+ DummyDesktopComponent,
+ density,
+ invalidate
+ )
+
+ private var isInvalidationDisabled = false
+
+ @Volatile
+ private var hasPendingDraws = true
+ private inline fun postponeInvalidation(block: () -> Unit) {
+ isInvalidationDisabled = true
+ try {
+ block()
+ } finally {
+ isInvalidationDisabled = false
+ }
+ invalidateIfNeeded()
+ }
+
+ private fun invalidateIfNeeded() {
+ hasPendingDraws = frameClock.hasAwaiters || list.any(DesktopOwner::needsRender)
+ if (hasPendingDraws && !isInvalidationDisabled) {
+ invalidate()
+ }
+ }
+
+ private val list = LinkedHashSet<DesktopOwner>()
+ private val listCopy = mutableListOf<DesktopOwner>()
+
+ private inline fun forEachOwner(action: (DesktopOwner) -> Unit) {
+ listCopy.addAll(list)
+ listCopy.forEach(action)
+ listCopy.clear()
+ }
+
+ /**
+ * All currently registered [DesktopRootForTest]s. After calling [setContent] the first root
+ * will be added. If there is an any [Popup] is present in the content, it will be added as
+ * another [DesktopRootForTest]
+ */
+ val roots: Set<RootForTest> get() = list
+
+ private var pointerId = 0L
+ private var isMousePressed = false
+
+ private val job = Job()
+ private val dispatcher = FlushCoroutineDispatcher(CoroutineScope(coroutineContext + job))
+ private val frameClock = BroadcastFrameClock(onNewAwaiters = ::invalidateIfNeeded)
+ private val coroutineScope = CoroutineScope(coroutineContext + job + dispatcher + frameClock)
+
+ private val recomposer = Recomposer(coroutineScope.coroutineContext)
+ internal val platformInputService: DesktopPlatformInput = DesktopPlatformInput(component)
+
+ private var mainOwner: DesktopOwner? = null
+ private var composition: Composition? = null
+
+ /**
+ * Density of the content which will be used to convert [dp] units.
+ */
+ var density: Density = density
+ set(value) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ field = value
+ mainOwner?.density = value
+ }
+
+ private var isDisposed = false
+
+ init {
+ GlobalSnapshotManager.ensureStarted()
+ coroutineScope.launch(start = CoroutineStart.UNDISPATCHED) {
+ recomposer.runRecomposeAndApplyChanges()
+ }
+ }
+
+ /**
+ * Close all resources and subscriptions. Not calling this method when [ComposeScene] is no
+ * longer needed will cause a memory leak.
+ *
+ * All effects launched via [LaunchedEffect] or [rememberCoroutineScope] will be cancelled
+ * (but not immediately).
+ *
+ * After calling this method, you cannot call any other method of this [ComposeScene].
+ */
+ fun dispose() {
+ composition?.dispose()
+ mainOwner?.dispose()
+ recomposer.cancel()
+ job.cancel()
+ isDisposed = true
+ }
+
+ private fun dispatchCommand(command: () -> Unit) {
+ coroutineScope.launch {
+ command()
+ }
+ }
+
+ /**
+ * Returns true if there are pending recompositions, renders or dispatched tasks.
+ * Can be called from any thread.
+ */
+ fun hasInvalidations() = hasPendingDraws ||
+ recomposer.hasPendingWork ||
+ dispatcher.hasTasks()
+
+ internal fun attach(desktopOwner: DesktopOwner) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ list.add(desktopOwner)
+ desktopOwner.onNeedsRender = ::invalidateIfNeeded
+ desktopOwner.onDispatchCommand = ::dispatchCommand
+ desktopOwner.constraints = constraints
+ invalidateIfNeeded()
+ if (desktopOwner.isFocusable) {
+ focusedOwner = desktopOwner
+ }
+ }
+
+ internal fun detach(desktopOwner: DesktopOwner) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ list.remove(desktopOwner)
+ desktopOwner.onDispatchCommand = null
+ desktopOwner.onNeedsRender = null
+ invalidateIfNeeded()
+ if (desktopOwner == focusedOwner) {
+ focusedOwner = list.lastOrNull { it.isFocusable }
+ }
+ }
+
+ /**
+ * Update the composition with the content described by the [content] composable. After this
+ * has been called the changes to produce the initial composition has been calculated and
+ * applied to the composition.
+ *
+ * Will throw an [IllegalStateException] if the composition has been disposed.
+ *
+ * @param content Content of the [ComposeScene]
+ */
+ fun setContent(
+ content: @Composable () -> Unit
+ ) = setContent(
+ parentComposition = null,
+ content = content
+ )
+
+ // TODO(demin): We should configure routing of key events if there
+ // are any popups/root present:
+ // - ComposeScene.sendKeyEvent
+ // - ComposeScene.onPreviewKeyEvent (or Window.onPreviewKeyEvent)
+ // - Popup.onPreviewKeyEvent
+ // - NestedPopup.onPreviewKeyEvent
+ // - NestedPopup.onKeyEvent
+ // - Popup.onKeyEvent
+ // - ComposeScene.onKeyEvent
+ // Currently we have this routing:
+ // - [active Popup or the main content].onPreviewKeyEvent
+ // - [active Popup or the main content].onKeyEvent
+ // After we change routing, we can remove onPreviewKeyEvent/onKeyEvent from this method
+ internal fun setContent(
+ parentComposition: CompositionContext? = null,
+ onPreviewKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
+ onKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
+ content: @Composable () -> Unit
+ ) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ composition?.dispose()
+ mainOwner?.dispose()
+ val mainOwner = DesktopOwner(
+ platformInputService,
+ density,
+ onPreviewKeyEvent = onPreviewKeyEvent,
+ onKeyEvent = onKeyEvent
+ )
+ attach(mainOwner)
+ composition = mainOwner.setContent(parentComposition ?: recomposer) {
+ CompositionLocalProvider(
+ LocalComposeScene provides this,
+ content = content
+ )
+ }
+ this.mainOwner = mainOwner
+
+ // to perform all pending work synchronously. to start LaunchedEffect for example
+ dispatcher.flush()
+ }
+
+ /**
+ * Set constraints, which will be used to measure and layout content.
+ */
+ var constraints: Constraints = Constraints()
+ set(value) {
+ field = value
+ forEachOwner {
+ it.constraints = constraints
+ }
+ }
+
+ /**
+ * Returns the current content size
+ */
+ val contentSize: IntSize
+ get() {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ val mainOwner = mainOwner ?: return IntSize.Zero
+ mainOwner.measureAndLayout()
+ return IntSize(mainOwner.root.width, mainOwner.root.height)
+ }
+
+ /**
+ * Render the current content on [canvas]. Passed [nanoTime] will be used to drive all
+ * animations in the content (or any other code, which uses [withFrameNanos]
+ */
+ fun render(canvas: Canvas, nanoTime: Long) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ postponeInvalidation {
+ // TODO(https://github.com/JetBrains/compose-jb/issues/1135):
+ // Temporarily workaround for flaky tests in WithComposeUiTest.
+ // It fails when we remove synchronized and run:
+ // ./gradlew desktopTest -Pandroidx.compose.multiplatformEnabled=true
+ // We should make a minimal reproducer, and fix race condition somewhere
+ // else, not here.
+ // See also GlobalSnapshotManager.
+ synchronized(Snapshot.current) {
+ // We must see the actual state before we will render the frame
+ Snapshot.sendApplyNotifications()
+ dispatcher.flush()
+ frameClock.sendFrame(nanoTime)
+ }
+
+ forEachOwner {
+ it.render(canvas)
+ }
+ }
+ }
+
+ private var focusedOwner: DesktopOwner? = null
+ private val hoveredOwner: DesktopOwner?
+ get() = list.lastOrNull { it.isHovered(pointLocation) } ?: list.lastOrNull()
+
+ private fun DesktopOwner?.isAbove(
+ targetOwner: DesktopOwner?
+ ) = list.indexOf(this) > list.indexOf(targetOwner)
+
+ // TODO(demin): return Boolean (when it is consumed).
+ // see ComposeLayer todo about AWTDebounceEventQueue
+ /**
+ * Send pointer event to the content.
+ *
+ * @param eventType Indicates the primary reason that the event was sent.
+ * @param position The [Offset] of the current pointer event, relative to the content.
+ * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
+ * is platform-dependent.
+ * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
+ * or [touch][PointerType.Touch].
+ * @param mouseEvent The original native event.
+ */
+ @OptIn(ExperimentalComposeUiApi::class)
+ fun sendPointerEvent(
+ eventType: PointerEventType,
+ position: Offset,
+ timeMillis: Long = System.nanoTime() / 1_000_000L,
+ type: PointerType = PointerType.Mouse,
+ mouseEvent: MouseEvent? = null,
+ // TODO(demin): support PointerButtons, PointerKeyboardModifiers
+// buttons: PointerButtons? = null,
+// keyboardModifiers: PointerKeyboardModifiers? = null,
+ ) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ when (eventType) {
+ PointerEventType.Press -> isMousePressed = true
+ PointerEventType.Release -> isMousePressed = false
+ }
+ val event = pointerInputEvent(
+ eventType, position, timeMillis, mouseEvent, type, isMousePressed, pointerId
+ )
+ when (eventType) {
+ PointerEventType.Press -> onMousePressed(event)
+ PointerEventType.Release -> onMouseReleased(event)
+ PointerEventType.Move -> {
+ pointLocation = position
+ hoveredOwner?.processPointerInput(event)
+ }
+ PointerEventType.Enter -> hoveredOwner?.processPointerInput(event)
+ PointerEventType.Exit -> hoveredOwner?.processPointerInput(event)
+ }
+ }
+
+ // TODO(demin): remove/change when we will have scroll event support in the common code
+ // TODO(demin): return Boolean (when it is consumed).
+ // see ComposeLayer todo about AWTDebounceEventQueue
+ /**
+ * Send pointer scroll event to the content.
+ *
+ * @param position The [Offset] of the current pointer event, relative to the content
+ * @param delta Change of mouse scroll.
+ * Positive if scrolling down, negative if scrolling up.
+ * @param orientation Orientation in which scrolling event occurs.
+ * Up/down wheel scrolling causes events in vertical orientation.
+ * Left/right wheel scrolling causes events in horizontal orientation.
+ * @param timeMillis The time of the current pointer event, in milliseconds. The start (`0`) time
+ * is platform-dependent.
+ * @param type The device type that produced the event, such as [mouse][PointerType.Mouse],
+ * or [touch][PointerType.Touch].
+ * @param mouseEvent The original native event
+ */
+ @OptIn(ExperimentalComposeUiApi::class)
+ @Suppress("UNUSED_PARAMETER")
+ @ExperimentalComposeUiApi // it is more experimental than ComposeScene itself
+ fun sendPointerScrollEvent(
+ position: Offset,
+ delta: MouseScrollUnit,
+ orientation: MouseScrollOrientation = MouseScrollOrientation.Vertical,
+ timeMillis: Long = System.nanoTime() / 1_000_000L,
+ type: PointerType = PointerType.Mouse,
+ mouseEvent: MouseEvent? = null,
+// buttons: PointerButtons? = null,
+// keyboardModifiers: PointerKeyboardModifiers? = null,
+ ) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ hoveredOwner?.onMouseScroll(position, MouseScrollEvent(delta, orientation))
+ }
+
+ private fun onMousePressed(event: PointerInputEvent) {
+ val currentOwner = hoveredOwner
+ if (currentOwner != null) {
+ if (focusedOwner.isAbove(currentOwner)) {
+ focusedOwner?.onDismissRequest?.invoke()
+ } else {
+ currentOwner.processPointerInput(event)
+ }
+ } else {
+ focusedOwner?.processPointerInput(event)
+ }
+ }
+
+ private fun onMouseReleased(event: PointerInputEvent) {
+ val owner = hoveredOwner ?: focusedOwner
+ owner?.processPointerInput(event)
+ pointerId += 1
+ }
+
+ private var pointLocation = Offset.Zero
+
+ /**
+ * Send [KeyEvent] to the content.
+ * @return true if the event was consumed by the content
+ */
+ fun sendKeyEvent(event: ComposeKeyEvent): Boolean {
+ return focusedOwner?.sendKeyEvent(event) == true
+ }
+
+ internal fun onInputMethodEvent(event: InputMethodEvent) {
+ check(!isDisposed) { "ComposeScene is disposed" }
+ if (!event.isConsumed) {
+ when (event.id) {
+ InputMethodEvent.INPUT_METHOD_TEXT_CHANGED -> {
+ platformInputService.replaceInputMethodText(event)
+ event.consume()
+ }
+ InputMethodEvent.CARET_POSITION_CHANGED -> {
+ platformInputService.inputMethodCaretPositionChanged(event)
+ event.consume()
+ }
+ }
+ }
+ }
+}
+
+private fun pointerInputEvent(
+ eventType: PointerEventType,
+ position: Offset,
+ timeMillis: Long,
+ nativeEvent: MouseEvent?,
+ type: PointerType,
+ isMousePressed: Boolean,
+ pointerId: Long
+): PointerInputEvent {
+ return PointerInputEvent(
+ eventType,
+ timeMillis,
+ listOf(
+ PointerInputEventData(
+ PointerId(pointerId),
+ timeMillis,
+ position,
+ position,
+ isMousePressed,
+ type
+ )
+ ),
+ nativeEvent
+ )
+}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
index 37fa9bd..540d5da 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/ConfigureSwingGlobalsForCompose.desktop.kt
@@ -34,9 +34,17 @@
* Should be called before using any class from `java.swing.*`
* (even before SwingUtilities.invokeLater or Dispatchers.Swing)
*/
-fun configureSwingGlobalsForCompose() {
- System.setProperty("skiko.rendering.laf.global", "true")
- System.setProperty("skiko.rendering.useScreenMenuBar", "true")
- System.setProperty("skiko.linux.autodpi", "true")
+@ExperimentalComposeUiApi
+fun configureSwingGlobalsForCompose(
+ overrideLookAndFeel: Boolean =
+ System.getProperty("skiko.rendering.laf.global", "true") == "true",
+ useScreenMenuBarOnMacOs: Boolean =
+ System.getProperty("skiko.rendering.useScreenMenuBar", "true") == "true",
+ useAutoDpiOnLinux: Boolean =
+ System.getProperty("skiko.linux.autodpi", "true") == "true",
+) {
+ System.setProperty("skiko.rendering.laf.global", overrideLookAndFeel.toString())
+ System.setProperty("skiko.rendering.useScreenMenuBar", useScreenMenuBarOnMacOs.toString())
+ System.setProperty("skiko.linux.autodpi", useAutoDpiOnLinux.toString())
Library.staticLoad()
}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
index 6f6d33f..0cc346a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeDialog.desktop.kt
@@ -17,6 +17,7 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionContext
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.window.DialogWindowScope
import androidx.compose.ui.window.UndecoratedWindowResizer
@@ -50,6 +51,21 @@
/**
* Composes the given composable into the ComposeDialog.
*
+ * @param content Composable content of the ComposeDialog.
+ */
+ @OptIn(ExperimentalComposeUiApi::class)
+ fun setContent(
+ content: @Composable DialogWindowScope.() -> Unit
+ ) = setContent(
+ parentComposition = null,
+ onPreviewKeyEvent = { false },
+ onKeyEvent = { false },
+ content = content
+ )
+
+ /**
+ * Composes the given composable into the ComposeDialog.
+ *
* The new composition can be logically "linked" to an existing one, by providing a
* [parentComposition]. This will ensure that invalidations and CompositionLocals will flow
* through the two compositions as if they were not separate.
@@ -67,6 +83,7 @@
* If you return false, the key event will be sent to this [onKeyEvent]'s parent.
* @param content Composable content of the ComposeWindow.
*/
+ @ExperimentalComposeUiApi
fun setContent(
parentComposition: CompositionContext? = null,
onPreviewKeyEvent: ((KeyEvent) -> Boolean) = { false },
@@ -111,7 +128,7 @@
/**
* Retrieve underlying platform-specific operating system handle for the root window where
- * ComposeDialog is rendered. Currently returns HWND on Windows, Display on X11 and NSWindow
+ * ComposeDialog is rendered. Currently returns HWND on Windows, Window on X11 and NSWindow
* on macOS.
*/
val windowHandle: Long get() = delegate.windowHandle
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
index acc12ff..6f11256 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeLayer.desktop.kt
@@ -17,25 +17,25 @@
package androidx.compose.ui.awt
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.Composition
import androidx.compose.runtime.CompositionContext
-import androidx.compose.ui.input.mouse.MouseScrollEvent
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.input.mouse.MouseScrollOrientation
import androidx.compose.ui.input.mouse.MouseScrollUnit
+import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.PointerType
import androidx.compose.ui.platform.DesktopComponent
-import androidx.compose.ui.platform.DesktopOwner
-import androidx.compose.ui.platform.DesktopOwners
-import androidx.compose.ui.platform.setContent
+import androidx.compose.ui.ComposeScene
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import androidx.compose.ui.window.density
-import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.cancel
import kotlinx.coroutines.swing.Swing
import org.jetbrains.skia.Canvas
import org.jetbrains.skiko.SkiaLayer
import org.jetbrains.skiko.SkiaRenderer
import java.awt.Dimension
+import java.awt.Graphics
import java.awt.Point
import java.awt.event.FocusEvent
import java.awt.event.InputMethodEvent
@@ -52,47 +52,35 @@
internal class ComposeLayer {
private var isDisposed = false
- private val coroutineScope = CoroutineScope(Dispatchers.Swing)
// TODO(demin): probably we need to get rid of asynchronous events. it was added because of
// slow lazy scroll. But events become unpredictable, and we can't consume them.
// Alternative solution to a slow scroll - merge multiple scroll events into a single one.
private val events = AWTDebounceEventQueue()
- internal val wrapped = Wrapped().apply {
- onStateChanged(SkiaLayer.PropertyKind.ContentScale) { _ ->
- resetDensity()
- }
- }
+ private val _component = ComponentImpl()
+ val component: SkiaLayer get() = _component
- internal val owners: DesktopOwners = DesktopOwners(
- coroutineScope,
- wrapped,
- wrapped::needRedraw
+ private val scene = ComposeScene(
+ Dispatchers.Swing,
+ _component,
+ Density(1f),
+ _component::needRedraw
)
- private var owner: DesktopOwner? = null
- private var composition: Composition? = null
+ private val density get() = _component.density.density
- private var initOwner: (() -> Unit)? = null
-
- private lateinit var density: Density
-
- inner class Wrapped : SkiaLayer(), DesktopComponent {
+ private inner class ComponentImpl : SkiaLayer(), DesktopComponent {
var currentInputMethodRequests: InputMethodRequests? = null
- var isInit = false
- private set
-
- override fun init() {
- super.init()
- isInit = true
+ override fun addNotify() {
+ super.addNotify()
resetDensity()
- initOwner?.invoke()
+ initContent()
}
- internal fun resetDensity() {
- this@ComposeLayer.density = (this as SkiaLayer).density
- owner?.density = density
+ override fun paint(g: Graphics) {
+ resetDensity()
+ super.paint(g)
}
override fun getInputMethodRequests() = currentInputMethodRequests
@@ -108,39 +96,39 @@
currentInputMethodRequests = null
}
+ override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
+ this@ComposeLayer.scene.constraints = Constraints(
+ maxWidth = (width * density.density).toInt().coerceAtLeast(0),
+ maxHeight = (height * density.density).toInt().coerceAtLeast(0)
+ )
+ super.setBounds(x, y, width, height)
+ }
+
override fun doLayout() {
super.doLayout()
- val owner = owner
- if (owner != null) {
- val density = density.density
- owner.setSize(
- (width * density).toInt().coerceAtLeast(0),
- (height * density).toInt().coerceAtLeast(0)
- )
- owner.measureAndLayout()
- preferredSize = Dimension(
- (owner.root.width / density).toInt(),
- (owner.root.height / density).toInt()
- )
- }
+ preferredSize = Dimension(
+ (this@ComposeLayer.scene.contentSize.width / density.density).toInt(),
+ (this@ComposeLayer.scene.contentSize.height / density.density).toInt()
+ )
}
override val locationOnScreen: Point
@Suppress("ACCIDENTAL_OVERRIDE") // KT-47743
get() = super.getLocationOnScreen()
- override val density: Density
- get() = this@ComposeLayer.density
+ override var density: Density = Density(1f)
+
+ private fun resetDensity() {
+ density = (this as SkiaLayer).density
+ this@ComposeLayer.scene.density = density
+ }
}
- val component: SkiaLayer
- get() = wrapped
-
init {
- wrapped.renderer = object : SkiaRenderer {
+ _component.renderer = object : SkiaRenderer {
override fun onRender(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
try {
- owners.onFrame(canvas, width, height, nanoTime)
+ scene.render(canvas, nanoTime)
} catch (e: Throwable) {
if (System.getProperty("compose.desktop.render.ignore.errors") == null) {
throw e
@@ -148,155 +136,157 @@
}
}
}
- initCanvas()
- }
- private fun initCanvas() {
- wrapped.addInputMethodListener(object : InputMethodListener {
+ _component.addInputMethodListener(object : InputMethodListener {
override fun caretPositionChanged(event: InputMethodEvent?) {
if (event != null) {
- owners.onInputMethodEvent(event)
+ scene.onInputMethodEvent(event)
}
}
override fun inputMethodTextChanged(event: InputMethodEvent) = events.post {
- owners.onInputMethodEvent(event)
+ scene.onInputMethodEvent(event)
}
})
- wrapped.addMouseListener(object : MouseAdapter() {
+ _component.addMouseListener(object : MouseAdapter() {
override fun mouseClicked(event: MouseEvent) = Unit
override fun mousePressed(event: MouseEvent) = events.post {
- owners.onMousePressed(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event
- )
+ scene.onMouseEvent(density, event)
}
override fun mouseReleased(event: MouseEvent) = events.post {
- owners.onMouseReleased(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event
- )
+ scene.onMouseEvent(density, event)
}
override fun mouseEntered(event: MouseEvent) = events.post {
- owners.onMouseEntered(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event
- )
+ scene.onMouseEvent(density, event)
}
override fun mouseExited(event: MouseEvent) = events.post {
- owners.onMouseExited(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event
- )
+ scene.onMouseEvent(density, event)
}
})
- wrapped.addMouseMotionListener(object : MouseMotionAdapter() {
+ _component.addMouseMotionListener(object : MouseMotionAdapter() {
override fun mouseDragged(event: MouseEvent) = events.post {
- owners.onMouseMoved(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event
- )
+ scene.onMouseEvent(density, event)
}
override fun mouseMoved(event: MouseEvent) = events.post {
- owners.onMouseMoved(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event
- )
+ scene.onMouseEvent(density, event)
}
})
- wrapped.addMouseWheelListener { event ->
+ _component.addMouseWheelListener { event ->
events.post {
- owners.onMouseScroll(
- (event.x * density.density).toInt(),
- (event.y * density.density).toInt(),
- event.toComposeEvent()
- )
+ scene.onMouseWheelEvent(density, event)
}
}
- wrapped.focusTraversalKeysEnabled = false
- wrapped.addKeyListener(object : KeyAdapter() {
+ _component.focusTraversalKeysEnabled = false
+ _component.addKeyListener(object : KeyAdapter() {
override fun keyPressed(event: KeyEvent) {
- if (owners.onKeyPressed(event)) {
- event.consume()
- }
+ scene.sendKeyEvent(event)
}
override fun keyReleased(event: KeyEvent) {
- if (owners.onKeyReleased(event)) {
- event.consume()
- }
+ scene.sendKeyEvent(event)
}
override fun keyTyped(event: KeyEvent) {
- if (owners.onKeyTyped(event)) {
- event.consume()
- }
+ scene.sendKeyEvent(event)
}
})
}
- private fun MouseWheelEvent.toComposeEvent() = MouseScrollEvent(
- delta = if (scrollType == MouseWheelEvent.WHEEL_BLOCK_SCROLL) {
- MouseScrollUnit.Page((scrollAmount * preciseWheelRotation).toFloat())
- } else {
- MouseScrollUnit.Line((scrollAmount * preciseWheelRotation).toFloat())
- },
-
- // There are no other way to detect horizontal scrolling in AWT
- orientation = if (isShiftDown) {
- MouseScrollOrientation.Horizontal
- } else {
- MouseScrollOrientation.Vertical
- }
- )
-
fun dispose() {
check(!isDisposed)
- composition?.dispose()
- owner?.dispose()
- owners.dispose()
+ scene.dispose()
events.cancel()
- coroutineScope.cancel()
- wrapped.dispose()
- initOwner = null
+ _component.dispose()
+ _initContent = null
isDisposed = true
}
- internal fun setContent(
+ fun setContent(
parentComposition: CompositionContext? = null,
onPreviewKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
onKeyEvent: (ComposeKeyEvent) -> Boolean = { false },
content: @Composable () -> Unit
) {
- check(!isDisposed)
- check(composition == null && initOwner == null) { "Cannot set content twice" }
- initOwner = {
- check(!isDisposed)
- if (wrapped.isInit && owner == null) {
- owner = DesktopOwner(
- owners,
- density,
- onPreviewKeyEvent = onPreviewKeyEvent,
- onKeyEvent = onKeyEvent
- )
- composition = owner!!.setContent(parent = parentComposition, content = content)
- initOwner = null
- }
+ // If we call it before attaching, everything probably will be fine,
+ // but the first composition will be useless, as we set density=1
+ // (we don't know the real density if we have unattached component)
+ _initContent = {
+ scene.setContent(
+ parentComposition,
+ onPreviewKeyEvent = onPreviewKeyEvent,
+ onKeyEvent = onKeyEvent,
+ content = content
+ )
}
- // We can't create DesktopOwner now, because we don't know density yet.
- // We will know density only after SkiaLayer will be visible.
- initOwner!!()
+ initContent()
+ }
+
+ private var _initContent: (() -> Unit)? = null
+
+ private fun initContent() {
+ if (_component.isDisplayable) {
+ _initContent?.invoke()
+ _initContent = null
+ }
}
}
+
+@Suppress("ControlFlowWithEmptyBody")
+@OptIn(ExperimentalComposeUiApi::class)
+private fun ComposeScene.onMouseEvent(
+ density: Float,
+ event: MouseEvent
+) {
+ val eventType = when (event.id) {
+ MouseEvent.MOUSE_PRESSED -> PointerEventType.Press
+ MouseEvent.MOUSE_RELEASED -> PointerEventType.Release
+ MouseEvent.MOUSE_DRAGGED -> PointerEventType.Move
+ MouseEvent.MOUSE_MOVED -> PointerEventType.Move
+ MouseEvent.MOUSE_ENTERED -> PointerEventType.Enter
+ MouseEvent.MOUSE_EXITED -> PointerEventType.Exit
+ else -> PointerEventType.Unknown
+ }
+ sendPointerEvent(
+ eventType = eventType,
+ position = Offset(event.x.toFloat(), event.y.toFloat()) * density,
+ timeMillis = event.`when`,
+ type = PointerType.Mouse,
+ mouseEvent = event
+ )
+}
+
+@Suppress("ControlFlowWithEmptyBody")
+@OptIn(ExperimentalComposeUiApi::class)
+private fun ComposeScene.onMouseWheelEvent(
+ density: Float,
+ event: MouseWheelEvent
+) = with(event) {
+ sendPointerScrollEvent(
+ position = Offset(event.x.toFloat(), event.y.toFloat()) * density,
+ delta = if (scrollType == MouseWheelEvent.WHEEL_BLOCK_SCROLL) {
+ MouseScrollUnit.Page((scrollAmount * preciseWheelRotation).toFloat())
+ } else {
+ MouseScrollUnit.Line((scrollAmount * preciseWheelRotation).toFloat())
+ },
+ // There are no other way to detect horizontal scrolling in AWT
+ orientation = if (isShiftDown) {
+ MouseScrollOrientation.Horizontal
+ } else {
+ MouseScrollOrientation.Vertical
+ },
+ timeMillis = event.`when`,
+ type = PointerType.Mouse,
+ mouseEvent = event
+ )
+}
+
+@OptIn(ExperimentalComposeUiApi::class)
+private fun ComposeScene.sendKeyEvent(event: KeyEvent) {
+ sendKeyEvent(ComposeKeyEvent(event))
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt
index cf49721..7bc1a3c 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposePanel.desktop.kt
@@ -43,11 +43,11 @@
private var content: (@Composable () -> Unit)? = null
override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
- layer?.wrapped?.setSize(width, height)
+ layer?.component?.setSize(width, height)
super.setBounds(x, y, width, height)
}
- override fun getPreferredSize() = layer?.wrapped?.preferredSize
+ override fun getPreferredSize() = layer?.component?.preferredSize
/**
* Sets Compose content of the ComposePanel.
@@ -80,12 +80,12 @@
}
val clipComponent = ClipComponent(component)
clipMap.put(component, clipComponent)
- layer!!.wrapped.clipComponents.add(clipComponent)
+ layer!!.component.clipComponents.add(clipComponent)
return super.add(component, Integer.valueOf(0))
}
override fun remove(component: Component) {
- layer!!.wrapped.clipComponents.remove(clipMap.get(component)!!)
+ layer!!.component.clipComponents.remove(clipMap.get(component)!!)
clipMap.remove(component)
super.remove(component)
}
@@ -96,7 +96,7 @@
// After [super.addNotify] is called we can safely initialize the layer and composable
// content.
layer = ComposeLayer().apply {
- wrapped.setSize(width, height)
+ component.setSize(width, height)
}
initContent()
super.add(layer!!.component, Integer.valueOf(1))
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
index 9ba240f..c94fb24 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindow.desktop.kt
@@ -17,6 +17,7 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionContext
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.window.FrameWindowScope
import androidx.compose.ui.window.UndecoratedWindowResizer
@@ -47,6 +48,21 @@
/**
* Composes the given composable into the ComposeWindow.
*
+ * @param content Composable content of the ComposeWindow.
+ */
+ @OptIn(ExperimentalComposeUiApi::class)
+ fun setContent(
+ content: @Composable FrameWindowScope.() -> Unit
+ ) = setContent(
+ parentComposition = null,
+ onPreviewKeyEvent = { false },
+ onKeyEvent = { false },
+ content = content
+ )
+
+ /**
+ * Composes the given composable into the ComposeWindow.
+ *
* The new composition can be logically "linked" to an existing one, by providing a
* [parentComposition]. This will ensure that invalidations and CompositionLocals will flow
* through the two compositions as if they were not separate.
@@ -64,6 +80,7 @@
* If you return false, the key event will be sent to this [onKeyEvent]'s parent.
* @param content Composable content of the ComposeWindow.
*/
+ @ExperimentalComposeUiApi
fun setContent(
parentComposition: CompositionContext? = null,
onPreviewKeyEvent: (KeyEvent) -> Boolean = { false },
@@ -164,7 +181,7 @@
/**
* Retrieve underlying platform-specific operating system handle for the root window where
- * ComposeWindow is rendered. Currently returns HWND on Windows, Display on X11 and NSWindow
+ * ComposeWindow is rendered. Currently returns HWND on Windows, Window on X11 and NSWindow
* on macOS.
*/
val windowHandle: Long get() = delegate.windowHandle
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt
index ce63cab..4fa38d2 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/awt/ComposeWindowDelegate.desktop.kt
@@ -37,29 +37,29 @@
val layer = ComposeLayer()
val pane = object : JLayeredPane() {
override fun setBounds(x: Int, y: Int, width: Int, height: Int) {
- layer.wrapped.setSize(width, height)
+ layer.component.setSize(width, height)
super.setBounds(x, y, width, height)
}
override fun add(component: Component): Component {
val clipComponent = ClipComponent(component)
clipMap[component] = clipComponent
- layer.wrapped.clipComponents.add(clipComponent)
+ layer.component.clipComponents.add(clipComponent)
return add(component, Integer.valueOf(0))
}
override fun remove(component: Component) {
- layer.wrapped.clipComponents.remove(clipMap[component]!!)
+ layer.component.clipComponents.remove(clipMap[component]!!)
clipMap.remove(component)
super.remove(component)
}
override fun addNotify() {
super.addNotify()
- layer.wrapped.requestFocus()
+ layer.component.requestFocus()
}
- override fun getPreferredSize() = layer.wrapped.preferredSize
+ override fun getPreferredSize() = layer.component.preferredSize
}
private val clipMap = mutableMapOf<Component, ClipComponent>()
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.desktop.kt
index a81e684..4cce567 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilter.desktop.kt
@@ -14,9 +14,12 @@
* limitations under the License.
*/
+@file:OptIn(ExperimentalComposeUiApi::class)
+
package androidx.compose.ui.input.mouse
import androidx.compose.runtime.remember
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.composed
import androidx.compose.ui.input.pointer.PointerInputModifier
@@ -28,6 +31,7 @@
/**
* Indicates distance by which we should scroll some container.
*/
+@ExperimentalComposeUiApi
sealed class MouseScrollUnit {
/**
* Indicates that scrolling should be performed by [value] lines.
@@ -38,6 +42,7 @@
* dependent on the container's bounds (in which scroll event occurs),
* or by one real text line in some document.
*/
+ @ExperimentalComposeUiApi
data class Line(val value: Float) : MouseScrollUnit()
/**
@@ -48,12 +53,14 @@
* Scrolling by one page usually means that we should scroll by one container's height
* (in which scroll event occurs), or by one real page in some document.
*/
+ @ExperimentalComposeUiApi
data class Page(val value: Float) : MouseScrollUnit()
}
/**
* Mouse wheel or touchpad event.
*/
+@ExperimentalComposeUiApi
class MouseScrollEvent(
/**
* Change of mouse scroll.
@@ -80,6 +87,7 @@
* While implementing this callback, return true to stop propagation of this event. If you return
* false, the scroll event will be sent to this [mouseScrollFilter]'s parent.
*/
+@ExperimentalComposeUiApi
fun Modifier.mouseScrollFilter(
onMouseScroll: (
/**
@@ -118,6 +126,7 @@
override val pointerInputFilter: PointerInputFilter
) : PointerInputModifier
+@ExperimentalComposeUiApi
enum class MouseScrollOrientation {
Vertical, Horizontal
}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/DesktopMouse.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/DesktopMouse.kt
deleted file mode 100644
index 8b13789..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/DesktopMouse.kt
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
index cc1fc6d..f78bbf4 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/InternalPointerEvent.desktop.kt
@@ -19,11 +19,16 @@
import java.awt.event.MouseEvent
internal actual class InternalPointerEvent constructor(
+ val type: PointerEventType,
actual val changes: Map<PointerId, PointerInputChange>,
val mouseEvent: MouseEvent?
) {
actual constructor(
changes: Map<PointerId, PointerInputChange>,
pointerInputEvent: PointerInputEvent
- ) : this(changes, pointerInputEvent.mouseEvent)
+ ) : this(
+ pointerInputEvent.eventType,
+ changes,
+ pointerInputEvent.mouseEvent
+ )
}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt
index cf01480..01f8d62 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerEvent.desktop.kt
@@ -42,7 +42,9 @@
internal actual constructor(
changes: List<PointerInputChange>,
internalPointerEvent: InternalPointerEvent?
- ) : this(changes, internalPointerEvent?.mouseEvent)
+ ) : this(changes, internalPointerEvent?.mouseEvent) {
+ this.type = internalPointerEvent?.type ?: PointerEventType.Unknown
+ }
actual val buttons = PointerButtons(mouseEvent?.modifiersEx ?: 0)
@@ -53,7 +55,8 @@
*/
actual constructor(changes: List<PointerInputChange>) : this(changes, mouseEvent = null)
- actual var type: PointerEventType = calculatePointerEventType()
+ actual var type: PointerEventType = PointerEventType.Unknown
+ internal set
private fun createPointerKeyboardModifiers(modifiersEx: Int): PointerKeyboardModifiers {
val toolkit = Toolkit.getDefaultToolkit()
@@ -65,19 +68,6 @@
val packed = (modifiersEx and ClearMask) or capsLockBits or numLockBits or scrollLockBits
return PointerKeyboardModifiers(packed)
}
-
- private fun calculatePointerEventType(): PointerEventType {
- val event = mouseEvent ?: return PointerEventType.Unknown
- return when (event.getID()) {
- MouseEvent.MOUSE_PRESSED -> PointerEventType.Press
- MouseEvent.MOUSE_RELEASED -> PointerEventType.Release
- MouseEvent.MOUSE_MOVED,
- MouseEvent.MOUSE_DRAGGED -> PointerEventType.Move
- MouseEvent.MOUSE_ENTERED -> PointerEventType.Enter
- MouseEvent.MOUSE_EXITED -> PointerEventType.Exit
- else -> PointerEventType.Unknown
- }
- }
}
private fun Toolkit.getMaskForLockingKeyState(event: Int, mask: Int): Int {
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt
index 860f20f..ad14344 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerInputEvent.desktop.kt
@@ -16,10 +16,12 @@
package androidx.compose.ui.input.pointer
+import androidx.compose.ui.InternalComposeUiApi
import androidx.compose.ui.geometry.Offset
import java.awt.event.MouseEvent
internal actual class PointerInputEvent(
+ val eventType: PointerEventType,
actual val uptime: Long,
actual val pointers: List<PointerInputEventData>,
val mouseEvent: MouseEvent? = null
@@ -28,6 +30,7 @@
/**
* This exposes PointerInputEventData for testing purposes.
*/
+@InternalComposeUiApi
class TestPointerInputEventData(
val id: PointerId,
val uptime: Long,
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt
index 3130b93..28e44d1 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/input/pointer/PointerMoveFilter.desktop.kt
@@ -16,6 +16,7 @@
package androidx.compose.ui.input.pointer
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset
@@ -26,6 +27,7 @@
* @param onEnter The callback invoked when pointer enters the component
* @param onExit The callback invoked when pointer leaves the component
*/
+@ExperimentalComposeUiApi
fun Modifier.pointerMoveFilter(
onMove: (position: Offset) -> Boolean = { false },
onExit: () -> Boolean = { false },
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.desktop.kt
similarity index 80%
rename from compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt
rename to compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.desktop.kt
index 88406a1..56eb7ea 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/FlushCoroutineDispatcher.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/CoroutineDispatchers.desktop.kt
@@ -23,6 +23,11 @@
import kotlinx.coroutines.launch
import kotlin.coroutines.CoroutineContext
+@PublishedApi
+internal val EmptyDispatcher = object : CoroutineDispatcher() {
+ override fun dispatch(context: CoroutineContext, block: Runnable) = Unit
+}
+
/**
* Dispatcher with the ability to immediately perform (flush) all pending tasks.
* Without a flush all tasks are dispatched in the dispatcher provided by [scope]
@@ -35,15 +40,19 @@
// TODO replace it by scope.coroutineContext[Dispatcher] when it will be no longer experimental
private val scope = CoroutineScope(scope.coroutineContext.minusKey(Job))
- private val tasks = ArrayList<Runnable>()
- private val tasksCopy = ArrayList<Runnable>()
+ private val tasks = mutableSetOf<Runnable>()
+ private val tasksCopy = mutableSetOf<Runnable>()
override fun dispatch(context: CoroutineContext, block: Runnable) {
synchronized(tasks) {
- val isFlushScheduled = tasks.isNotEmpty()
tasks.add(block)
- if (!isFlushScheduled) {
- scope.launch { flush() }
+ }
+ scope.launch {
+ val isTaskAlive = synchronized(tasks) {
+ tasks.remove(block)
+ }
+ if (isTaskAlive) {
+ block.run()
}
}
}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
index f627435..0525ec1 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwner.desktop.kt
@@ -22,6 +22,7 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.InternalComposeUiApi
import androidx.compose.ui.autofill.Autofill
import androidx.compose.ui.autofill.AutofillTree
import androidx.compose.ui.focus.FocusDirection
@@ -33,7 +34,10 @@
import androidx.compose.ui.focus.FocusManagerImpl
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Canvas
-import androidx.compose.ui.graphics.DesktopCanvas
+import androidx.compose.ui.graphics.asComposeCanvas
+import androidx.compose.ui.input.InputModeManager
+import androidx.compose.ui.input.InputModeManagerImpl
+import androidx.compose.ui.input.InputMode.Companion.Keyboard
import androidx.compose.ui.input.key.Key.Companion.Back
import androidx.compose.ui.input.key.Key.Companion.DirectionCenter
import androidx.compose.ui.input.key.Key.Companion.Tab
@@ -46,6 +50,7 @@
import androidx.compose.ui.input.key.type
import androidx.compose.ui.input.mouse.MouseScrollEvent
import androidx.compose.ui.input.mouse.MouseScrollEventFilter
+import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.input.pointer.PointerInputEvent
import androidx.compose.ui.input.pointer.PointerInputEventProcessor
import androidx.compose.ui.input.pointer.PointerInputFilter
@@ -76,10 +81,11 @@
@OptIn(
ExperimentalComposeUiApi::class,
- InternalCoreApi::class
+ InternalCoreApi::class,
+ InternalComposeUiApi::class
)
internal class DesktopOwner(
- val container: DesktopOwners,
+ private val platformInputService: DesktopPlatformInput,
density: Density = Density(1f, 1f),
val isPopup: Boolean = false,
val isFocusable: Boolean = true,
@@ -88,8 +94,9 @@
private val onKeyEvent: (KeyEvent) -> Boolean = { false },
) : Owner, RootForTest, DesktopRootForTest, PositionCalculator {
- internal fun isHovered(point: IntOffset): Boolean {
- return bounds.contains(point)
+ internal fun isHovered(point: Offset): Boolean {
+ val intOffset = IntOffset(point.x.toInt(), point.y.toInt())
+ return bounds.contains(intOffset)
}
internal var bounds by mutableStateOf(IntRect.Zero)
@@ -115,6 +122,18 @@
override val focusManager: FocusManager
get() = _focusManager
+ // TODO: Set the input mode. For now we don't support touch mode, (always in Key mode).
+ private val _inputModeManager = InputModeManagerImpl(
+ initialInputMode = Keyboard,
+ onRequestInputModeChange = {
+ // TODO: Change the input mode programmatically. For now we just return true if the
+ // requested input mode is Keyboard mode.
+ it == Keyboard
+ }
+ )
+ override val inputModeManager: InputModeManager
+ get() = _inputModeManager
+
// TODO: set/clear _windowInfo.isWindowFocused when the window gains/loses focus.
private val _windowInfo: WindowInfoImpl = WindowInfoImpl()
override val windowInfo: WindowInfo
@@ -133,6 +152,18 @@
onPreviewKeyEvent = null
)
+ var constraints: Constraints = Constraints()
+ set(value) {
+ field = value
+
+ if (!isPopup) {
+ this.bounds = IntRect(
+ IntOffset(bounds.left, bounds.top),
+ IntSize(constraints.maxWidth, constraints.maxHeight)
+ )
+ }
+ }
+
override val root = LayoutNode().also {
it.measurePolicy = RootMeasurePolicy
it.modifier = semanticsModifier
@@ -155,7 +186,6 @@
private val measureAndLayoutDelegate = MeasureAndLayoutDelegate(root)
init {
- container.register(this)
snapshotObserver.startObserving()
root.attach(this)
_focusManager.takeFocus()
@@ -163,11 +193,10 @@
fun dispose() {
snapshotObserver.stopObserving()
- container.unregister(this)
// we don't need to call root.detach() because root will be garbage collected
}
- override val textInputService = TextInputService(container.platformInputService)
+ override val textInputService = TextInputService(platformInputService)
override val fontLoader = FontLoader()
@@ -190,9 +219,9 @@
override fun sendKeyEvent(keyEvent: KeyEvent): Boolean {
when {
keyEvent.nativeKeyEvent.id == java.awt.event.KeyEvent.KEY_TYPED ->
- container.platformInputService.charKeyPressed = true
+ platformInputService.charKeyPressed = true
keyEvent.type == KeyEventType.KeyUp ->
- container.platformInputService.charKeyPressed = false
+ platformInputService.charKeyPressed = false
}
return keyInputModifier.processKeyInput(keyEvent)
@@ -219,9 +248,8 @@
var onNeedsRender: (() -> Unit)? = null
var onDispatchCommand: ((Command) -> Unit)? = null
- fun render(canvas: org.jetbrains.skia.Canvas, width: Int, height: Int) {
+ fun render(canvas: org.jetbrains.skia.Canvas) {
needsLayout = false
- setSize(width, height)
measureAndLayout()
needsDraw = false
draw(canvas)
@@ -249,6 +277,7 @@
}
override fun measureAndLayout() {
+ measureAndLayoutDelegate.updateRootConstraints(constraints)
if (measureAndLayoutDelegate.measureAndLayout()) {
requestDraw()
}
@@ -301,19 +330,8 @@
override fun screenToLocal(positionOnScreen: Offset): Offset = positionOnScreen
- fun setSize(width: Int, height: Int) {
- val constraints = Constraints(0, width, 0, height)
- if (!isPopup) {
- this.bounds = IntRect(
- IntOffset(bounds.left, bounds.top),
- IntSize(width, height)
- )
- }
- measureAndLayoutDelegate.updateRootConstraints(constraints)
- }
-
fun draw(canvas: org.jetbrains.skia.Canvas) {
- root.draw(DesktopCanvas(canvas))
+ root.draw(canvas.asComposeCanvas())
}
internal fun processPointerInput(event: PointerInputEvent): ProcessResult {
@@ -331,6 +349,7 @@
override fun processPointerInput(nanoTime: Long, pointers: List<TestPointerInputEventData>) {
processPointerInput(
PointerInputEvent(
+ PointerEventType.Unknown,
nanoTime,
pointers.map { it.toPointerInputEventData() }
)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
deleted file mode 100644
index 48c5c27..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopOwners.desktop.kt
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.compose.ui.platform
-
-import androidx.compose.runtime.BroadcastFrameClock
-import androidx.compose.runtime.Recomposer
-import androidx.compose.runtime.snapshots.Snapshot
-import androidx.compose.runtime.staticCompositionLocalOf
-import androidx.compose.ui.geometry.Offset
-import androidx.compose.ui.input.mouse.MouseScrollEvent
-import androidx.compose.ui.input.pointer.PointerId
-import androidx.compose.ui.input.pointer.PointerInputEvent
-import androidx.compose.ui.input.pointer.PointerInputEventData
-import androidx.compose.ui.input.pointer.PointerType
-import androidx.compose.ui.unit.IntOffset
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.CoroutineStart
-import kotlinx.coroutines.launch
-import org.jetbrains.skia.Canvas
-import java.awt.event.InputMethodEvent
-import java.awt.event.KeyEvent
-import java.awt.event.MouseEvent
-import androidx.compose.ui.input.key.KeyEvent as ComposeKeyEvent
-
-internal val LocalDesktopOwners = staticCompositionLocalOf<DesktopOwners> {
- error("CompositionLocal DesktopOwnersAmbient not provided")
-}
-
-internal class DesktopOwners(
- private val coroutineScope: CoroutineScope,
- component: DesktopComponent = DummyDesktopComponent,
- private val invalidate: () -> Unit = {},
-) {
- private var isInvalidationDisabled = false
-
- @Volatile
- private var hasPendingDraws = true
- private inline fun disableInvalidation(block: () -> Unit) {
- isInvalidationDisabled = true
- try {
- block()
- } finally {
- isInvalidationDisabled = false
- }
- }
-
- private fun invalidateIfNeeded() {
- hasPendingDraws = frameClock.hasAwaiters || list.any(DesktopOwner::needsRender)
- if (hasPendingDraws && !isInvalidationDisabled) {
- invalidate()
- }
- }
-
- val list = LinkedHashSet<DesktopOwner>()
- private val listCopy = mutableListOf<DesktopOwner>()
-
- private var pointerId = 0L
- private var isMousePressed = false
-
- private val dispatcher = FlushCoroutineDispatcher(coroutineScope)
- private val frameClock = BroadcastFrameClock(onNewAwaiters = ::invalidateIfNeeded)
- private val coroutineContext = coroutineScope.coroutineContext + dispatcher + frameClock
-
- internal val recomposer = Recomposer(coroutineContext)
- internal val platformInputService: DesktopPlatformInput = DesktopPlatformInput(component)
-
- init {
- coroutineScope.launch(coroutineContext, start = CoroutineStart.UNDISPATCHED) {
- recomposer.runRecomposeAndApplyChanges()
- }
- }
-
- fun dispose() {
- recomposer.cancel()
- }
-
- private fun dispatchCommand(command: () -> Unit) {
- coroutineScope.launch(coroutineContext) {
- command()
- }
- }
-
- /**
- * Returns true if there are pending recompositions, draws or dispatched tasks.
- * Can be called from any thread.
- */
- fun hasInvalidations() = hasPendingDraws ||
- recomposer.hasPendingWork ||
- dispatcher.hasTasks()
-
- fun register(desktopOwner: DesktopOwner) {
- list.add(desktopOwner)
- desktopOwner.onNeedsRender = ::invalidateIfNeeded
- desktopOwner.onDispatchCommand = ::dispatchCommand
- invalidateIfNeeded()
- if (desktopOwner.isFocusable) {
- focusedOwner = desktopOwner
- }
- }
-
- fun unregister(desktopOwner: DesktopOwner) {
- list.remove(desktopOwner)
- desktopOwner.onDispatchCommand = null
- desktopOwner.onNeedsRender = null
- invalidateIfNeeded()
- if (desktopOwner == focusedOwner) {
- focusedOwner = list.lastOrNull { it.isFocusable }
- }
- }
-
- fun onFrame(canvas: Canvas, width: Int, height: Int, nanoTime: Long) {
- disableInvalidation {
- // We must see the actual state before we will render the frame
- Snapshot.sendApplyNotifications()
- dispatcher.flush()
- frameClock.sendFrame(nanoTime)
-
- listCopy.addAll(list)
- for (owner in listCopy) {
- owner.render(canvas, width, height)
- }
- listCopy.clear()
- }
-
- invalidateIfNeeded()
- }
-
- private var focusedOwner: DesktopOwner? = null
- private val hoveredOwner: DesktopOwner?
- get() {
- listCopy.addAll(list)
- for (i in (listCopy.size - 1) downTo 0) {
- val owner = listCopy[i]
- if (owner.isHovered(pointLocation)) {
- listCopy.clear()
- return owner
- }
- }
- listCopy.clear()
- return list.lastOrNull()
- }
-
- private fun DesktopOwner?.isAbove(
- targetOwner: DesktopOwner?
- ) = list.indexOf(this) > list.indexOf(targetOwner)
-
- fun onMousePressed(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
- isMousePressed = true
- val currentOwner = hoveredOwner
- if (currentOwner != null) {
- if (focusedOwner.isAbove(currentOwner)) {
- focusedOwner?.onDismissRequest?.invoke()
- return
- } else {
- currentOwner.processPointerInput(
- pointerInputEvent(nativeEvent, x, y, isMousePressed)
- )
- return
- }
- }
- focusedOwner?.processPointerInput(pointerInputEvent(nativeEvent, x, y, isMousePressed))
- }
-
- fun onMouseReleased(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
- isMousePressed = false
- val currentOwner = hoveredOwner
- if (currentOwner != null) {
- currentOwner.processPointerInput(
- pointerInputEvent(nativeEvent, x, y, isMousePressed)
- )
- pointerId += 1
- return
- }
- focusedOwner?.processPointerInput(pointerInputEvent(nativeEvent, x, y, isMousePressed))
- pointerId += 1
- }
-
- private var pointLocation = IntOffset.Zero
-
- fun onMouseMoved(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
- pointLocation = IntOffset(x, y)
- val event = pointerInputEvent(nativeEvent, x, y, isMousePressed)
- hoveredOwner?.processPointerInput(event)
- }
-
- fun onMouseScroll(x: Int, y: Int, event: MouseScrollEvent) {
- val position = Offset(x.toFloat(), y.toFloat())
- hoveredOwner?.onMouseScroll(position, event)
- }
-
- fun onMouseEntered(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
- val event = pointerInputEvent(nativeEvent, x, y, isMousePressed)
- hoveredOwner?.processPointerInput(event)
- }
-
- fun onMouseExited(x: Int, y: Int, nativeEvent: MouseEvent? = null) {
- val event = pointerInputEvent(nativeEvent, x, y, isMousePressed)
- hoveredOwner?.processPointerInput(event)
- }
-
- private fun consumeKeyEvent(event: KeyEvent): Boolean {
- return focusedOwner?.sendKeyEvent(ComposeKeyEvent(event)) == true
- }
-
- fun onKeyPressed(event: KeyEvent): Boolean = consumeKeyEvent(event)
-
- fun onKeyReleased(event: KeyEvent): Boolean = consumeKeyEvent(event)
-
- fun onKeyTyped(event: KeyEvent): Boolean = consumeKeyEvent(event)
-
- fun onInputMethodEvent(event: InputMethodEvent) {
- if (!event.isConsumed) {
- when (event.id) {
- InputMethodEvent.INPUT_METHOD_TEXT_CHANGED -> {
- platformInputService.replaceInputMethodText(event)
- event.consume()
- }
- InputMethodEvent.CARET_POSITION_CHANGED -> {
- platformInputService.inputMethodCaretPositionChanged(event)
- event.consume()
- }
- }
- }
- }
-
- private fun pointerInputEvent(
- nativeEvent: MouseEvent?,
- x: Int,
- y: Int,
- down: Boolean
- ): PointerInputEvent {
- val time = System.nanoTime() / 1_000_000L
- val position = Offset(x.toFloat(), y.toFloat())
- return PointerInputEvent(
- time,
- listOf(
- PointerInputEventData(
- PointerId(pointerId),
- time,
- position,
- position,
- down,
- PointerType.Mouse
- )
- ),
- nativeEvent
- )
- }
-}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
index 7c09ede..01e0170 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopPlatformInput.desktop.kt
@@ -16,6 +16,7 @@
package androidx.compose.ui.platform
import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.text.TextRange
import androidx.compose.ui.text.input.CommitTextCommand
import androidx.compose.ui.text.input.DeleteSurroundingTextInCodePointsCommand
import androidx.compose.ui.text.input.EditCommand
@@ -118,7 +119,7 @@
val composing = event.text.toStringFrom(event.committedCharacterCount)
val ops = mutableListOf<EditCommand>()
- if (needToDeletePreviousChar && isMac) {
+ if (needToDeletePreviousChar && isMac && input.value.selection.min > 0) {
needToDeletePreviousChar = false
ops.add(DeleteSurroundingTextInCodePointsCommand(1, 0))
}
@@ -198,24 +199,17 @@
val comp = input.value.composition
val text = input.value.text
+ val range = TextRange(beginIndex, endIndex)
if (comp == null) {
- val res = text.substring(beginIndex, endIndex)
+ val res = text.substring(range)
return AttributedString(res).iterator
}
-
- val composedStartIndex = comp.start
- val composedEndIndex = comp.end
-
- val committed: String
- if (beginIndex < composedStartIndex) {
- val end = min(endIndex, composedStartIndex)
- committed = text.substring(beginIndex, end)
- } else if (composedEndIndex <= endIndex) {
- val begin = max(composedEndIndex, beginIndex)
- committed = text.substring(begin, endIndex)
- } else {
- committed = ""
- }
+ val committed = text.substring(
+ TextRange(
+ min(range.min, comp.min),
+ max(range.max, comp.max).coerceAtMost(text.length)
+ )
+ )
return AttributedString(committed).iterator
}
}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt
index 82a5c1f..e2ce7d5 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopRootForTest.desktop.kt
@@ -16,6 +16,7 @@
package androidx.compose.ui.platform
+import androidx.compose.ui.InternalComposeUiApi
import androidx.compose.ui.input.pointer.TestPointerInputEventData
import androidx.compose.ui.node.RootForTest
@@ -23,6 +24,7 @@
* The marker interface to be implemented by the desktop root backing the composition.
* To be used in tests.
*/
+@InternalComposeUiApi
interface DesktopRootForTest : RootForTest {
/**
* Process pointer event
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.desktop.kt
deleted file mode 100644
index e69de29..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/DesktopSelectionClipboard.desktop.kt
+++ /dev/null
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
index 2c869a9..f4d08fc 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/SkiaLayer.desktop.kt
@@ -20,10 +20,11 @@
import androidx.compose.ui.geometry.MutableRect
import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.geometry.Rect
+import androidx.compose.ui.geometry.RoundRect
import androidx.compose.ui.geometry.toRect
import androidx.compose.ui.graphics.Canvas
+import androidx.compose.ui.graphics.ClipOp
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.graphics.DesktopCanvas
import androidx.compose.ui.graphics.Matrix
import androidx.compose.ui.graphics.Outline
import androidx.compose.ui.graphics.Paint
@@ -32,9 +33,11 @@
import androidx.compose.ui.graphics.RenderEffect
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.graphics.TransformOrigin
-import androidx.compose.ui.graphics.asDesktopPath
+import androidx.compose.ui.graphics.asComposeCanvas
+import androidx.compose.ui.graphics.asSkiaPath
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.graphics.toSkiaRRect
import androidx.compose.ui.graphics.toSkiaRect
import androidx.compose.ui.node.OwnedLayer
import androidx.compose.ui.unit.Density
@@ -43,6 +46,7 @@
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.toSize
+import org.jetbrains.skia.ClipMode
import org.jetbrains.skia.Picture
import org.jetbrains.skia.PictureRecorder
import org.jetbrains.skia.Point3
@@ -213,7 +217,7 @@
if (picture == null) {
val bounds = size.toSize().toRect()
val pictureCanvas = pictureRecorder.beginRecording(bounds.toSkiaRect())
- performDrawLayer(DesktopCanvas(pictureCanvas), bounds)
+ performDrawLayer(pictureCanvas.asComposeCanvas(), bounds)
picture = pictureRecorder.finishRecordingAsPicture()
}
@@ -224,7 +228,7 @@
canvas.restore()
}
- private fun performDrawLayer(canvas: DesktopCanvas, bounds: Rect) {
+ private fun performDrawLayer(canvas: Canvas, bounds: Rect) {
if (alpha > 0) {
if (shadowElevation > 0) {
drawShadow(canvas)
@@ -245,7 +249,7 @@
bounds,
Paint().apply {
alpha = this@SkiaLayer.alpha
- asFrameworkPaint().imageFilter = currentRenderEffect?.asDesktopImageFilter()
+ asFrameworkPaint().imageFilter = currentRenderEffect?.asSkiaImageFilter()
}
)
} else {
@@ -260,10 +264,21 @@
}
}
+ private fun Canvas.clipRoundRect(rect: RoundRect, clipOp: ClipOp = ClipOp.Intersect) {
+ val antiAlias = true
+ nativeCanvas.clipRRect(rect.toSkiaRRect(), clipOp.toSkia(), antiAlias)
+ }
+
+ private fun ClipOp.toSkia() = when (this) {
+ ClipOp.Difference -> ClipMode.DIFFERENCE
+ ClipOp.Intersect -> ClipMode.INTERSECT
+ else -> ClipMode.INTERSECT
+ }
+
override fun updateDisplayList() = Unit
@OptIn(ExperimentalUnsignedTypes::class)
- fun drawShadow(canvas: DesktopCanvas) = with(density) {
+ fun drawShadow(canvas: Canvas) = with(density) {
val path = when (val outline = outlineCache.outline) {
is Outline.Rectangle -> Path().apply { addRect(outline.rect) }
is Outline.Rounded -> Path().apply { addRoundRect(outline.roundRect) }
@@ -284,7 +299,7 @@
val spotColor = Color.Black.copy(alpha = spotAlpha)
ShadowUtils.drawShadow(
- canvas.nativeCanvas, path.asDesktopPath(), zParams, lightPos,
+ canvas.nativeCanvas, path.asSkiaPath(), zParams, lightPos,
lightRad,
ambientColor.toArgb(),
spotColor.toArgb(), alpha < 1f, false
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
index c5abc0e3..56087c7 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/TestComposeWindow.desktop.kt
@@ -17,26 +17,25 @@
package androidx.compose.ui.platform
import androidx.compose.runtime.Composable
+import androidx.compose.ui.ComposeScene
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.InternalComposeUiApi
+import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.input.mouse.MouseScrollEvent
+import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.node.RootForTest
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
-import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Job
-import kotlinx.coroutines.Runnable
import kotlinx.coroutines.cancel
import org.jetbrains.skia.Surface
import org.jetbrains.skiko.FrameDispatcher
import java.awt.Component
-import java.awt.event.MouseEvent
import kotlin.coroutines.CoroutineContext
-private val emptyDispatcher = object : CoroutineDispatcher() {
- override fun dispatch(context: CoroutineContext, block: Runnable) = Unit
-}
-
/**
* A virtual window for testing purposes.
*
@@ -45,12 +44,13 @@
* It doesn't dispatch frames by default. If frame dispatching is needed, pass appropriate
* dispatcher as coroutineContext (for example, Dispatchers.Swing)
*/
+@OptIn(ExperimentalComposeUiApi::class)
class TestComposeWindow(
val width: Int,
val height: Int,
val density: Density = Density(1f, 1f),
private val nanoTime: () -> Long = System::nanoTime,
- coroutineContext: CoroutineContext = emptyDispatcher
+ coroutineContext: CoroutineContext = EmptyDispatcher
) {
/**
* Virtual surface on which the content will be drawn
@@ -58,7 +58,6 @@
val surface = Surface.makeRasterN32Premul(width, height)
private val canvas = surface.canvas
- private var owner: DesktopOwner? = null
private val coroutineScope = CoroutineScope(coroutineContext + Job())
private val frameDispatcher: FrameDispatcher = FrameDispatcher(
@@ -68,63 +67,64 @@
private fun onFrame() {
canvas.clear(Color.Transparent.toArgb())
- owners.onFrame(canvas, width, height, nanoTime())
+ scene.render(canvas, nanoTime())
}
- private val owners = DesktopOwners(
- coroutineScope = coroutineScope,
+ private val scene = ComposeScene(
+ coroutineScope.coroutineContext,
+ density,
invalidate = frameDispatcher::scheduleFrame
- )
+ ).apply {
+ constraints = Constraints(maxWidth = width, maxHeight = height)
+ }
/**
* All currently registered [RootForTest]s
*/
- val roots: Set<DesktopRootForTest> get() = owners.list
+ @OptIn(InternalComposeUiApi::class)
+ val roots: Set<RootForTest> get() = scene.roots
/**
* Clear-up all acquired resources and stop all pending work
*/
fun dispose() {
- owner?.dispose()
+ scene.dispose()
coroutineScope.cancel()
}
/**
* Returns true if there are pending work scheduled by this window
*/
- fun hasInvalidations(): Boolean = owners.hasInvalidations()
+ fun hasInvalidations(): Boolean = scene.hasInvalidations()
/**
* Compose [content] immediately and draw it on a [surface]
*/
fun setContent(content: @Composable () -> Unit) {
- check(owner == null) {
- "Cannot call setContent twice!"
- }
-
- val owner = DesktopOwner(owners, density)
- owner.setContent {
- content()
- }
- owners.onFrame(surface.canvas, width, height, 0)
- this.owner = owner
+ scene.constraints = Constraints(maxWidth = width, maxHeight = height)
+ scene.setContent(content = content)
+ scene.render(canvas, nanoTime = nanoTime())
}
/**
* Process mouse scroll event
*/
+ @OptIn(ExperimentalComposeUiApi::class)
fun onMouseScroll(x: Int, y: Int, event: MouseScrollEvent) {
- owners.onMouseScroll(x, y, event)
+ scene.sendPointerScrollEvent(
+ position = Offset(x.toFloat(), y.toFloat()),
+ delta = event.delta,
+ orientation = event.orientation
+ )
}
/**
* Process mouse move event
*/
fun onMouseMoved(x: Int, y: Int) {
- owners.onMouseMoved(
- x,
- y,
- MouseEvent(EventComponent, MouseEvent.MOUSE_MOVED, 0, 0, x, y, 1, false)
+ scene.sendPointerEvent(
+ eventType = PointerEventType.Move,
+ position = Offset(x.toFloat(), y.toFloat())
)
}
@@ -132,10 +132,9 @@
* Process mouse enter event
*/
fun onMouseEntered(x: Int, y: Int) {
- owners.onMouseEntered(
- x,
- y,
- MouseEvent(EventComponent, MouseEvent.MOUSE_MOVED, 0, 0, x, y, 1, false)
+ scene.sendPointerEvent(
+ eventType = PointerEventType.Enter,
+ position = Offset(x.toFloat(), y.toFloat())
)
}
@@ -143,10 +142,9 @@
* Process mouse exit event
*/
fun onMouseExited() {
- owners.onMouseExited(
- -1,
- -1,
- MouseEvent(EventComponent, MouseEvent.MOUSE_MOVED, 0, 0, -1, -1, 1, false)
+ scene.sendPointerEvent(
+ eventType = PointerEventType.Exit,
+ position = Offset(-1f, -1f)
)
}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
index 13e7f34..4037e39 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/platform/Wrapper.desktop.kt
@@ -18,7 +18,6 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Composition
import androidx.compose.runtime.CompositionContext
-import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.node.LayoutNode
@@ -29,31 +28,20 @@
* If null then default root composition will be used.
* @param content A `@Composable` function declaring the UI contents
*/
+@OptIn(ExperimentalComposeUiApi::class)
internal fun DesktopOwner.setContent(
- parent: CompositionContext? = null,
+ parent: CompositionContext,
content: @Composable () -> Unit
): Composition {
- GlobalSnapshotManager.ensureStarted()
-
- val composition = Composition(DesktopUiApplier(root), parent ?: container.recomposer)
+ val composition = Composition(DesktopUiApplier(root), parent)
composition.setContent {
- ProvideDesktopCompositionsLocals(this, content)
- }
-
- return composition
-}
-@OptIn(ExperimentalComposeUiApi::class)
-@Composable
-private fun ProvideDesktopCompositionsLocals(owner: DesktopOwner, content: @Composable () -> Unit) {
- CompositionLocalProvider(
- LocalDesktopOwners provides owner.container
- ) {
ProvideCommonCompositionLocals(
- owner = owner,
+ owner = this,
uriHandler = DesktopUriHandler(),
content = content
)
}
+ return composition
}
internal actual fun createSubcomposition(
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
index 7f8b27a..1e33a0f 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopSvgResources.desktop.kt
@@ -17,7 +17,6 @@
package androidx.compose.ui.res
import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.geometry.isSpecified
import androidx.compose.ui.graphics.ColorFilter
@@ -26,7 +25,6 @@
import androidx.compose.ui.graphics.nativeCanvas
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.graphics.vector.DrawCache
-import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.IntSize
import org.jetbrains.skia.Data
@@ -40,26 +38,6 @@
import kotlin.math.ceil
/**
- * Synchronously load an SVG image stored in resources for the application.
- *
- * @param resourcePath path to the file in the resources folder
- * @return the decoded vector image associated with the resource
- */
-@Composable
-@Deprecated(
- "Use painterResource(resourcePath)",
- replaceWith = ReplaceWith("painterResource(resourcePath)")
-)
-fun svgResource(resourcePath: String): Painter {
- val density = LocalDensity.current
- return remember(resourcePath, density) {
- useResource(resourcePath) {
- loadSvgPainter(it, density)
- }
- }
-}
-
-/**
* Synchronously load an SVG image from some [inputStream].
*
* In contrast to [svgResource] this function isn't [Composable]
@@ -78,19 +56,6 @@
return SVGPainter(SVGDOM(data), density)
}
-/**
- * Synchronously load an SVG image from some [inputStream].
- *
- * In contrast to [svgResource] this function isn't [Composable]
- *
- * @param inputStream input stream to load an SVG image. All bytes will be read from this stream,
- * but stream will not be closed after this method.
- * @return the decoded SVG image associated with the image
- */
-@Deprecated("Use loadSvg", replaceWith = ReplaceWith("loadSvgPainter(inputStream, density)"))
-fun loadSvgResource(inputStream: InputStream, density: Density): Painter =
- loadSvgPainter(inputStream, density)
-
private class SVGPainter(
private val dom: SVGDOM,
private val density: Density
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt
index bfae54e..9768f21 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/DesktopXmlVectorResources.desktop.kt
@@ -16,100 +16,19 @@
package androidx.compose.ui.res
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.vector.ImageVector
-import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.vector.parseVectorRoot
import androidx.compose.ui.unit.Density
import org.xml.sax.InputSource
import javax.xml.parsers.DocumentBuilderFactory
/**
- * Synchronously load an xml vector image stored in resources for the application.
- *
- * XML Vector Image is came from Android world. See:
- * https://developer.android.com/guide/topics/graphics/vector-drawable-resources
- *
- * On desktop it is fully implemented except there is no resource linking
- * (for example, we can't reference to color defined in another file)
- *
- * SVG files can be converted to XML with Android Studio or with third party tools
- * (search "svg to xml" in Google)
- *
- * @param resourcePath path to the file in the resources folder
- * @return the decoded vector image associated with the resource
- */
-@Composable
-@Deprecated(
- "Use painterResource(resourcePath)",
- replaceWith = ReplaceWith("painterResource(resourcePath)")
-)
-fun vectorXmlResource(resourcePath: String): ImageVector {
- val inputSource = remember(resourcePath) {
- object : InputSource() {
- override fun getByteStream() = openResource(resourcePath)
- }
- }
- val density = LocalDensity.current
- return remember(inputSource, density) {
- loadXmlImageVector(inputSource, density)
- }
-}
-
-/**
* Synchronously load an xml vector image from some [inputSource].
*
* XML Vector Image is came from Android world. See:
* https://developer.android.com/guide/topics/graphics/vector-drawable-resources
*
* On desktop it is fully implemented except there is no resource linking
- * (for example, we can't reference to color defined in another file).
- *
- * SVG files can be converted to XML with Android Studio or with third party tools
- * (search "svg to xml" in Google)
- *
- * Example of usage:
- *
- * val inputSource = remember(url) {
- * object : InputSource() {
- * override fun getByteStream() = url.openStream()
- * }
- * }
- *
- * vectorXmlResource(inputSource)
- *
- * @param inputSource input source to load xml resource. Will be closed automatically.
- * @return the decoded vector image associated with the resource
- */
-@Composable
-@Deprecated(
- "Use loadVectorXml(inputSource, density) explicitly",
- replaceWith = ReplaceWith(
- "remember(inputSource, density) {\n" +
- " loadXmlImageVector(inputSource, density)\n" +
- "}",
- "androidx.compose.runtime.remember",
- "androidx.compose.ui.platform.LocalDensity",
- "androidx.compose.ui.res.loadVectorXml"
- )
-)
-fun vectorXmlResource(inputSource: InputSource): ImageVector {
- val density = LocalDensity.current
- return remember(inputSource, density) {
- loadXmlImageVector(inputSource, density)
- }
-}
-
-/**
- * Synchronously load an xml vector image from some [inputSource].
- *
- * In contrast to [vectorXmlResource] this function isn't [Composable]
- *
- * XML Vector Image is came from Android world. See:
- * https://developer.android.com/guide/topics/graphics/vector-drawable-resources
- *
- * On desktop it is fully implemented except there is no resource linking
* (for example, we can't reference to color defined in another file)
*
* @param inputSource input source to load xml vector image. Will be closed automatically.
@@ -128,29 +47,3 @@
.parse(inputSource)
.documentElement
.parseVectorRoot(density)
-
-/**
- * Synchronously load an xml vector image from some [inputSource].
- *
- * In contrast to [vectorXmlResource] this function isn't [Composable]
- *
- * XML Vector Image is came from Android world. See:
- * https://developer.android.com/guide/topics/graphics/vector-drawable-resources
- *
- * On desktop it is fully implemented except there is no resource linking
- * (for example, we can't reference to color defined in another file)
- *
- * SVG files can be converted to XML with Android Studio or with third party tools
- * (search "svg to xml" in Google)
- *
- * @param inputSource input source to load xml resource. Will be closed automatically.
- * @return the decoded vector image associated with the resource
- */
-@Deprecated(
- "Use loadVectorXml",
- replaceWith = ReplaceWith("loadXmlImageVector(inputStream, density)")
-)
-fun loadVectorXmlResource(
- inputSource: InputSource,
- density: Density
-): ImageVector = loadXmlImageVector(inputSource, density)
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
index 6af078d..948938e 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/res/ImageResources.desktop.kt
@@ -16,31 +16,12 @@
package androidx.compose.ui.res
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.remember
import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.graphics.asImageBitmap
+import androidx.compose.ui.graphics.toComposeImageBitmap
import org.jetbrains.skia.Image
import java.io.InputStream
/**
- * Synchronously load an image file stored in resources for the application.
- *
- * @param resourcePath path to the image file
- * @return the decoded image data associated with the resource
- */
-@Composable
-@Deprecated(
- "Use painterResource(resourcePath)",
- replaceWith = ReplaceWith("painterResource(resourcePath)")
-)
-fun imageResource(resourcePath: String): ImageBitmap {
- return remember(resourcePath) {
- useResource(resourcePath, ::loadImageBitmap)
- }
-}
-
-/**
* Load and decode [ImageBitmap] from the given [inputStream]. [inputStream] should contain encoded
* raster image in a format supported by Skia (BMP, GIF, HEIF, ICO, JPEG, PNG, WBMP, WebP)
*
@@ -49,4 +30,4 @@
* @return the decoded SVG image associated with the resource
*/
fun loadImageBitmap(inputStream: InputStream): ImageBitmap =
- Image.makeFromEncoded(inputStream.readAllBytes()).asImageBitmap()
\ No newline at end of file
+ Image.makeFromEncoded(inputStream.readAllBytes()).toComposeImageBitmap()
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt
index 4a6b15f..08fb815 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/util/Windows.desktop.kt
@@ -19,15 +19,15 @@
import androidx.compose.ui.Alignment
import androidx.compose.ui.awt.ComposeWindow
import androidx.compose.ui.geometry.Size
-import androidx.compose.ui.graphics.asAwtImage
+import androidx.compose.ui.graphics.toAwtImage
import androidx.compose.ui.graphics.painter.Painter
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.IntSize
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.isSpecified
import androidx.compose.ui.unit.isUnspecified
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.WindowPosition
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.density
import androidx.compose.ui.window.layoutDirection
import java.awt.Dialog
@@ -41,7 +41,7 @@
* Ignore size updating if window is maximized or in fullscreen.
* Otherwise we will reset maximized / fullscreen state.
*/
-internal fun ComposeWindow.setSizeSafely(size: WindowSize) {
+internal fun ComposeWindow.setSizeSafely(size: DpSize) {
if (placement == WindowPlacement.Floating) {
(this as Window).setSizeSafely(size)
}
@@ -62,7 +62,7 @@
/**
* Limit the width and the height to a minimum of 0
*/
-internal fun Window.setSizeSafely(size: WindowSize) {
+internal fun Window.setSizeSafely(size: DpSize) {
val screenBounds by lazy { graphicsConfiguration.bounds }
val width = if (size.width.isSpecified) {
@@ -152,5 +152,5 @@
private val iconSize = Size(32f, 32f)
internal fun Window.setIcon(painter: Painter?) {
- setIconImage(painter?.asAwtImage(density, layoutDirection, iconSize))
+ setIconImage(painter?.toAwtImage(density, layoutDirection, iconSize))
}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt
index 8073778..a022e64 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Application.desktop.kt
@@ -14,6 +14,8 @@
* limitations under the License.
*/
+@file:OptIn(ExperimentalComposeUiApi::class)
+
package androidx.compose.ui.window
import androidx.compose.runtime.Applier
@@ -27,6 +29,7 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.runtime.withFrameNanos
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.awt.ComposePanel
import androidx.compose.ui.configureSwingGlobalsForCompose
import androidx.compose.ui.platform.GlobalSnapshotManager
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt
index 3b046e3..ca308158f 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/AwtWindow.desktop.kt
@@ -102,7 +102,7 @@
// which will handle all the future Swing events while dialog is visible.
//
// We can't use LaunchedEffect or rememberCoroutineScope, because they have a dispatcher
- // which is controlled by the Compose rendering loop (DesktopOwners.dispatcher) and we
+ // which is controlled by the Compose rendering loop (ComposeScene.dispatcher) and we
// will block coroutine.
//
// 2.
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
index bb9e977..bf450c5 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DesktopPopup.desktop.kt
@@ -24,6 +24,7 @@
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.LocalComposeScene
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.LocalLayerContainer
import androidx.compose.ui.geometry.Offset
@@ -32,7 +33,6 @@
import androidx.compose.ui.layout.onGloballyPositioned
import androidx.compose.ui.platform.DesktopOwner
import androidx.compose.ui.platform.LocalDensity
-import androidx.compose.ui.platform.LocalDesktopOwners
import androidx.compose.ui.platform.setContent
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.DpOffset
@@ -133,6 +133,7 @@
)
}
+@OptIn(ExperimentalComposeUiApi::class)
@Composable
private fun PopupLayout(
popupPositionProvider: PopupPositionProvider,
@@ -142,7 +143,7 @@
onKeyEvent: ((KeyEvent) -> Boolean) = { false },
content: @Composable () -> Unit
) {
- val owners = LocalDesktopOwners.current
+ val scene = LocalComposeScene.current
val density = LocalDensity.current
var parentBounds by remember { mutableStateOf(IntRect.Zero) }
@@ -166,7 +167,7 @@
val parentComposition = rememberCompositionContext()
val (owner, composition) = remember {
val owner = DesktopOwner(
- container = owners,
+ platformInputService = scene.platformInputService,
density = density,
isPopup = true,
isFocusable = focusable,
@@ -174,6 +175,7 @@
onPreviewKeyEvent = onPreviewKeyEvent,
onKeyEvent = onKeyEvent
)
+ scene.attach(owner)
val composition = owner.setContent(parent = parentComposition) {
Layout(
content = content,
@@ -212,16 +214,13 @@
owner.density = density
DisposableEffect(Unit) {
onDispose {
+ scene.detach(owner)
composition.dispose()
owner.dispose()
}
}
}
-private fun isOutsideRectTap(rect: IntRect, point: Offset): Boolean {
- return !rect.contains(IntOffset(point.x.toInt(), point.y.toInt()))
-}
-
/**
* Provides [PopupPositionProvider] relative to the current mouse cursor position.
*
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
index f9b2450..8652227 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Dialog.desktop.kt
@@ -21,9 +21,11 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCompositionContext
import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.awt.ComposeDialog
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.ComponentUpdater
import androidx.compose.ui.util.setIcon
@@ -132,7 +134,7 @@
})
addComponentListener(object : ComponentAdapter() {
override fun componentResized(e: ComponentEvent) {
- currentState.size = WindowSize(width.dp, height.dp)
+ currentState.size = DpSize(width.dp, height.dp)
}
override fun componentMoved(e: ComponentEvent) {
@@ -200,6 +202,7 @@
* @param update The callback to be invoked after the layout is inflated.
* @param content Composable content of the creating dialog.
*/
+@OptIn(ExperimentalComposeUiApi::class)
@Suppress("unused")
@Composable
fun Dialog(
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt
index feabb3d..621309a 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/DialogState.desktop.kt
@@ -25,6 +25,7 @@
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
/**
@@ -39,7 +40,7 @@
@Composable
fun rememberDialogState(
position: WindowPosition = WindowPosition(Alignment.Center),
- size: WindowSize = WindowSize(400.dp, 300.dp),
+ size: DpSize = DpSize(400.dp, 300.dp),
): DialogState = rememberSaveable(saver = DialogStateImpl.Saver(position)) {
DialogStateImpl(
position,
@@ -56,10 +57,47 @@
*/
fun DialogState(
position: WindowPosition = WindowPosition(Alignment.Center),
- size: WindowSize = WindowSize(400.dp, 300.dp)
+ size: DpSize = DpSize(400.dp, 300.dp)
): DialogState = DialogStateImpl(
position, size
)
+/**
+ * Creates a [DialogState] that is remembered across compositions.
+ *
+ * Changes to the provided initial values will **not** result in the state being recreated or
+ * changed in any way if it has already been created.
+ *
+ * @param position the initial value for [DialogState.position]
+ * @param size the initial value for [DialogState.size]
+ */
+@Suppress("DEPRECATION")
+@Composable
+@Deprecated("Use rememberDialogState which accepts DpSize")
+fun rememberDialogState(
+ position: WindowPosition = WindowPosition(Alignment.Center),
+ size: WindowSize,
+): DialogState = rememberSaveable(saver = DialogStateImpl.Saver(position)) {
+ DialogStateImpl(
+ position,
+ DpSize(size.width, size.height)
+ )
+}
+
+/**
+ * A state object that can be hoisted to control and observe dialog attributes
+ * (size/position).
+ *
+ * @param position the initial value for [DialogState.position]
+ * @param size the initial value for [DialogState.size]
+ */
+@Deprecated("Use DialogState which accepts DpSize")
+@Suppress("DEPRECATION")
+fun DialogState(
+ position: WindowPosition = WindowPosition(Alignment.Center),
+ size: WindowSize
+): DialogState = DialogStateImpl(
+ position, DpSize(size.width, size.height)
+)
/**
* Creates a [DialogState] that is remembered across compositions.
@@ -79,7 +117,7 @@
): DialogState = rememberSaveable(saver = DialogStateImpl.Saver(position)) {
DialogStateImpl(
position,
- WindowSize(width, height)
+ DpSize(width, height)
)
}
@@ -97,7 +135,7 @@
height: Dp = 300.dp,
): DialogState = DialogStateImpl(
position,
- WindowSize(width, height)
+ DpSize(width, height)
)
/**
@@ -115,12 +153,12 @@
/**
* Current size of the dialog.
*/
- var size: WindowSize
+ var size: DpSize
}
private class DialogStateImpl(
position: WindowPosition,
- size: WindowSize
+ size: DpSize
) : DialogState {
override var position by mutableStateOf(position)
override var size by mutableStateOf(size)
@@ -146,7 +184,7 @@
} else {
unspecifiedPosition
},
- size = WindowSize((state[3] as Float).dp, (state[4] as Float).dp),
+ size = DpSize((state[3] as Float).dp, (state[4] as Float).dp),
)
}
)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
index 5698c81..05c535b 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Menu.desktop.kt
@@ -29,7 +29,7 @@
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.graphics.asAwtImage
+import androidx.compose.ui.graphics.toAwtImage
import androidx.compose.ui.input.key.KeyShortcut
import androidx.compose.ui.input.key.toSwingKeyStroke
import androidx.compose.ui.node.Ref
@@ -790,7 +790,7 @@
return remember(painter, density, layoutDirection) {
painter
- ?.asAwtImage(density, layoutDirection, DefaultIconSize)
+ ?.toAwtImage(density, layoutDirection, DefaultIconSize)
?.let(::ImageIcon)
}
}
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notifier.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notifier.desktop.kt
deleted file mode 100644
index c11779b..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Notifier.desktop.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.ui.window
-
-import java.awt.SystemTray
-import java.awt.Image
-import java.awt.image.BufferedImage
-import java.awt.TrayIcon
-import java.awt.TrayIcon.MessageType
-
-/**
- * Notifier is a class that can send system notifications.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new). Global notifications was not " +
- "implemented in the new API as we don't properly support them in the current API."
-)
-class Notifier {
-
- /**
- * Sends a regular notification with the given title and message.
- *
- * @param title Notification title.
- * @param message Notification message.
- */
- fun notify(title: String, message: String) {
- send(title, message, MessageType.INFO)
- }
-
- /**
- * Sends a warning notification with the given title and message.
- *
- * @param title Notification title.
- * @param message Notification message.
- */
- fun warn(title: String, message: String) {
- send(title, message, MessageType.WARNING)
- }
-
- /**
- * Sends a error notification with the given title and message.
- *
- * @param title Notification title.
- * @param message Notification message.
- */
- fun error(title: String, message: String) {
- send(title, message, MessageType.ERROR)
- }
-
- private fun send(title: String, message: String, type: MessageType) {
- if (SystemTray.isSupported()) {
- val tray = SystemTray.getSystemTray()
- val trayIcons = tray.getTrayIcons()
- if (trayIcons.isNotEmpty()) {
- trayIcons[0].displayMessage(title, message, type)
- } else {
- val trayIcon = TrayIcon(emptyImage())
- tray.add(trayIcon)
- trayIcon.displayMessage(title, message, type)
- tray.remove(trayIcon)
- }
- }
- }
-
- private fun emptyImage(): Image {
- return BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB)
- }
-}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt
index 157fe34..5bcaacc 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Tray.desktop.kt
@@ -26,7 +26,7 @@
import androidx.compose.runtime.rememberUpdatedState
import androidx.compose.ui.geometry.Size
import androidx.compose.ui.graphics.painter.Painter
-import androidx.compose.ui.graphics.asAwtImage
+import androidx.compose.ui.graphics.toAwtImage
import androidx.compose.ui.platform.DesktopPlatform
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.flow.Flow
@@ -68,7 +68,7 @@
*
* @param icon Icon of the tray
* @param state State to control tray and show notifications
- * @param hint Hint/tooltip that will be shown to the user
+ * @param tooltip Hint/tooltip that will be shown to the user
* @param menu Context menu of the tray that will be shown to the user on the mouse click (right
* click on Windows, left click on macOs).
* If it doesn't contain any items then context menu will not be shown.
@@ -80,7 +80,7 @@
fun ApplicationScope.Tray(
icon: Painter,
state: TrayState = rememberTrayState(),
- hint: String? = null,
+ tooltip: String? = null,
onAction: () -> Unit = {},
menu: @Composable MenuScope.() -> Unit = {}
) {
@@ -110,7 +110,7 @@
// (see MultiResolutionImage.getResolutionVariant). Resources like svg/xml should look okay
// because they don't use absolute '.dp' values to draw, they use values which are
// relative to their viewport.
- icon.asAwtImage(GlobalDensity, GlobalLayoutDirection, iconSize)
+ icon.toAwtImage(GlobalDensity, GlobalLayoutDirection, iconSize)
}
val tray = remember {
@@ -127,7 +127,7 @@
SideEffect {
if (tray.image != awtIcon) tray.image = awtIcon
- if (tray.toolTip != hint) tray.toolTip = hint
+ if (tray.toolTip != tooltip) tray.toolTip = tooltip
}
val composition = rememberCompositionContext()
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
index ea71dc7..40d2782 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/Window.desktop.kt
@@ -22,9 +22,11 @@
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCompositionContext
import androidx.compose.runtime.rememberUpdatedState
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.awt.ComposeWindow
import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.input.key.KeyEvent
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.util.ComponentUpdater
import androidx.compose.ui.util.setIcon
@@ -153,7 +155,7 @@
// because fullscreen changing doesn't
// fire windowStateChanged, only componentResized
currentState.placement = placement
- currentState.size = WindowSize(width.dp, height.dp)
+ currentState.size = DpSize(width.dp, height.dp)
}
override fun componentMoved(e: ComponentEvent) {
@@ -291,6 +293,7 @@
* @param update The callback to be invoked after the layout is inflated.
* @param content Composable content of the creating window.
*/
+@OptIn(ExperimentalComposeUiApi::class)
@Suppress("unused")
@Composable
fun Window(
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt
index 634ce01..591053d 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowSize.desktop.kt
@@ -28,6 +28,11 @@
/**
* Constructs an [WindowSize] from [width] and [height] [Dp] values.
*/
+@Suppress("DEPRECATION")
+@Deprecated(
+ "Use DpSize",
+ replaceWith = ReplaceWith("DpSize(width, height)", "androidx.compose.ui.unit.DpSize")
+)
fun WindowSize(
/**
* The width of the window in [Dp]. If it is [Dp.Unspecified] then the width of the window
@@ -47,6 +52,7 @@
*/
@Suppress("INLINE_CLASS_DEPRECATED", "EXPERIMENTAL_FEATURE_WARNING")
@Immutable
+@Deprecated("Use DpSize", replaceWith = ReplaceWith("DpSize", "androidx.compose.ui.unit.DpSize"))
inline class WindowSize internal constructor(@PublishedApi internal val packedValue: Long) {
/**
* `true` if the window size has specified values
@@ -81,6 +87,7 @@
* Returns a copy of this [WindowSize] instance optionally overriding the
* [width] or [height] parameter.
*/
+ @Suppress("DEPRECATION")
fun copy(
width: Dp = this.width,
height: Dp = this.height
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt
index 1ff5bd7..24e59c1 100644
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt
+++ b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/WindowState.desktop.kt
@@ -24,6 +24,7 @@
import androidx.compose.runtime.saveable.rememberSaveable
import androidx.compose.runtime.setValue
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
/**
@@ -42,7 +43,7 @@
placement: WindowPlacement = WindowPlacement.Floating,
isMinimized: Boolean = false,
position: WindowPosition = WindowPosition.PlatformDefault,
- size: WindowSize = WindowSize(800.dp, 600.dp),
+ size: DpSize = DpSize(800.dp, 600.dp),
): WindowState = rememberSaveable(saver = WindowStateImpl.Saver(position)) {
WindowStateImpl(
placement,
@@ -61,6 +62,34 @@
* @param placement the initial value for [WindowState.placement]
* @param isMinimized the initial value for [WindowState.isMinimized]
* @param position the initial value for [WindowState.position]
+ * @param size the initial value for [WindowState.size]
+ */
+@Suppress("DEPRECATION")
+@Composable
+@Deprecated("Use rememberWindowState which accepts DpSize")
+fun rememberWindowState(
+ placement: WindowPlacement = WindowPlacement.Floating,
+ isMinimized: Boolean = false,
+ position: WindowPosition = WindowPosition.PlatformDefault,
+ size: WindowSize
+): WindowState = rememberSaveable(saver = WindowStateImpl.Saver(position)) {
+ WindowStateImpl(
+ placement,
+ isMinimized,
+ position,
+ DpSize(size.width, size.height)
+ )
+}
+
+/**
+ * Creates a [WindowState] that is remembered across compositions.
+ *
+ * Changes to the provided initial values will **not** result in the state being recreated or
+ * changed in any way if it has already been created.
+ *
+ * @param placement the initial value for [WindowState.placement]
+ * @param isMinimized the initial value for [WindowState.isMinimized]
+ * @param position the initial value for [WindowState.position]
* @param width the initial value for width of [WindowState.size]
* @param height the initial value for height of [WindowState.size]
*/
@@ -76,7 +105,7 @@
placement,
isMinimized,
position,
- WindowSize(width, height)
+ DpSize(width, height)
)
}
@@ -93,7 +122,7 @@
placement: WindowPlacement = WindowPlacement.Floating,
isMinimized: Boolean = false,
position: WindowPosition = WindowPosition.PlatformDefault,
- size: WindowSize = WindowSize(800.dp, 600.dp)
+ size: DpSize = DpSize(800.dp, 600.dp)
): WindowState = WindowStateImpl(
placement, isMinimized, position, size
)
@@ -105,6 +134,26 @@
* @param placement the initial value for [WindowState.placement]
* @param isMinimized the initial value for [WindowState.isMinimized]
* @param position the initial value for [WindowState.position]
+ * @param size the initial value for [WindowState.size]
+ */
+@Deprecated("Use WindowState which accepts DpSize")
+@Suppress("DEPRECATION")
+fun WindowState(
+ placement: WindowPlacement = WindowPlacement.Floating,
+ isMinimized: Boolean = false,
+ position: WindowPosition = WindowPosition.PlatformDefault,
+ size: WindowSize
+): WindowState = WindowStateImpl(
+ placement, isMinimized, position, DpSize(size.width, size.height)
+)
+
+/**
+ * A state object that can be hoisted to control and observe window attributes
+ * (size/position/state).
+ *
+ * @param placement the initial value for [WindowState.placement]
+ * @param isMinimized the initial value for [WindowState.isMinimized]
+ * @param position the initial value for [WindowState.position]
* @param width the initial value for width of [WindowState.size]
* @param height the initial value for height of [WindowState.size]
*/
@@ -115,7 +164,7 @@
width: Dp = 800.dp,
height: Dp = 600.dp
): WindowState = WindowStateImpl(
- placement, isMinimized, position, WindowSize(width, height)
+ placement, isMinimized, position, DpSize(width, height)
)
/**
@@ -144,21 +193,22 @@
* The current size of the window.
*
* If the size is not specified
- * ([WindowSize.isSpecified] is false), the size will be set to absolute values
+ * ([DpSize.width.isSpecified] or [DpSize.height.isSpecified] is false), the size will be set
+ * to absolute values
* ([Dp.isSpecified] is true) when the window appears on the screen.
*
* Unspecified can be only width, only height, or both. If, for example, window contains some
- * text and we use size=WindowSize(300.dp, Dp.Unspecified) then the width will be exactly
+ * text and we use size=DpSize(300.dp, Dp.Unspecified) then the width will be exactly
* 300.dp, but the height will be such that all the text will fit.
*/
- var size: WindowSize
+ var size: DpSize
}
private class WindowStateImpl(
placement: WindowPlacement,
isMinimized: Boolean,
position: WindowPosition,
- size: WindowSize
+ size: DpSize
) : WindowState {
override var placement by mutableStateOf(placement)
override var isMinimized by mutableStateOf(isMinimized)
@@ -190,7 +240,7 @@
} else {
unspecifiedPosition
},
- size = WindowSize((state[5] as Float).dp, (state[6] as Float).dp),
+ size = DpSize((state[5] as Float).dp, (state[6] as Float).dp),
)
}
)
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/DesktopDialog.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/DesktopDialog.desktop.kt
deleted file mode 100644
index b98b817..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/DesktopDialog.desktop.kt
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.ui.window.v1
-
-import androidx.compose.desktop.AppWindow
-import androidx.compose.desktop.LocalAppWindow
-import androidx.compose.desktop.WindowEvents
-import androidx.compose.runtime.Composable
-import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.remember
-import androidx.compose.runtime.rememberCompositionContext
-import androidx.compose.ui.unit.IntOffset
-import androidx.compose.ui.unit.IntSize
-import java.awt.image.BufferedImage
-
-/**
- * Properties used to customize the behavior of a [Dialog].
- *
- * @param title The title of the dialog window.
- * The title is displayed in the windows's native border.
- * @param size The initial size of the dialog window.
- * @param location The initial position of the dialog window in screen space. This parameter is
- * ignored if [center] is set to true.
- * @param centered Determines if the window is centered on startup. The default value for the
- * dialog is true.
- * @param icon The icon for the dialog window displayed on the system taskbar.
- * @param menuBar Window menu bar. The menu bar can be displayed inside a window (Windows,
- * Linux) or at the top of the screen (Mac OS).
- * @param undecorated Removes the native window border if set to true. The default value is false.
- * @param resizable Makes the window resizable if is set to true and unresizable if is set to
- * false. The default value is true.
- * @param events Allows to describe events of the window.
- * Supported events: onOpen, onClose, onMinimize, onMaximize, onRestore, onFocusGet, onFocusLost,
- * onResize, onRelocate.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Window_API_new)"
-)
-@Immutable
-data class DialogProperties(
- val title: String = "JetpackDesktopDialog",
- val size: IntSize = IntSize(400, 250),
- val location: IntOffset = IntOffset.Zero,
- val centered: Boolean = true,
- val icon: BufferedImage? = null,
- val menuBar: MenuBar? = null,
- val undecorated: Boolean = false,
- val resizable: Boolean = true,
- val events: WindowEvents = WindowEvents()
-)
-
-/**
- * Opens a dialog with the given content.
- *
- * The dialog is visible as long as it is part of the composition hierarchy.
- * In order to let the user dismiss the Dialog, the implementation of [onDismissRequest] should
- * contain a way to remove to remove the dialog from the composition hierarchy.
- *
- * @param onDismissRequest Executes when the user tries to dismiss the dialog.
- * @param properties [DialogProperties] for further customization of this dialog's behavior.
- * @param content The content to be displayed inside the dialog.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Window_API_new)"
-)
-@Composable
-fun Dialog(
- onDismissRequest: () -> Unit,
- properties: DialogProperties = DialogProperties(),
- content: @Composable () -> Unit
-) {
- val attached = LocalAppWindow.current
- if (attached.pair != null) {
- return
- }
-
- val parentComposition = rememberCompositionContext()
- val dialog = remember {
- AppWindow(
- attached = attached,
- title = properties.title,
- size = properties.size,
- location = properties.location,
- centered = properties.centered,
- icon = properties.icon,
- menuBar = properties.menuBar,
- undecorated = properties.undecorated,
- resizable = properties.resizable,
- events = properties.events,
- onDismissRequest = onDismissRequest
- )
- }
-
- DisposableEffect(Unit) {
- dialog.show(parentComposition) {
- content()
- }
- onDispose {
- if (!dialog.isClosed) {
- // There are two closing situations of dialog windows:
- // 1. by [onDismissRequest]
- // 2. directly closing the dialog by clicking the close button or calling
- // the [close ()] JFrame method.
- // In the first case [onDismissRequest] is called first, then [onDismissRequest]
- // calls [onDispose], [onDispose] invokes [dialog.close()], [dialog.close()]
- // calls [onDismissRequest] again.
- // To prevent double invocation of [onDismissRequest] we should clear
- // the [onDismiss (originally - onDismissRequest)] event of the dialog window.
- dialog.onDismiss = null
-
- // directly closes the Swing window
- dialog.close()
- }
- }
- }
-}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/MenuBar.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/MenuBar.desktop.kt
deleted file mode 100644
index 9a18f99..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/MenuBar.desktop.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.ui.window.v1
-
-import org.jetbrains.skiko.Library
-import java.awt.event.ActionEvent
-import java.awt.event.ActionListener
-import javax.swing.JMenu
-import javax.swing.JMenuBar
-import javax.swing.JMenuItem
-
-/**
- * MenuBar is a class that represents a menu bar that can be attached to a window.
- * The menu bar can be displayed inside a window (Windows, Linux) or at the top of
- * the screen (Mac OS).
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new)"
-)
-class MenuBar {
- internal var menuBar: JMenuBar
-
- init {
- menuBar = JMenuBar()
- // For the MenuBar to work correctly, we need to set the skiko system properties
- Library.load()
- }
-
- /**
- * Constructs a MenuBar with the given menus.
- *
- * @param menu MenuBar menus.
- */
- constructor(vararg menu: Menu) {
- menu(menu)
- }
-
- /**
- * Adds additional menus to the MenuBar.
- */
- fun add(vararg menu: Menu) {
- menu(menu)
- }
-
- private fun menu(list: Array<out Menu>) {
- for (item in list) {
- val menu = JMenu(item.name)
- menuBar.add(menu)
-
- for (menuItem in item.list) {
- val value = JMenuItem(menuItem.name)
- value.setAccelerator(menuItem.shortcut)
- value.addActionListener(object : ActionListener {
- public override fun actionPerformed(e: ActionEvent) {
- menuItem.action?.invoke()
- }
- })
- menu.add(value)
- }
- }
- }
-}
-
-/**
- * Menu is a class that represents a menu on a menu bar.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new)"
-)
-class Menu {
- /**
- * Gets the menu name.
- */
- val name: String
-
- /**
- * Gets the menu items.
- */
- val list: List<MenuItem>
-
- /**
- * Constructs a Menu with the given name and menu items.
- *
- * @param name Menu name.
- * @param item Menu items.
- */
- constructor(name: String, vararg item: MenuItem) {
- this.name = name
- this.list = item.asList()
- }
-}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/MenuItem.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/MenuItem.desktop.kt
deleted file mode 100644
index 94113b11..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/MenuItem.desktop.kt
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.ui.window.v1
-
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.input.key.Key
-import androidx.compose.ui.input.key.nativeKeyCode
-import java.awt.Toolkit
-import javax.swing.KeyStroke
-
-/**
- * MenuItem is a class that represents an implementation of an item in a menu.
- * Can be used with Menu or Tray.
- */
-@OptIn(ExperimentalComposeUiApi::class)
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new)"
-)
-@Suppress("DEPRECATION")
-class MenuItem {
-
- /**
- * Gets the MenuItem name.
- */
- val name: String
-
- /**
- * Gets the MenuItem action when it is clicked or a keyboard shortcut is pressed (if specified).
- */
- val action: (() -> Unit)?
-
- /**
- * Gets the MenuItem shortcut.
- */
- val shortcut: KeyStroke
-
- /**
- * Constructs a MenuItem with the given name, action, and keyboard shortcut.
- *
- * @param name MenuItem name.
- * @param onClick MenuItem action.
- * @param shortcut MenuItem keyboard shortcut.
- */
- constructor(
- name: String,
- onClick: (() -> Unit)? = null,
- shortcut: KeyStroke = KeyStroke(Key.Unknown)
- ) {
- this.name = name
- this.action = onClick
- this.shortcut = shortcut
- }
-}
-
-/**
- * Returns KeyStroke for the given key. KeyStroke contains a OS-specific modifier
- * (Command on Mac OS and Control on Windows and Linux) and the given key.
- *
- * @param key Keyboard key.
- *
- * @return KeyStroke for the given key.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new)"
-)
-fun KeyStroke(key: Key): KeyStroke {
- return KeyStroke.getKeyStroke(
- key.nativeKeyCode,
- Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()
- )
-}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/Tray.desktop.kt b/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/Tray.desktop.kt
deleted file mode 100644
index 2233163..0000000
--- a/compose/ui/ui/src/desktopMain/kotlin/androidx/compose/ui/window/v1/Tray.desktop.kt
+++ /dev/null
@@ -1,170 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-@file:Suppress("DEPRECATION")
-
-package androidx.compose.ui.window.v1
-
-import java.awt.Image
-import java.awt.PopupMenu
-import java.awt.SystemTray
-import java.awt.TrayIcon
-import java.awt.TrayIcon.MessageType
-import java.awt.event.ActionEvent
-import java.awt.event.ActionListener
-
-/**
- * Tray is class for working with the system tray.
- */
-@Deprecated(
- "Use new Composable Window API (https://github.com/JetBrains/compose-jb/" +
- "tree/master/tutorials/Tray_Notifications_MenuBar_new)"
-)
-class Tray {
- private lateinit var trayIcon: TrayIcon
- private var init: Boolean = false
-
- init {
- init = SystemTray.isSupported()
- }
-
- /**
- * Constructs a Tray with the empty icon image.
- */
- constructor() {}
-
- /**
- * Constructs a Tray with the given icon image.
- *
- * @param image Tray icon image.
- */
- constructor(image: Image) {
- if (!init) {
- return
- }
-
- trayIcon = TrayIcon(image)
- trayIcon.setImageAutoSize(true)
- }
-
- /**
- * Constructs a Tray with the given icon image and tooltip.
- *
- * @param image Tray icon image.
- * @param tooltip Tray icon tooltip.
- */
- constructor(image: Image, tooltip: String) {
- if (!init) {
- return
- }
-
- trayIcon = TrayIcon(image, tooltip)
- trayIcon.setImageAutoSize(true)
- }
-
- /**
- * Sets the Tray icon image.
- *
- * @param image Tray icon image.
- */
- fun icon(image: Image) {
- if (!init) {
- return
- }
- if (this::trayIcon.isInitialized) {
- trayIcon.setImage(image)
- } else {
- trayIcon = TrayIcon(image)
- trayIcon.setImageAutoSize(true)
- }
- }
-
- /**
- * Sets the Tray menu.
- *
- * @param item Menu items.
- */
- fun menu(vararg item: MenuItem) {
- if (!init) {
- return
- }
- val popup = PopupMenu()
- for (menuItem in item) {
- val value = java.awt.MenuItem(menuItem.name)
- value.addActionListener(object : ActionListener {
- public override fun actionPerformed(e: ActionEvent) {
- menuItem.action?.invoke()
- }
- })
- popup.add(value)
- }
- trayIcon.setPopupMenu(popup)
- try {
- SystemTray.getSystemTray().add(trayIcon)
- } catch (e: Exception) {
- println("TrayIcon could not be added.")
- }
- }
-
- /**
- * Sends a regular notification with the given title and message.
- *
- * @param title Notification title.
- * @param message Notification message.
- */
- fun notify(title: String, message: String) {
- if (!init) {
- return
- }
- trayIcon.displayMessage(title, message, MessageType.INFO)
- }
-
- /**
- * Sends a warning notification with the given title and message.
- *
- * @param title Notification title.
- * @param message Notification message.
- */
- fun warn(title: String, message: String) {
- if (!init) {
- return
- }
- trayIcon.displayMessage(title, message, MessageType.WARNING)
- }
-
- /**
- * Sends a error notification with the given title and message.
- *
- * @param title Notification title.
- * @param message Notification message.
- */
- fun error(title: String, message: String) {
- if (!init) {
- return
- }
- trayIcon.displayMessage(title, message, MessageType.ERROR)
- }
-
- /**
- * Removes the tray icon from the system tray.
- */
- fun remove() {
- try {
- SystemTray.getSystemTray().remove(trayIcon)
- } catch (e: Exception) {
- println("TrayIcon could not be removed.")
- }
- }
-}
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt
similarity index 93%
rename from compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
rename to compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt
index d068deb..e8975b4 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/DesktopOwnerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/ComposeSceneTest.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2020 The Android Open Source Project
+ * Copyright 2021 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package androidx.compose.ui.platform
+package androidx.compose.ui
import androidx.compose.animation.core.LinearEasing
import androidx.compose.animation.core.TweenSpec
@@ -41,8 +41,6 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.clipToBounds
import androidx.compose.ui.focus.FocusRequester
import androidx.compose.ui.focus.FocusState
@@ -55,7 +53,10 @@
import androidx.compose.ui.input.key.Key
import androidx.compose.ui.input.key.KeyEventType
import androidx.compose.ui.input.key.keyEvent
+import androidx.compose.ui.input.pointer.PointerEventType
import androidx.compose.ui.layout.Layout
+import androidx.compose.ui.test.InternalTestApi
+import androidx.compose.ui.platform.renderingTest
import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
import androidx.compose.ui.test.junit4.createComposeRule
import androidx.compose.ui.test.onRoot
@@ -65,13 +66,16 @@
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import org.junit.Assert.assertFalse
+import org.junit.Ignore
import org.junit.Rule
import org.junit.Test
import java.awt.event.KeyEvent
-class DesktopOwnerTest {
+@OptIn(InternalTestApi::class, ExperimentalComposeUiApi::class)
+class ComposeSceneTest {
@get:Rule
- val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/ui")
+ val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop")
+
@get:Rule
val composeRule = createComposeRule()
@@ -273,20 +277,20 @@
screenshotRule.snap(surface, "frame1_initial")
assertFalse(hasRenders())
- owners.onMousePressed(2, 2)
+ scene.sendPointerEvent(PointerEventType.Press, Offset(2f, 2f))
awaitNextRender()
screenshotRule.snap(surface, "frame2_onMousePressed")
assertFalse(hasRenders())
- owners.onMouseMoved(1, 1)
+ scene.sendPointerEvent(PointerEventType.Move, Offset(1f, 1f))
assertFalse(hasRenders())
- owners.onMouseReleased(1, 1)
+ scene.sendPointerEvent(PointerEventType.Release, Offset(1f, 1f))
awaitNextRender()
screenshotRule.snap(surface, "frame3_onMouseReleased")
- owners.onMouseMoved(1, 1)
- owners.onMousePressed(3, 3)
+ scene.sendPointerEvent(PointerEventType.Move, Offset(1f, 1f))
+ scene.sendPointerEvent(PointerEventType.Press, Offset(3f, 3f))
awaitNextRender()
screenshotRule.snap(surface, "frame4_onMouseMoved_onMousePressed")
assertFalse(hasRenders())
@@ -447,6 +451,11 @@
private class TestException : RuntimeException()
@ExperimentalComposeUiApi
+ @Ignore(
+ "This test never ends now, because we don't support InfiniteAnimationPolicy. It can " +
+ "end in the previous commits after 2min, but probably because we have a bug in the " +
+ "previous commits."
+ )
@Test
fun `focus management by keys`() {
var field1FocusState: FocusState? = null
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt
index 481f255..8146733 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/TestUtils.kt
@@ -25,10 +25,13 @@
import java.awt.Image
import java.awt.Window
import java.awt.event.KeyEvent
+import java.awt.event.MouseEvent
+import java.awt.event.MouseWheelEvent
import java.awt.image.BufferedImage
import java.awt.image.MultiResolutionImage
import javax.swing.Icon
import javax.swing.ImageIcon
+import javax.swing.JFrame
fun testImage(color: Color): Painter = run {
val bitmap = ImageBitmap(100, 100)
@@ -49,11 +52,11 @@
internal val isWindows = os.startsWith("win")
internal val isMacOs = os.startsWith("mac")
-fun Window.sendKey(
+fun Window.sendKeyEvent(
code: Int,
modifiers: Int = 0
-) = dispatchEvent(
- KeyEvent(
+): Boolean {
+ val event = KeyEvent(
focusOwner,
KeyEvent.KEY_PRESSED,
0,
@@ -62,4 +65,57 @@
code.toChar(),
KeyEvent.KEY_LOCATION_STANDARD
)
-)
\ No newline at end of file
+ dispatchEvent(event)
+ return event.isConsumed
+}
+
+fun JFrame.sendMouseEvent(
+ id: Int,
+ x: Int,
+ y: Int,
+ modifiers: Int = 0
+): Boolean {
+ // we use width and height instead of x and y because we can send (-1, -1), but still need
+ // the component inside window
+ val component = findComponentAt(width / 2, height / 2)
+ val event = MouseEvent(
+ component,
+ id,
+ 0,
+ modifiers,
+ x,
+ y,
+ 1,
+ false
+ )
+ component.dispatchEvent(event)
+ return event.isConsumed
+}
+
+fun JFrame.sendMouseWheelEvent(
+ id: Int,
+ x: Int,
+ y: Int,
+ scrollType: Int,
+ scrollAmount: Int,
+ modifiers: Int = 0,
+): Boolean {
+ // we use width and height instead of x and y because we can send (-1, -1), but still need
+ // the component inside window
+ val component = findComponentAt(width / 2, height / 2)
+ val event = MouseWheelEvent(
+ component,
+ id,
+ 0,
+ modifiers,
+ x,
+ y,
+ 1,
+ false,
+ scrollType,
+ scrollAmount,
+ 1
+ )
+ component.dispatchEvent(event)
+ return event.isConsumed
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt
index 2afa930..b4ec048 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseHoverFilterTest.kt
@@ -18,8 +18,10 @@
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
-import androidx.compose.ui.input.pointer.pointerMoveFilter
+import androidx.compose.ui.input.pointer.PointerEventType
+import androidx.compose.ui.input.pointer.pointerInput
import androidx.compose.ui.platform.TestComposeWindow
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.dp
@@ -28,6 +30,7 @@
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+@OptIn(ExperimentalComposeUiApi::class)
@RunWith(JUnit4::class)
class MouseHoverFilterTest {
private val window = TestComposeWindow(width = 100, height = 100, density = Density(2f))
@@ -41,18 +44,15 @@
window.setContent {
Box(
modifier = Modifier
- .pointerMoveFilter(
+ .pointerMove(
onMove = {
moveCount++
- false
},
onEnter = {
enterCount++
- false
},
onExit = {
exitCount++
- false
}
)
.size(10.dp, 20.dp)
@@ -96,18 +96,15 @@
window.setContent {
Box(
modifier = Modifier
- .pointerMoveFilter(
+ .pointerMove(
onMove = {
moveCount++
- false
},
onEnter = {
enterCount++
- false
},
onExit = {
exitCount++
- false
}
)
.size(10.dp, 20.dp)
@@ -127,4 +124,21 @@
assertThat(exitCount).isEqualTo(1)
assertThat(moveCount).isEqualTo(0)
}
-}
\ No newline at end of file
+}
+
+private fun Modifier.pointerMove(
+ onMove: () -> Unit,
+ onExit: () -> Unit,
+ onEnter: () -> Unit,
+): Modifier = pointerInput(onMove, onExit, onEnter) {
+ awaitPointerEventScope {
+ while (true) {
+ val event = awaitPointerEvent()
+ when (event.type) {
+ PointerEventType.Move -> onMove()
+ PointerEventType.Enter -> onEnter()
+ PointerEventType.Exit -> onExit()
+ }
+ }
+ }
+}
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt
index 21d8cde..e313a10 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/input/mouse/MouseScrollFilterTest.kt
@@ -18,6 +18,7 @@
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.size
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.TestComposeWindow
import androidx.compose.ui.unit.Density
@@ -28,6 +29,7 @@
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
+@OptIn(ExperimentalComposeUiApi::class)
@RunWith(JUnit4::class)
class MouseScrollFilterTest {
private val window = TestComposeWindow(width = 100, height = 100, density = Density(2f))
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt
index 4c9aa09..57376b1 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/GraphicsLayerTest.kt
@@ -25,6 +25,7 @@
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.TransformOrigin
import androidx.compose.ui.graphics.graphicsLayer
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
import androidx.compose.ui.unit.dp
import org.junit.Rule
@@ -33,6 +34,7 @@
import org.junit.runners.JUnit4
@RunWith(JUnit4::class)
+@OptIn(InternalTestApi::class)
class GraphicsLayerTest {
@get:Rule
val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/platform")
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
index 9e00a85..a8f8501 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/platform/RenderingTestScope.kt
@@ -17,13 +17,14 @@
package androidx.compose.ui.platform
import androidx.compose.runtime.Composable
+import androidx.compose.ui.ComposeScene
+import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb
+import androidx.compose.ui.unit.Constraints
import androidx.compose.ui.unit.Density
import kotlinx.coroutines.CompletableDeferred
-import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
-import kotlinx.coroutines.cancel
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.swing.Swing
import kotlinx.coroutines.yield
@@ -46,6 +47,7 @@
}
}
+@OptIn(ExperimentalComposeUiApi::class)
internal class RenderingTestScope(
val width: Int,
val height: Int,
@@ -53,45 +55,41 @@
) {
var currentTimeMillis = 0L
- private val coroutineScope = CoroutineScope(coroutineContext)
private val frameDispatcher = FrameDispatcher(coroutineContext) {
onRender(currentTimeMillis * 1_000_000)
}
val surface: Surface = Surface.makeRasterN32Premul(width, height)
val canvas: Canvas = surface.canvas
- val owners = DesktopOwners(
- coroutineScope = coroutineScope,
+ val scene = ComposeScene(
+ coroutineContext = coroutineContext,
invalidate = frameDispatcher::scheduleFrame
- )
- private var owner: DesktopOwner? = null
+ ).apply {
+ constraints = Constraints(maxWidth = width, maxHeight = height)
+ }
var density: Float
- get() = owner!!.density.density
+ get() = scene.density.density
set(value) {
- owner!!.density = Density(value, owner!!.density.fontScale)
+ scene.density = Density(value, scene.density.fontScale)
}
fun dispose() {
- owner?.dispose()
+ scene.dispose()
frameDispatcher.cancel()
- coroutineScope.cancel()
}
private var onRender = CompletableDeferred<Unit>()
fun setContent(content: @Composable () -> Unit) {
- owner?.dispose()
- val owner = DesktopOwner(owners)
- owner.setContent {
+ scene.setContent {
content()
}
- this.owner = owner
}
private fun onRender(timeNanos: Long) {
canvas.clear(Color.Transparent.toArgb())
- owners.onFrame(canvas, width, height, timeNanos)
+ scene.render(canvas, timeNanos)
onRender.complete(Unit)
}
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
index 4eb72bb..30389c3 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/res/DesktopSvgResourcesTest.kt
@@ -24,12 +24,14 @@
import androidx.compose.ui.isWindows
import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.platform.TestComposeWindow
+import androidx.compose.ui.test.InternalTestApi
import androidx.compose.ui.test.junit4.DesktopScreenshotTestRule
import androidx.compose.ui.unit.dp
import org.junit.Assume.assumeTrue
import org.junit.Rule
import org.junit.Test
+@OptIn(InternalTestApi::class)
class DesktopSvgResourcesTest {
@get:Rule
val screenshotRule = DesktopScreenshotTestRule("compose/ui/ui-desktop/res")
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt
index 97e33d7..bcd2437 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/ApplicationTest.kt
@@ -28,6 +28,7 @@
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.ComposeWindow
import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.CompletableDeferred
@@ -84,7 +85,7 @@
Window(
onCloseRequest = {},
state = rememberWindowState(
- size = WindowSize(600.dp, 600.dp),
+ size = DpSize(600.dp, 600.dp),
)
) {
window1 = this.window
@@ -98,7 +99,7 @@
Window(
onCloseRequest = {},
state = rememberWindowState(
- size = WindowSize(300.dp, 300.dp),
+ size = DpSize(300.dp, 300.dp),
)
) {
window2 = this.window
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt
index 916cffb..461d9e1 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/dialog/DialogTest.kt
@@ -38,10 +38,10 @@
import androidx.compose.ui.input.key.key
import androidx.compose.ui.input.key.onKeyEvent
import androidx.compose.ui.input.key.onPreviewKeyEvent
-import androidx.compose.ui.sendKey
+import androidx.compose.ui.sendKeyEvent
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.launchApplication
import androidx.compose.ui.window.rememberDialogState
import androidx.compose.ui.window.runApplicationTest
@@ -260,7 +260,7 @@
Dialog(
onCloseRequest = {},
state = rememberDialogState(
- size = WindowSize(600.dp, 600.dp),
+ size = DpSize(600.dp, 600.dp),
)
) {
window1 = this.window
@@ -270,7 +270,7 @@
Dialog(
onCloseRequest = {},
state = rememberDialogState(
- size = WindowSize(300.dp, 300.dp),
+ size = DpSize(300.dp, 300.dp),
)
) {
window2 = this.window
@@ -316,7 +316,7 @@
Dialog(
onCloseRequest = {},
state = rememberDialogState(
- size = WindowSize(600.dp, 600.dp),
+ size = DpSize(600.dp, 600.dp),
)
) {
actualValue1 = localTestValue.current
@@ -325,7 +325,7 @@
Dialog(
onCloseRequest = {},
state = rememberDialogState(
- size = WindowSize(300.dp, 300.dp),
+ size = DpSize(300.dp, 300.dp),
)
) {
actualValue2 = localTestValue.current
@@ -407,19 +407,19 @@
awaitIdle()
- window?.sendKey(KeyEvent.VK_Q)
+ window?.sendKeyEvent(KeyEvent.VK_Q)
awaitIdle()
assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.Q))
assertThat(onKeyEventKeys).isEqualTo(emptySet<Key>())
clear()
- window?.sendKey(KeyEvent.VK_W)
+ window?.sendKeyEvent(KeyEvent.VK_W)
awaitIdle()
assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.W))
assertThat(onKeyEventKeys).isEqualTo(setOf(Key.W))
clear()
- window?.sendKey(KeyEvent.VK_E)
+ window?.sendKeyEvent(KeyEvent.VK_E)
awaitIdle()
assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.E))
assertThat(onKeyEventKeys).isEqualTo(setOf(Key.E))
@@ -479,7 +479,7 @@
awaitIdle()
- window?.sendKey(KeyEvent.VK_Q)
+ window?.sendKeyEvent(KeyEvent.VK_Q)
awaitIdle()
assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.Q))
assertThat(onNodePreviewKeyEventKeys).isEqualTo(emptySet<Key>())
@@ -487,7 +487,7 @@
assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
clear()
- window?.sendKey(KeyEvent.VK_W)
+ window?.sendKeyEvent(KeyEvent.VK_W)
awaitIdle()
assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.W))
assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.W))
@@ -495,7 +495,7 @@
assertThat(onWindowKeyEventKeys).isEqualTo(setOf(Key.W))
clear()
- window?.sendKey(KeyEvent.VK_E)
+ window?.sendKeyEvent(KeyEvent.VK_E)
awaitIdle()
assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.E))
assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.E))
@@ -503,7 +503,7 @@
assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
clear()
- window?.sendKey(KeyEvent.VK_R)
+ window?.sendKeyEvent(KeyEvent.VK_R)
awaitIdle()
assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.R))
assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.R))
@@ -511,7 +511,7 @@
assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
clear()
- window?.sendKey(KeyEvent.VK_T)
+ window?.sendKeyEvent(KeyEvent.VK_T)
awaitIdle()
assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.T))
assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.T))
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt
new file mode 100644
index 0000000..e43210c
--- /dev/null
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowInputEventTest.kt
@@ -0,0 +1,366 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.compose.ui.window.window
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.size
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.runtime.remember
+import androidx.compose.ui.ExperimentalComposeUiApi
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.awt.ComposeWindow
+import androidx.compose.ui.focus.FocusRequester
+import androidx.compose.ui.focus.focusRequester
+import androidx.compose.ui.focus.focusTarget
+import androidx.compose.ui.geometry.Offset
+import androidx.compose.ui.input.key.Key
+import androidx.compose.ui.input.key.key
+import androidx.compose.ui.input.key.onKeyEvent
+import androidx.compose.ui.input.key.onPreviewKeyEvent
+import androidx.compose.ui.input.mouse.MouseScrollEvent
+import androidx.compose.ui.input.mouse.MouseScrollUnit
+import androidx.compose.ui.input.mouse.mouseScrollFilter
+import androidx.compose.ui.input.pointer.PointerEvent
+import androidx.compose.ui.input.pointer.pointerInput
+import androidx.compose.ui.input.pointer.pointerMoveFilter
+import androidx.compose.ui.sendKeyEvent
+import androidx.compose.ui.sendMouseEvent
+import androidx.compose.ui.sendMouseWheelEvent
+import androidx.compose.ui.unit.dp
+import androidx.compose.ui.window.Window
+import androidx.compose.ui.window.density
+import androidx.compose.ui.window.launchApplication
+import androidx.compose.ui.window.rememberWindowState
+import androidx.compose.ui.window.runApplicationTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import java.awt.event.KeyEvent
+import java.awt.event.MouseEvent
+import java.awt.event.MouseWheelEvent
+
+@OptIn(ExperimentalComposeUiApi::class)
+class WindowInputEventTest {
+ @Test
+ fun `catch key handlers`() = runApplicationTest {
+ var window: ComposeWindow? = null
+ val onKeyEventKeys = mutableSetOf<Key>()
+ val onPreviewKeyEventKeys = mutableSetOf<Key>()
+
+ fun clear() {
+ onKeyEventKeys.clear()
+ onPreviewKeyEventKeys.clear()
+ }
+
+ launchApplication {
+ Window(
+ onCloseRequest = ::exitApplication,
+ onPreviewKeyEvent = {
+ onPreviewKeyEventKeys.add(it.key)
+ it.key == Key.Q
+ },
+ onKeyEvent = {
+ onKeyEventKeys.add(it.key)
+ it.key == Key.W
+ }
+ ) {
+ window = this.window
+ }
+ }
+
+ awaitIdle()
+
+ window?.sendKeyEvent(KeyEvent.VK_Q)
+ awaitIdle()
+ assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.Q))
+ assertThat(onKeyEventKeys).isEqualTo(emptySet<Key>())
+
+ clear()
+ window?.sendKeyEvent(KeyEvent.VK_W)
+ awaitIdle()
+ assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.W))
+ assertThat(onKeyEventKeys).isEqualTo(setOf(Key.W))
+
+ clear()
+ window?.sendKeyEvent(KeyEvent.VK_E)
+ awaitIdle()
+ assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.E))
+ assertThat(onKeyEventKeys).isEqualTo(setOf(Key.E))
+
+ exitApplication()
+ }
+
+ @Test
+ fun `catch key handlers with focused node`() = runApplicationTest {
+ var window: ComposeWindow? = null
+ val onWindowKeyEventKeys = mutableSetOf<Key>()
+ val onWindowPreviewKeyEventKeys = mutableSetOf<Key>()
+ val onNodeKeyEventKeys = mutableSetOf<Key>()
+ val onNodePreviewKeyEventKeys = mutableSetOf<Key>()
+
+ fun clear() {
+ onWindowKeyEventKeys.clear()
+ onWindowPreviewKeyEventKeys.clear()
+ onNodeKeyEventKeys.clear()
+ onNodePreviewKeyEventKeys.clear()
+ }
+
+ launchApplication {
+ Window(
+ onCloseRequest = ::exitApplication,
+ onPreviewKeyEvent = {
+ onWindowPreviewKeyEventKeys.add(it.key)
+ it.key == Key.Q
+ },
+ onKeyEvent = {
+ onWindowKeyEventKeys.add(it.key)
+ it.key == Key.W
+ },
+ ) {
+ window = this.window
+
+ val focusRequester = remember(::FocusRequester)
+ LaunchedEffect(Unit) {
+ focusRequester.requestFocus()
+ }
+
+ Box(
+ Modifier
+ .focusRequester(focusRequester)
+ .focusTarget()
+ .onPreviewKeyEvent {
+ onNodePreviewKeyEventKeys.add(it.key)
+ it.key == Key.E
+ }
+ .onKeyEvent {
+ onNodeKeyEventKeys.add(it.key)
+ it.key == Key.R
+ }
+ )
+ }
+ }
+
+ awaitIdle()
+
+ window?.sendKeyEvent(KeyEvent.VK_Q)
+ awaitIdle()
+ assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.Q))
+ assertThat(onNodePreviewKeyEventKeys).isEqualTo(emptySet<Key>())
+ assertThat(onNodeKeyEventKeys).isEqualTo(emptySet<Key>())
+ assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
+
+ clear()
+ window?.sendKeyEvent(KeyEvent.VK_W)
+ awaitIdle()
+ assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.W))
+ assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.W))
+ assertThat(onNodeKeyEventKeys).isEqualTo(setOf(Key.W))
+ assertThat(onWindowKeyEventKeys).isEqualTo(setOf(Key.W))
+
+ clear()
+ window?.sendKeyEvent(KeyEvent.VK_E)
+ awaitIdle()
+ assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.E))
+ assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.E))
+ assertThat(onNodeKeyEventKeys).isEqualTo(emptySet<Key>())
+ assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
+
+ clear()
+ window?.sendKeyEvent(KeyEvent.VK_R)
+ awaitIdle()
+ assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.R))
+ assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.R))
+ assertThat(onNodeKeyEventKeys).isEqualTo(setOf(Key.R))
+ assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
+
+ clear()
+ window?.sendKeyEvent(KeyEvent.VK_T)
+ awaitIdle()
+ assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.T))
+ assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.T))
+ assertThat(onNodeKeyEventKeys).isEqualTo(setOf(Key.T))
+ assertThat(onWindowKeyEventKeys).isEqualTo(setOf(Key.T))
+
+ exitApplication()
+ }
+
+ @Test
+ fun `catch mouse press + move + release`() = runApplicationTest {
+ lateinit var window: ComposeWindow
+
+ val events = mutableListOf<PointerEvent>()
+
+ launchApplication {
+ Window(
+ onCloseRequest = ::exitApplication,
+ state = rememberWindowState(width = 200.dp, height = 100.dp)
+ ) {
+ window = this.window
+
+ Box(
+ Modifier.fillMaxSize().pointerInput(events) {
+ while (true) {
+ awaitPointerEventScope {
+ events += awaitPointerEvent()
+ }
+ }
+ }
+ )
+ }
+ }
+ val density by lazy { window.density.density }
+
+ awaitIdle()
+ assertThat(events.size).isEqualTo(0)
+
+ window.sendMouseEvent(MouseEvent.MOUSE_PRESSED, x = 100, y = 50)
+ awaitIdle()
+ assertThat(events.size).isEqualTo(1)
+ assertThat(events.last().pressed).isEqualTo(true)
+ assertThat(events.last().position).isEqualTo(Offset(100 * density, 50 * density))
+
+ window.sendMouseEvent(MouseEvent.MOUSE_DRAGGED, x = 90, y = 40)
+ awaitIdle()
+ assertThat(events.size).isEqualTo(2)
+ assertThat(events.last().pressed).isEqualTo(true)
+ assertThat(events.last().position).isEqualTo(Offset(90 * density, 40 * density))
+
+ window.sendMouseEvent(MouseEvent.MOUSE_RELEASED, x = 80, y = 30)
+ awaitIdle()
+ assertThat(events.size).isEqualTo(3)
+ assertThat(events.last().pressed).isEqualTo(false)
+ assertThat(events.last().position).isEqualTo(Offset(80 * density, 30 * density))
+
+ exitApplication()
+ }
+
+ @Test
+ fun `catch mouse move`() = runApplicationTest {
+ lateinit var window: ComposeWindow
+
+ val onMoves = mutableListOf<Offset>()
+ var onEnters = 0
+ var onExits = 0
+
+ launchApplication {
+ Window(
+ onCloseRequest = ::exitApplication,
+ state = rememberWindowState(width = 200.dp, height = 100.dp)
+ ) {
+ window = this.window
+
+ Box(
+ Modifier.fillMaxSize().pointerMoveFilter(
+ onMove = { onMoves.add(it); false },
+ onEnter = { onEnters++; false },
+ onExit = { onExits++; false }
+ )
+ )
+ }
+ }
+ val density by lazy { window.density.density }
+
+ awaitIdle()
+ assertThat(onMoves.size).isEqualTo(0)
+ assertThat(onEnters).isEqualTo(0)
+ assertThat(onExits).isEqualTo(0)
+
+ window.sendMouseEvent(MouseEvent.MOUSE_ENTERED, x = 100, y = 50)
+ awaitIdle()
+ assertThat(onMoves.size).isEqualTo(0)
+ assertThat(onEnters).isEqualTo(1)
+ assertThat(onExits).isEqualTo(0)
+
+ window.sendMouseEvent(MouseEvent.MOUSE_MOVED, x = 90, y = 50)
+ awaitIdle()
+ assertThat(onMoves.size).isEqualTo(1)
+ assertThat(onMoves.last()).isEqualTo(Offset(90 * density, 50 * density))
+ assertThat(onEnters).isEqualTo(1)
+ assertThat(onExits).isEqualTo(0)
+
+ window.sendMouseEvent(MouseEvent.MOUSE_PRESSED, x = 90, y = 50)
+ window.sendMouseEvent(MouseEvent.MOUSE_DRAGGED, x = 80, y = 50)
+ window.sendMouseEvent(MouseEvent.MOUSE_RELEASED, x = 80, y = 50)
+ awaitIdle()
+ assertThat(onMoves.size).isEqualTo(2)
+ assertThat(onMoves.last()).isEqualTo(Offset(80 * density, 50 * density))
+ assertThat(onEnters).isEqualTo(1)
+ assertThat(onExits).isEqualTo(0)
+
+ // TODO(https://github.com/JetBrains/compose-jb/issues/1176) fix catching exit event
+// window.sendMouseEvent(MouseEvent.MOUSE_EXITED, x = 900, y = 500)
+// awaitIdle()
+// assertThat(onMoves.size).isEqualTo(2)
+// assertThat(onEnters).isEqualTo(1)
+// assertThat(onExits).isEqualTo(1)
+
+ exitApplication()
+ }
+
+ @Test
+ fun `catch mouse scroll`() = runApplicationTest {
+ lateinit var window: ComposeWindow
+
+ val events = mutableListOf<MouseScrollEvent>()
+
+ launchApplication {
+ Window(
+ onCloseRequest = ::exitApplication,
+ state = rememberWindowState(width = 200.dp, height = 100.dp)
+ ) {
+ window = this.window
+
+ Box(
+ Modifier.fillMaxSize().mouseScrollFilter { event, _ ->
+ events.add(event)
+ false
+ }
+ )
+ }
+ }
+
+ awaitIdle()
+ assertThat(events.size).isEqualTo(0)
+
+ window.sendMouseWheelEvent(
+ MouseEvent.MOUSE_WHEEL,
+ x = 100,
+ y = 50,
+ scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL,
+ scrollAmount = 3
+ )
+ awaitIdle()
+ assertThat(events.size).isEqualTo(1)
+ assertThat(events.last().delta).isEqualTo(MouseScrollUnit.Line(3f))
+
+ window.sendMouseWheelEvent(
+ MouseEvent.MOUSE_WHEEL,
+ x = 100,
+ y = 50,
+ scrollType = MouseWheelEvent.WHEEL_UNIT_SCROLL,
+ scrollAmount = 4
+ )
+ awaitIdle()
+ assertThat(events.size).isEqualTo(2)
+ assertThat(events.last().delta).isEqualTo(MouseScrollUnit.Line(4f))
+
+ exitApplication()
+ }
+
+ private val PointerEvent.pressed get() = changes.first().pressed
+ private val PointerEvent.position get() = changes.first().position
+}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt
index ba00bdf..31d2521 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowStateTest.kt
@@ -30,11 +30,11 @@
import androidx.compose.ui.isLinux
import androidx.compose.ui.isWindows
import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
import androidx.compose.ui.window.WindowPlacement
import androidx.compose.ui.window.WindowPosition
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.WindowState
import androidx.compose.ui.window.launchApplication
import androidx.compose.ui.window.rememberWindowState
@@ -147,7 +147,7 @@
@Test
fun `set size and position before show`() = runApplicationTest(useDelay = isLinux) {
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(242.dp, 242.dp)
)
@@ -169,7 +169,7 @@
@Test
fun `change position after show`() = runApplicationTest(useDelay = isLinux) {
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(200.dp, 200.dp)
)
var window: ComposeWindow? = null
@@ -192,7 +192,7 @@
@Test
fun `change size after show`() = runApplicationTest(useDelay = isLinux) {
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(200.dp, 200.dp)
)
var window: ComposeWindow? = null
@@ -205,7 +205,7 @@
awaitIdle()
- state.size = WindowSize(250.dp, 200.dp)
+ state.size = DpSize(250.dp, 200.dp)
awaitIdle()
assertThat(window?.size).isEqualTo(Dimension(250, 200))
@@ -220,7 +220,7 @@
infix fun Point.maxDistance(other: Point) = max(abs(x - other.x), abs(y - other.y))
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(Alignment.Center)
)
var window: ComposeWindow? = null
@@ -239,7 +239,7 @@
@Test
fun `remember position after reattach`() = runApplicationTest(useDelay = isLinux) {
- val state = WindowState(size = WindowSize(200.dp, 200.dp))
+ val state = WindowState(size = DpSize(200.dp, 200.dp))
var window1: ComposeWindow? = null
var window2: ComposeWindow? = null
var isWindow1 by mutableStateOf(true)
@@ -271,7 +271,7 @@
@Test
fun `state position should be specified after attach`() = runApplicationTest {
- val state = WindowState(size = WindowSize(200.dp, 200.dp))
+ val state = WindowState(size = DpSize(200.dp, 200.dp))
launchApplication {
Window(onCloseRequest = {}, state) {
@@ -292,7 +292,7 @@
// If we set in skiko SkiaLayer.setFullscreen(true) then isFullscreen still returns false
assumeTrue(isWindows || isLinux)
- val state = WindowState(size = WindowSize(200.dp, 200.dp))
+ val state = WindowState(size = DpSize(200.dp, 200.dp))
var window: ComposeWindow? = null
launchApplication {
@@ -316,7 +316,7 @@
@Test
fun maximize() = runApplicationTest(useDelay = isLinux) {
- val state = WindowState(size = WindowSize(200.dp, 200.dp))
+ val state = WindowState(size = DpSize(200.dp, 200.dp))
var window: ComposeWindow? = null
launchApplication {
@@ -340,7 +340,7 @@
@Test
fun minimize() = runApplicationTest {
- val state = WindowState(size = WindowSize(200.dp, 200.dp))
+ val state = WindowState(size = DpSize(200.dp, 200.dp))
var window: ComposeWindow? = null
launchApplication {
@@ -367,7 +367,7 @@
// macOs can't be maximized and minimized at the same time
assumeTrue(isWindows || isLinux)
- val state = WindowState(size = WindowSize(200.dp, 200.dp))
+ val state = WindowState(size = DpSize(200.dp, 200.dp))
var window: ComposeWindow? = null
launchApplication {
@@ -404,7 +404,7 @@
assumeTrue(isWindows)
val state = WindowState(
- size = WindowSize(201.dp, 203.dp),
+ size = DpSize(201.dp, 203.dp),
position = WindowPosition(196.dp, 257.dp)
)
var window: ComposeWindow? = null
@@ -440,7 +440,7 @@
assumeTrue(isWindows)
val state = WindowState(
- size = WindowSize(201.dp, 203.dp),
+ size = DpSize(201.dp, 203.dp),
position = WindowPosition(196.dp, 257.dp)
)
var window: ComposeWindow? = null
@@ -473,7 +473,7 @@
@Test
fun `maximize window before show`() = runApplicationTest(useDelay = isLinux) {
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(Alignment.Center),
placement = WindowPlacement.Maximized,
)
@@ -506,7 +506,7 @@
assumeTrue(isWindows)
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(Alignment.Center),
isMinimized = true
)
@@ -531,7 +531,7 @@
assumeTrue(isLinux || isWindows)
val state = WindowState(
- size = WindowSize(200.dp, 200.dp),
+ size = DpSize(200.dp, 200.dp),
position = WindowPosition(Alignment.Center),
placement = WindowPlacement.Fullscreen,
)
@@ -554,7 +554,7 @@
val initialState = WindowState()
val newState = WindowState(
placement = WindowPlacement.Maximized,
- size = WindowSize(42.dp, 42.dp),
+ size = DpSize(42.dp, 42.dp),
position = WindowPosition(3.dp, 3.dp),
isMinimized = true,
)
@@ -608,7 +608,7 @@
@Test
fun `set window height by its content`() = runApplicationTest(useDelay = isLinux) {
lateinit var window: ComposeWindow
- val state = WindowState(size = WindowSize(300.dp, Dp.Unspecified))
+ val state = WindowState(size = DpSize(300.dp, Dp.Unspecified))
launchApplication {
Window(
@@ -628,7 +628,7 @@
awaitIdle()
assertThat(window.width).isEqualTo(300)
assertThat(window.contentSize.height).isEqualTo(200)
- assertThat(state.size).isEqualTo(WindowSize(window.size.width.dp, window.size.height.dp))
+ assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
exitApplication()
}
@@ -636,7 +636,7 @@
@Test
fun `set window width by its content`() = runApplicationTest(useDelay = isLinux) {
lateinit var window: ComposeWindow
- val state = WindowState(size = WindowSize(Dp.Unspecified, 300.dp))
+ val state = WindowState(size = DpSize(Dp.Unspecified, 300.dp))
launchApplication {
Window(
@@ -656,7 +656,7 @@
awaitIdle()
assertThat(window.height).isEqualTo(300)
assertThat(window.contentSize.width).isEqualTo(400)
- assertThat(state.size).isEqualTo(WindowSize(window.size.width.dp, window.size.height.dp))
+ assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
exitApplication()
}
@@ -664,7 +664,7 @@
@Test
fun `set window size by its content`() = runApplicationTest(useDelay = isLinux) {
lateinit var window: ComposeWindow
- val state = WindowState(size = WindowSize(Dp.Unspecified, Dp.Unspecified))
+ val state = WindowState(size = DpSize(Dp.Unspecified, Dp.Unspecified))
launchApplication {
Window(
@@ -683,7 +683,7 @@
awaitIdle()
assertThat(window.contentSize).isEqualTo(Dimension(400, 200))
- assertThat(state.size).isEqualTo(WindowSize(window.size.width.dp, window.size.height.dp))
+ assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
exitApplication()
}
@@ -693,7 +693,7 @@
useDelay = isLinux
) {
lateinit var window: ComposeWindow
- val state = WindowState(size = WindowSize(100.dp, 100.dp))
+ val state = WindowState(size = DpSize(100.dp, 100.dp))
launchApplication {
Window(
@@ -712,10 +712,10 @@
awaitIdle()
- state.size = WindowSize(Dp.Unspecified, Dp.Unspecified)
+ state.size = DpSize(Dp.Unspecified, Dp.Unspecified)
awaitIdle()
assertThat(window.contentSize).isEqualTo(Dimension(400, 200))
- assertThat(state.size).isEqualTo(WindowSize(window.size.width.dp, window.size.height.dp))
+ assertThat(state.size).isEqualTo(DpSize(window.size.width.dp, window.size.height.dp))
exitApplication()
}
@@ -769,8 +769,9 @@
exitApplication()
}
- private val Window.contentSize get() = Dimension(
- size.width - insets.left - insets.right,
- size.height - insets.top - insets.bottom,
- )
+ private val Window.contentSize
+ get() = Dimension(
+ size.width - insets.left - insets.right,
+ size.height - insets.top - insets.bottom,
+ )
}
\ No newline at end of file
diff --git a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt
index 53a7f9e..5600ef9 100644
--- a/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt
+++ b/compose/ui/ui/src/desktopTest/kotlin/androidx/compose/ui/window/window/WindowTest.kt
@@ -23,7 +23,6 @@
import androidx.compose.material.Slider
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.DisposableEffect
-import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.Recomposer
import androidx.compose.runtime.compositionLocalOf
import androidx.compose.runtime.getValue
@@ -34,18 +33,10 @@
import androidx.compose.ui.LeakDetector
import androidx.compose.ui.Modifier
import androidx.compose.ui.awt.ComposeWindow
-import androidx.compose.ui.focus.FocusRequester
-import androidx.compose.ui.focus.focusRequester
-import androidx.compose.ui.focus.focusTarget
import androidx.compose.ui.graphics.Color
-import androidx.compose.ui.input.key.Key
-import androidx.compose.ui.input.key.key
-import androidx.compose.ui.input.key.onKeyEvent
-import androidx.compose.ui.input.key.onPreviewKeyEvent
-import androidx.compose.ui.sendKey
+import androidx.compose.ui.unit.DpSize
import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Window
-import androidx.compose.ui.window.WindowSize
import androidx.compose.ui.window.launchApplication
import androidx.compose.ui.window.rememberWindowState
import androidx.compose.ui.window.runApplicationTest
@@ -54,9 +45,10 @@
import kotlinx.coroutines.delay
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.swing.Swing
+import org.junit.Assume.assumeFalse
import org.junit.Test
import java.awt.Dimension
-import java.awt.event.KeyEvent
+import java.awt.GraphicsEnvironment
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
@@ -268,7 +260,7 @@
Window(
onCloseRequest = {},
state = rememberWindowState(
- size = WindowSize(600.dp, 600.dp),
+ size = DpSize(600.dp, 600.dp),
)
) {
window1 = this.window
@@ -278,7 +270,7 @@
Window(
onCloseRequest = {},
state = rememberWindowState(
- size = WindowSize(300.dp, 300.dp),
+ size = DpSize(300.dp, 300.dp),
)
) {
window2 = this.window
@@ -324,7 +316,7 @@
Window(
onCloseRequest = {},
state = rememberWindowState(
- size = WindowSize(600.dp, 600.dp),
+ size = DpSize(600.dp, 600.dp),
)
) {
actualValue1 = localTestValue.current
@@ -333,7 +325,7 @@
Window(
onCloseRequest = {},
state = rememberWindowState(
- size = WindowSize(300.dp, 300.dp),
+ size = DpSize(300.dp, 300.dp),
)
) {
actualValue2 = localTestValue.current
@@ -386,151 +378,10 @@
assertThat(disposeCount).isEqualTo(1)
}
- @Test
- fun `catch key handlers`() = runApplicationTest {
- var window: ComposeWindow? = null
- val onKeyEventKeys = mutableSetOf<Key>()
- val onPreviewKeyEventKeys = mutableSetOf<Key>()
-
- fun clear() {
- onKeyEventKeys.clear()
- onPreviewKeyEventKeys.clear()
- }
-
- launchApplication {
- Window(
- onCloseRequest = ::exitApplication,
- onPreviewKeyEvent = {
- onPreviewKeyEventKeys.add(it.key)
- it.key == Key.Q
- },
- onKeyEvent = {
- onKeyEventKeys.add(it.key)
- it.key == Key.W
- }
- ) {
- window = this.window
- }
- }
-
- awaitIdle()
-
- window?.sendKey(KeyEvent.VK_Q)
- awaitIdle()
- assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.Q))
- assertThat(onKeyEventKeys).isEqualTo(emptySet<Key>())
-
- clear()
- window?.sendKey(KeyEvent.VK_W)
- awaitIdle()
- assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.W))
- assertThat(onKeyEventKeys).isEqualTo(setOf(Key.W))
-
- clear()
- window?.sendKey(KeyEvent.VK_E)
- awaitIdle()
- assertThat(onPreviewKeyEventKeys).isEqualTo(setOf(Key.E))
- assertThat(onKeyEventKeys).isEqualTo(setOf(Key.E))
-
- exitApplication()
- }
-
- @Test
- fun `catch key handlers with focused node`() = runApplicationTest {
- var window: ComposeWindow? = null
- val onWindowKeyEventKeys = mutableSetOf<Key>()
- val onWindowPreviewKeyEventKeys = mutableSetOf<Key>()
- val onNodeKeyEventKeys = mutableSetOf<Key>()
- val onNodePreviewKeyEventKeys = mutableSetOf<Key>()
-
- fun clear() {
- onWindowKeyEventKeys.clear()
- onWindowPreviewKeyEventKeys.clear()
- onNodeKeyEventKeys.clear()
- onNodePreviewKeyEventKeys.clear()
- }
-
- launchApplication {
- Window(
- onCloseRequest = ::exitApplication,
- onPreviewKeyEvent = {
- onWindowPreviewKeyEventKeys.add(it.key)
- it.key == Key.Q
- },
- onKeyEvent = {
- onWindowKeyEventKeys.add(it.key)
- it.key == Key.W
- },
- ) {
- window = this.window
-
- val focusRequester = remember(::FocusRequester)
- LaunchedEffect(Unit) {
- focusRequester.requestFocus()
- }
-
- Box(
- Modifier
- .focusRequester(focusRequester)
- .focusTarget()
- .onPreviewKeyEvent {
- onNodePreviewKeyEventKeys.add(it.key)
- it.key == Key.E
- }
- .onKeyEvent {
- onNodeKeyEventKeys.add(it.key)
- it.key == Key.R
- }
- )
- }
- }
-
- awaitIdle()
-
- window?.sendKey(KeyEvent.VK_Q)
- awaitIdle()
- assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.Q))
- assertThat(onNodePreviewKeyEventKeys).isEqualTo(emptySet<Key>())
- assertThat(onNodeKeyEventKeys).isEqualTo(emptySet<Key>())
- assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
-
- clear()
- window?.sendKey(KeyEvent.VK_W)
- awaitIdle()
- assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.W))
- assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.W))
- assertThat(onNodeKeyEventKeys).isEqualTo(setOf(Key.W))
- assertThat(onWindowKeyEventKeys).isEqualTo(setOf(Key.W))
-
- clear()
- window?.sendKey(KeyEvent.VK_E)
- awaitIdle()
- assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.E))
- assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.E))
- assertThat(onNodeKeyEventKeys).isEqualTo(emptySet<Key>())
- assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
-
- clear()
- window?.sendKey(KeyEvent.VK_R)
- awaitIdle()
- assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.R))
- assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.R))
- assertThat(onNodeKeyEventKeys).isEqualTo(setOf(Key.R))
- assertThat(onWindowKeyEventKeys).isEqualTo(emptySet<Key>())
-
- clear()
- window?.sendKey(KeyEvent.VK_T)
- awaitIdle()
- assertThat(onWindowPreviewKeyEventKeys).isEqualTo(setOf(Key.T))
- assertThat(onNodePreviewKeyEventKeys).isEqualTo(setOf(Key.T))
- assertThat(onNodeKeyEventKeys).isEqualTo(setOf(Key.T))
- assertThat(onWindowKeyEventKeys).isEqualTo(setOf(Key.T))
-
- exitApplication()
- }
-
@Test(timeout = 30000)
fun `window dispose should not cause a memory leak`() {
+ assumeFalse(GraphicsEnvironment.getLocalGraphicsEnvironment().isHeadlessInstance)
+
val leakDetector = LeakDetector()
val oldRecomposers = Recomposer.runningRecomposers.value
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt
index d856367..5df94e5 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/input/key/KeyInputModifierTest.kt
@@ -16,6 +16,7 @@
package androidx.compose.ui.input.key
+import androidx.compose.testutils.first
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.InspectableValue
import androidx.compose.ui.platform.ValueElement
@@ -57,10 +58,4 @@
ValueElement("onPreviewKeyEvent", onPreviewKeyEvent)
)
}
-
- private fun Modifier.toList(): List<Modifier.Element> =
- foldIn(mutableListOf()) { acc, e -> acc.apply { acc.add(e) } }
-
- private fun Modifier.first(): Modifier.Element =
- toList().first()
}
diff --git a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
index 6bec928..d3260a2 100644
--- a/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
+++ b/compose/ui/ui/src/test/kotlin/androidx/compose/ui/node/LayoutNodeTest.kt
@@ -33,6 +33,7 @@
import androidx.compose.ui.graphics.drawscope.ContentDrawScope
import androidx.compose.ui.graphics.graphicsLayer
import androidx.compose.ui.hapticfeedback.HapticFeedback
+import androidx.compose.ui.input.InputModeManager
import androidx.compose.ui.input.key.KeyEvent
import androidx.compose.ui.input.pointer.PointerEvent
import androidx.compose.ui.input.pointer.PointerEventPass
@@ -2255,6 +2256,8 @@
get() = TODO("Not yet implemented")
override val hapticFeedBack: HapticFeedback
get() = TODO("Not yet implemented")
+ override val inputModeManager: InputModeManager
+ get() = TODO("Not yet implemented")
override val clipboardManager: ClipboardManager
get() = TODO("Not yet implemented")
override val accessibilityManager: AccessibilityManager
diff --git a/core/core-ktx/api/1.7.0-beta03.txt b/core/core-ktx/api/1.7.0-beta03.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/1.7.0-beta03.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+ public final class AnimatorKt {
+ method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+ method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentValuesKt {
+ method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ContextKt {
+ method public static inline <reified T> T! getSystemService(android.content.Context);
+ method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ }
+
+ public final class SharedPreferencesKt {
+ method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class TypedArrayKt {
+ method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorKt {
+ method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+ method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+ method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+ method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+ method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+ method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+ method public static inline String? getStringOrNull(android.database.Cursor, int index);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteDatabaseKt {
+ method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapKt {
+ method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+ method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+ method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+ method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+ method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+ method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+ }
+
+ public final class CanvasKt {
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class ColorKt {
+ method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+ method public static inline operator int component1(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+ method public static inline operator int component2(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+ method public static inline operator int component3(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+ method public static inline operator int component4(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+ method public static inline int getAlpha(@ColorInt int);
+ method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+ method public static inline int getBlue(@ColorInt int);
+ method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+ method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+ method public static inline int getGreen(@ColorInt int);
+ method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+ method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+ method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+ method public static inline int getRed(@ColorInt int);
+ method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+ method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+ method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+ method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+ method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+ method @ColorInt public static inline int toColorInt(String);
+ method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+ }
+
+ public final class ImageDecoderKt {
+ method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ }
+
+ public final class MatrixKt {
+ method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+ method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+ method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+ method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+ method public static inline float[] values(android.graphics.Matrix);
+ }
+
+ public final class PaintKt {
+ method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+ }
+
+ public final class PathKt {
+ method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+ method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+ }
+
+ public final class PictureKt {
+ method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class PointKt {
+ method public static inline operator int component1(android.graphics.Point);
+ method public static inline operator float component1(android.graphics.PointF);
+ method public static inline operator int component2(android.graphics.Point);
+ method public static inline operator float component2(android.graphics.PointF);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+ method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+ method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+ method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+ method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+ }
+
+ public final class PorterDuffKt {
+ method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+ method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+ }
+
+ public final class RectKt {
+ method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator int component1(android.graphics.Rect);
+ method public static inline operator float component1(android.graphics.RectF);
+ method public static inline operator int component2(android.graphics.Rect);
+ method public static inline operator float component2(android.graphics.RectF);
+ method public static inline operator int component3(android.graphics.Rect);
+ method public static inline operator float component3(android.graphics.RectF);
+ method public static inline operator int component4(android.graphics.Rect);
+ method public static inline operator float component4(android.graphics.RectF);
+ method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+ method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+ method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+ method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+ method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+ method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+ method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+ }
+
+ public final class RegionKt {
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+ method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+ method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region not(android.graphics.Region);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+ }
+
+ public final class ShaderKt {
+ method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class BitmapDrawableKt {
+ method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+ }
+
+ public final class ColorDrawableKt {
+ method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+ method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+ }
+
+ public final class DrawableKt {
+ method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+ method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ }
+
+ public final class IconKt {
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+ }
+
+}
+
+package androidx.core.location {
+
+ public final class LocationKt {
+ method public static inline operator double component1(android.location.Location);
+ method public static inline operator double component2(android.location.Location);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class UriKt {
+ method public static java.io.File toFile(android.net.Uri);
+ method public static inline android.net.Uri toUri(String);
+ method public static inline android.net.Uri toUri(java.io.File);
+ }
+
+}
+
+package androidx.core.os {
+
+ public final class BundleKt {
+ method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class HandlerKt {
+ method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ }
+
+ public final class PersistableBundleKt {
+ method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class TraceKt {
+ method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class CharSequenceKt {
+ method public static inline boolean isDigitsOnly(CharSequence);
+ method public static inline int trimmedLength(CharSequence);
+ }
+
+ public final class HtmlKt {
+ method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+ method public static inline String toHtml(android.text.Spanned, optional int option);
+ }
+
+ public final class LocaleKt {
+ method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+ }
+
+ public final class SpannableStringBuilderKt {
+ method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ }
+
+ public final class SpannableStringKt {
+ method public static inline void clearSpans(android.text.Spannable);
+ method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+ method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+ method public static inline android.text.Spannable toSpannable(CharSequence);
+ }
+
+ public final class SpannedStringKt {
+ method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+ method public static inline android.text.Spanned toSpanned(CharSequence);
+ }
+
+ public final class StringKt {
+ method public static inline String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.transition {
+
+ public final class TransitionKt {
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.util {
+
+ public final class AtomicFileKt {
+ method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+ method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+ method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+ method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+ method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+ }
+
+ public final class HalfKt {
+ method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+ }
+
+ public final class LongSparseArrayKt {
+ method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+ method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+ method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+ method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+ method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+ }
+
+ public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+ method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+ method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+ }
+
+ public final class RangeKt {
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+ }
+
+ public final class SizeKt {
+ method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+ method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+ }
+
+ public final class SparseArrayKt {
+ method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+ method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+ method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(android.util.SparseArray<T>);
+ method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+ method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+ method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+ }
+
+ public final class SparseBooleanArrayKt {
+ method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+ method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+ method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+ method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+ method public static inline int getSize(android.util.SparseBooleanArray);
+ method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+ method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+ method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+ method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+ method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+ }
+
+ public final class SparseIntArrayKt {
+ method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+ method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+ method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+ method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+ method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+ method public static inline int getSize(android.util.SparseIntArray);
+ method public static inline boolean isEmpty(android.util.SparseIntArray);
+ method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+ method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static boolean remove(android.util.SparseIntArray, int key, int value);
+ method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+ method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+ }
+
+ public final class SparseLongArrayKt {
+ method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+ method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+ method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+ method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+ method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+ method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+ }
+
+}
+
+package androidx.core.view {
+
+ public final class MenuKt {
+ method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+ method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+ method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+ method public static inline int getSize(android.view.Menu);
+ method public static inline boolean isEmpty(android.view.Menu);
+ method public static inline boolean isNotEmpty(android.view.Menu);
+ method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+ method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+ }
+
+ public final class ViewGroupKt {
+ method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+ method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+ method public static operator android.view.View get(android.view.ViewGroup, int index);
+ method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+ method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+ method public static inline int getSize(android.view.ViewGroup);
+ method public static inline boolean isEmpty(android.view.ViewGroup);
+ method public static inline boolean isNotEmpty(android.view.ViewGroup);
+ method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+ method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+ method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+ }
+
+ public final class ViewKt {
+ method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+ method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+ method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+ method public static inline int getMarginBottom(android.view.View);
+ method public static inline int getMarginEnd(android.view.View);
+ method public static inline int getMarginLeft(android.view.View);
+ method public static inline int getMarginRight(android.view.View);
+ method public static inline int getMarginStart(android.view.View);
+ method public static inline int getMarginTop(android.view.View);
+ method public static inline boolean isGone(android.view.View);
+ method public static inline boolean isInvisible(android.view.View);
+ method public static inline boolean isVisible(android.view.View);
+ method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline void setGone(android.view.View, boolean value);
+ method public static inline void setInvisible(android.view.View, boolean value);
+ method public static inline void setPadding(android.view.View, @Px int size);
+ method public static inline void setVisible(android.view.View, boolean value);
+ method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+ method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+ method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public final class TextViewKt {
+ method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+ method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ }
+
+}
+
diff --git a/core/core-ktx/api/public_plus_experimental_1.7.0-beta03.txt b/core/core-ktx/api/public_plus_experimental_1.7.0-beta03.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/public_plus_experimental_1.7.0-beta03.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+ public final class AnimatorKt {
+ method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+ method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentValuesKt {
+ method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ContextKt {
+ method public static inline <reified T> T! getSystemService(android.content.Context);
+ method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ }
+
+ public final class SharedPreferencesKt {
+ method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class TypedArrayKt {
+ method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorKt {
+ method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+ method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+ method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+ method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+ method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+ method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+ method public static inline String? getStringOrNull(android.database.Cursor, int index);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteDatabaseKt {
+ method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapKt {
+ method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+ method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+ method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+ method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+ method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+ method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+ }
+
+ public final class CanvasKt {
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class ColorKt {
+ method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+ method public static inline operator int component1(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+ method public static inline operator int component2(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+ method public static inline operator int component3(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+ method public static inline operator int component4(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+ method public static inline int getAlpha(@ColorInt int);
+ method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+ method public static inline int getBlue(@ColorInt int);
+ method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+ method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+ method public static inline int getGreen(@ColorInt int);
+ method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+ method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+ method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+ method public static inline int getRed(@ColorInt int);
+ method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+ method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+ method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+ method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+ method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+ method @ColorInt public static inline int toColorInt(String);
+ method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+ }
+
+ public final class ImageDecoderKt {
+ method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ }
+
+ public final class MatrixKt {
+ method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+ method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+ method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+ method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+ method public static inline float[] values(android.graphics.Matrix);
+ }
+
+ public final class PaintKt {
+ method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+ }
+
+ public final class PathKt {
+ method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+ method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+ }
+
+ public final class PictureKt {
+ method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class PointKt {
+ method public static inline operator int component1(android.graphics.Point);
+ method public static inline operator float component1(android.graphics.PointF);
+ method public static inline operator int component2(android.graphics.Point);
+ method public static inline operator float component2(android.graphics.PointF);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+ method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+ method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+ method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+ method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+ }
+
+ public final class PorterDuffKt {
+ method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+ method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+ }
+
+ public final class RectKt {
+ method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator int component1(android.graphics.Rect);
+ method public static inline operator float component1(android.graphics.RectF);
+ method public static inline operator int component2(android.graphics.Rect);
+ method public static inline operator float component2(android.graphics.RectF);
+ method public static inline operator int component3(android.graphics.Rect);
+ method public static inline operator float component3(android.graphics.RectF);
+ method public static inline operator int component4(android.graphics.Rect);
+ method public static inline operator float component4(android.graphics.RectF);
+ method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+ method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+ method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+ method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+ method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+ method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+ method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+ }
+
+ public final class RegionKt {
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+ method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+ method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region not(android.graphics.Region);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+ }
+
+ public final class ShaderKt {
+ method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class BitmapDrawableKt {
+ method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+ }
+
+ public final class ColorDrawableKt {
+ method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+ method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+ }
+
+ public final class DrawableKt {
+ method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+ method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ }
+
+ public final class IconKt {
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+ }
+
+}
+
+package androidx.core.location {
+
+ public final class LocationKt {
+ method public static inline operator double component1(android.location.Location);
+ method public static inline operator double component2(android.location.Location);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class UriKt {
+ method public static java.io.File toFile(android.net.Uri);
+ method public static inline android.net.Uri toUri(String);
+ method public static inline android.net.Uri toUri(java.io.File);
+ }
+
+}
+
+package androidx.core.os {
+
+ public final class BundleKt {
+ method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class HandlerKt {
+ method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ }
+
+ public final class PersistableBundleKt {
+ method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class TraceKt {
+ method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class CharSequenceKt {
+ method public static inline boolean isDigitsOnly(CharSequence);
+ method public static inline int trimmedLength(CharSequence);
+ }
+
+ public final class HtmlKt {
+ method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+ method public static inline String toHtml(android.text.Spanned, optional int option);
+ }
+
+ public final class LocaleKt {
+ method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+ }
+
+ public final class SpannableStringBuilderKt {
+ method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ }
+
+ public final class SpannableStringKt {
+ method public static inline void clearSpans(android.text.Spannable);
+ method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+ method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+ method public static inline android.text.Spannable toSpannable(CharSequence);
+ }
+
+ public final class SpannedStringKt {
+ method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+ method public static inline android.text.Spanned toSpanned(CharSequence);
+ }
+
+ public final class StringKt {
+ method public static inline String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.transition {
+
+ public final class TransitionKt {
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.util {
+
+ public final class AtomicFileKt {
+ method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+ method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+ method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+ method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+ method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+ }
+
+ public final class HalfKt {
+ method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+ }
+
+ public final class LongSparseArrayKt {
+ method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+ method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+ method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+ method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+ method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+ }
+
+ public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+ method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+ method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+ }
+
+ public final class RangeKt {
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+ }
+
+ public final class SizeKt {
+ method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+ method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+ }
+
+ public final class SparseArrayKt {
+ method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+ method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+ method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(android.util.SparseArray<T>);
+ method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+ method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+ method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+ }
+
+ public final class SparseBooleanArrayKt {
+ method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+ method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+ method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+ method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+ method public static inline int getSize(android.util.SparseBooleanArray);
+ method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+ method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+ method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+ method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+ method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+ }
+
+ public final class SparseIntArrayKt {
+ method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+ method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+ method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+ method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+ method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+ method public static inline int getSize(android.util.SparseIntArray);
+ method public static inline boolean isEmpty(android.util.SparseIntArray);
+ method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+ method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static boolean remove(android.util.SparseIntArray, int key, int value);
+ method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+ method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+ }
+
+ public final class SparseLongArrayKt {
+ method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+ method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+ method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+ method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+ method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+ method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+ }
+
+}
+
+package androidx.core.view {
+
+ public final class MenuKt {
+ method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+ method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+ method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+ method public static inline int getSize(android.view.Menu);
+ method public static inline boolean isEmpty(android.view.Menu);
+ method public static inline boolean isNotEmpty(android.view.Menu);
+ method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+ method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+ }
+
+ public final class ViewGroupKt {
+ method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+ method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+ method public static operator android.view.View get(android.view.ViewGroup, int index);
+ method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+ method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+ method public static inline int getSize(android.view.ViewGroup);
+ method public static inline boolean isEmpty(android.view.ViewGroup);
+ method public static inline boolean isNotEmpty(android.view.ViewGroup);
+ method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+ method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+ method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+ }
+
+ public final class ViewKt {
+ method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+ method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+ method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+ method public static inline int getMarginBottom(android.view.View);
+ method public static inline int getMarginEnd(android.view.View);
+ method public static inline int getMarginLeft(android.view.View);
+ method public static inline int getMarginRight(android.view.View);
+ method public static inline int getMarginStart(android.view.View);
+ method public static inline int getMarginTop(android.view.View);
+ method public static inline boolean isGone(android.view.View);
+ method public static inline boolean isInvisible(android.view.View);
+ method public static inline boolean isVisible(android.view.View);
+ method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline void setGone(android.view.View, boolean value);
+ method public static inline void setInvisible(android.view.View, boolean value);
+ method public static inline void setPadding(android.view.View, @Px int size);
+ method public static inline void setVisible(android.view.View, boolean value);
+ method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+ method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+ method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public final class TextViewKt {
+ method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+ method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/core/core-ktx/api/res-1.7.0-beta03.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to core/core-ktx/api/res-1.7.0-beta03.txt
diff --git a/core/core-ktx/api/restricted_1.7.0-beta03.txt b/core/core-ktx/api/restricted_1.7.0-beta03.txt
new file mode 100644
index 0000000..f2dc757
--- /dev/null
+++ b/core/core-ktx/api/restricted_1.7.0-beta03.txt
@@ -0,0 +1,606 @@
+// Signature format: 4.0
+package androidx.core.animation {
+
+ public final class AnimatorKt {
+ method public static inline android.animation.Animator.AnimatorListener addListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onRepeat);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener addPauseListener(android.animation.Animator, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> onPause);
+ method public static inline android.animation.Animator.AnimatorListener doOnCancel(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnEnd(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnPause(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnRepeat(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.animation.Animator.AnimatorPauseListener doOnResume(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ method public static inline android.animation.Animator.AnimatorListener doOnStart(android.animation.Animator, kotlin.jvm.functions.Function1<? super android.animation.Animator,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentValuesKt {
+ method public static android.content.ContentValues contentValuesOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class ContextKt {
+ method public static inline <reified T> T! getSystemService(android.content.Context);
+ method public static inline void withStyledAttributes(android.content.Context, optional android.util.AttributeSet? set, int[] attrs, optional @AttrRes int defStyleAttr, optional @StyleRes int defStyleRes, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ method public static inline void withStyledAttributes(android.content.Context, @StyleRes int resourceId, int[] attrs, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,kotlin.Unit> block);
+ }
+
+ public final class SharedPreferencesKt {
+ method public static inline void edit(android.content.SharedPreferences, optional boolean commit, kotlin.jvm.functions.Function1<? super android.content.SharedPreferences.Editor,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class TypedArrayKt {
+ method public static boolean getBooleanOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @ColorInt public static int getColorOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.content.res.ColorStateList getColorStateListOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getDimensionOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelOffsetOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @Dimension public static int getDimensionPixelSizeOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static android.graphics.drawable.Drawable getDrawableOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static float getFloatOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @RequiresApi(26) public static android.graphics.Typeface getFontOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static int getIntegerOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method @AnyRes public static int getResourceIdOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static String getStringOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence![] getTextArrayOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static CharSequence getTextOrThrow(android.content.res.TypedArray, @StyleableRes int index);
+ method public static inline <R> R! use(android.content.res.TypedArray, kotlin.jvm.functions.Function1<? super android.content.res.TypedArray,? extends R> block);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorKt {
+ method public static inline byte[]? getBlobOrNull(android.database.Cursor, int index);
+ method public static inline Double? getDoubleOrNull(android.database.Cursor, int index);
+ method public static inline Float? getFloatOrNull(android.database.Cursor, int index);
+ method public static inline Integer? getIntOrNull(android.database.Cursor, int index);
+ method public static inline Long? getLongOrNull(android.database.Cursor, int index);
+ method public static inline Short? getShortOrNull(android.database.Cursor, int index);
+ method public static inline String? getStringOrNull(android.database.Cursor, int index);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteDatabaseKt {
+ method public static inline <T> T! transaction(android.database.sqlite.SQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super android.database.sqlite.SQLiteDatabase,? extends T> body);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapKt {
+ method public static inline android.graphics.Bitmap applyCanvas(android.graphics.Bitmap, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.Bitmap, android.graphics.PointF p);
+ method public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config);
+ method @RequiresApi(26) public static inline android.graphics.Bitmap createBitmap(int width, int height, optional android.graphics.Bitmap.Config config, optional boolean hasAlpha, optional android.graphics.ColorSpace colorSpace);
+ method public static inline operator int get(android.graphics.Bitmap, int x, int y);
+ method public static inline android.graphics.Bitmap scale(android.graphics.Bitmap, int width, int height, optional boolean filter);
+ method public static inline operator void set(android.graphics.Bitmap, int x, int y, @ColorInt int color);
+ }
+
+ public final class CanvasKt {
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Rect clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.RectF clipRect, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, int left, int top, int right, int bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, float left, float top, float right, float bottom, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withClip(android.graphics.Canvas, android.graphics.Path clipPath, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withMatrix(android.graphics.Canvas, optional android.graphics.Matrix matrix, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withRotation(android.graphics.Canvas, optional float degrees, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSave(android.graphics.Canvas, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withScale(android.graphics.Canvas, optional float x, optional float y, optional float pivotX, optional float pivotY, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withSkew(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ method public static inline void withTranslation(android.graphics.Canvas, optional float x, optional float y, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class ColorKt {
+ method @RequiresApi(26) public static inline operator float component1(android.graphics.Color);
+ method public static inline operator int component1(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component1(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component2(android.graphics.Color);
+ method public static inline operator int component2(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component2(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component3(android.graphics.Color);
+ method public static inline operator int component3(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component3(@ColorLong long);
+ method @RequiresApi(26) public static inline operator float component4(android.graphics.Color);
+ method public static inline operator int component4(@ColorInt int);
+ method @RequiresApi(26) public static inline operator float component4(@ColorLong long);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorInt int, android.graphics.ColorSpace colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace.Named colorSpace);
+ method @ColorLong @RequiresApi(26) public static inline infix long convertTo(@ColorLong long, android.graphics.ColorSpace colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace.Named colorSpace);
+ method @RequiresApi(26) public static inline infix android.graphics.Color convertTo(android.graphics.Color, android.graphics.ColorSpace colorSpace);
+ method public static inline int getAlpha(@ColorInt int);
+ method @RequiresApi(26) public static inline float getAlpha(@ColorLong long);
+ method public static inline int getBlue(@ColorInt int);
+ method @RequiresApi(26) public static inline float getBlue(@ColorLong long);
+ method @RequiresApi(26) public static inline android.graphics.ColorSpace getColorSpace(@ColorLong long);
+ method public static inline int getGreen(@ColorInt int);
+ method @RequiresApi(26) public static inline float getGreen(@ColorLong long);
+ method @RequiresApi(26) public static inline float getLuminance(@ColorInt int);
+ method @RequiresApi(26) public static inline float getLuminance(@ColorLong long);
+ method public static inline int getRed(@ColorInt int);
+ method @RequiresApi(26) public static inline float getRed(@ColorLong long);
+ method @RequiresApi(26) public static inline boolean isSrgb(@ColorLong long);
+ method @RequiresApi(26) public static inline boolean isWideGamut(@ColorLong long);
+ method @RequiresApi(26) public static operator android.graphics.Color plus(android.graphics.Color, android.graphics.Color c);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorInt int);
+ method @RequiresApi(26) public static inline android.graphics.Color toColor(@ColorLong long);
+ method @ColorInt @RequiresApi(26) public static inline int toColorInt(@ColorLong long);
+ method @ColorInt public static inline int toColorInt(String);
+ method @ColorLong @RequiresApi(26) public static inline long toColorLong(@ColorInt int);
+ }
+
+ public final class ImageDecoderKt {
+ method @RequiresApi(28) public static inline android.graphics.Bitmap decodeBitmap(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ method @RequiresApi(28) public static inline android.graphics.drawable.Drawable decodeDrawable(android.graphics.ImageDecoder.Source, kotlin.jvm.functions.Function3<? super android.graphics.ImageDecoder,? super android.graphics.ImageDecoder.ImageInfo,? super android.graphics.ImageDecoder.Source,kotlin.Unit> action);
+ }
+
+ public final class MatrixKt {
+ method public static android.graphics.Matrix rotationMatrix(float degrees, optional float px, optional float py);
+ method public static android.graphics.Matrix scaleMatrix(optional float sx, optional float sy);
+ method public static inline operator android.graphics.Matrix times(android.graphics.Matrix, android.graphics.Matrix m);
+ method public static android.graphics.Matrix translationMatrix(optional float tx, optional float ty);
+ method public static inline float[] values(android.graphics.Matrix);
+ }
+
+ public final class PaintKt {
+ method public static inline boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat? blendModeCompat);
+ }
+
+ public final class PathKt {
+ method @RequiresApi(19) public static inline infix android.graphics.Path and(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(26) public static Iterable<androidx.core.graphics.PathSegment> flatten(android.graphics.Path, optional float error);
+ method @RequiresApi(19) public static inline operator android.graphics.Path minus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path or(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline operator android.graphics.Path plus(android.graphics.Path, android.graphics.Path p);
+ method @RequiresApi(19) public static inline infix android.graphics.Path xor(android.graphics.Path, android.graphics.Path p);
+ }
+
+ public final class PictureKt {
+ method public static inline android.graphics.Picture record(android.graphics.Picture, int width, int height, kotlin.jvm.functions.Function1<? super android.graphics.Canvas,kotlin.Unit> block);
+ }
+
+ public final class PointKt {
+ method public static inline operator int component1(android.graphics.Point);
+ method public static inline operator float component1(android.graphics.PointF);
+ method public static inline operator int component2(android.graphics.Point);
+ method public static inline operator float component2(android.graphics.PointF);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point minus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF minus(android.graphics.PointF, float xy);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, android.graphics.Point p);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Point plus(android.graphics.Point, int xy);
+ method public static inline operator android.graphics.PointF plus(android.graphics.PointF, float xy);
+ method public static inline android.graphics.Point toPoint(android.graphics.PointF);
+ method public static inline android.graphics.PointF toPointF(android.graphics.Point);
+ method public static inline operator android.graphics.Point unaryMinus(android.graphics.Point);
+ method public static inline operator android.graphics.PointF unaryMinus(android.graphics.PointF);
+ }
+
+ public final class PorterDuffKt {
+ method public static inline android.graphics.PorterDuffColorFilter toColorFilter(android.graphics.PorterDuff.Mode, int color);
+ method public static inline android.graphics.PorterDuffXfermode toXfermode(android.graphics.PorterDuff.Mode);
+ }
+
+ public final class RectKt {
+ method public static inline infix android.graphics.Rect and(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF and(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator int component1(android.graphics.Rect);
+ method public static inline operator float component1(android.graphics.RectF);
+ method public static inline operator int component2(android.graphics.Rect);
+ method public static inline operator float component2(android.graphics.RectF);
+ method public static inline operator int component3(android.graphics.Rect);
+ method public static inline operator float component3(android.graphics.RectF);
+ method public static inline operator int component4(android.graphics.Rect);
+ method public static inline operator float component4(android.graphics.RectF);
+ method public static inline operator boolean contains(android.graphics.Rect, android.graphics.Point p);
+ method public static inline operator boolean contains(android.graphics.RectF, android.graphics.PointF p);
+ method public static inline operator android.graphics.Region minus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect minus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF minus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline infix android.graphics.Rect or(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.RectF or(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.RectF r);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, int xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, float xy);
+ method public static inline operator android.graphics.Rect plus(android.graphics.Rect, android.graphics.Point xy);
+ method public static inline operator android.graphics.RectF plus(android.graphics.RectF, android.graphics.PointF xy);
+ method public static inline operator android.graphics.Rect times(android.graphics.Rect, int factor);
+ method public static inline operator android.graphics.RectF times(android.graphics.RectF, int factor);
+ method public static inline operator android.graphics.RectF times(android.graphics.RectF, float factor);
+ method public static inline android.graphics.Rect toRect(android.graphics.RectF);
+ method public static inline android.graphics.RectF toRectF(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.Rect);
+ method public static inline android.graphics.Region toRegion(android.graphics.RectF);
+ method public static inline android.graphics.RectF transform(android.graphics.RectF, android.graphics.Matrix m);
+ method public static inline infix android.graphics.Region xor(android.graphics.Rect, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.RectF, android.graphics.RectF r);
+ }
+
+ public final class RegionKt {
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region and(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator boolean contains(android.graphics.Region, android.graphics.Point p);
+ method public static inline void forEach(android.graphics.Region, kotlin.jvm.functions.Function1<? super android.graphics.Rect,kotlin.Unit> action);
+ method public static operator java.util.Iterator<android.graphics.Rect> iterator(android.graphics.Region);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region minus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region not(android.graphics.Region);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region or(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Rect r);
+ method public static inline operator android.graphics.Region plus(android.graphics.Region, android.graphics.Region r);
+ method public static inline operator android.graphics.Region unaryMinus(android.graphics.Region);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Rect r);
+ method public static inline infix android.graphics.Region xor(android.graphics.Region, android.graphics.Region r);
+ }
+
+ public final class ShaderKt {
+ method public static inline void transform(android.graphics.Shader, kotlin.jvm.functions.Function1<? super android.graphics.Matrix,kotlin.Unit> block);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class BitmapDrawableKt {
+ method public static inline android.graphics.drawable.BitmapDrawable toDrawable(android.graphics.Bitmap, android.content.res.Resources resources);
+ }
+
+ public final class ColorDrawableKt {
+ method public static inline android.graphics.drawable.ColorDrawable toDrawable(@ColorInt int);
+ method @RequiresApi(26) public static inline android.graphics.drawable.ColorDrawable toDrawable(android.graphics.Color);
+ }
+
+ public final class DrawableKt {
+ method public static android.graphics.Bitmap toBitmap(android.graphics.drawable.Drawable, optional @Px int width, optional @Px int height, optional android.graphics.Bitmap.Config? config);
+ method public static void updateBounds(android.graphics.drawable.Drawable, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ }
+
+ public final class IconKt {
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toAdaptiveIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.graphics.Bitmap);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(android.net.Uri);
+ method @RequiresApi(26) public static inline android.graphics.drawable.Icon toIcon(byte[]);
+ }
+
+}
+
+package androidx.core.location {
+
+ public final class LocationKt {
+ method public static inline operator double component1(android.location.Location);
+ method public static inline operator double component2(android.location.Location);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class UriKt {
+ method public static java.io.File toFile(android.net.Uri);
+ method public static inline android.net.Uri toUri(String);
+ method public static inline android.net.Uri toUri(java.io.File);
+ }
+
+}
+
+package androidx.core.os {
+
+ public final class BundleKt {
+ method public static android.os.Bundle bundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class HandlerKt {
+ method public static inline Runnable postAtTime(android.os.Handler, long uptimeMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline Runnable postDelayed(android.os.Handler, long delayInMillis, optional Object? token, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ }
+
+ public final class PersistableBundleKt {
+ method @RequiresApi(21) public static android.os.PersistableBundle persistableBundleOf(kotlin.Pair<java.lang.String,?>... pairs);
+ }
+
+ public final class TraceKt {
+ method @Deprecated public static inline <T> T! trace(String sectionName, kotlin.jvm.functions.Function0<? extends T> block);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class CharSequenceKt {
+ method public static inline boolean isDigitsOnly(CharSequence);
+ method public static inline int trimmedLength(CharSequence);
+ }
+
+ public final class HtmlKt {
+ method public static inline android.text.Spanned parseAsHtml(String, optional int flags, optional android.text.Html.ImageGetter? imageGetter, optional android.text.Html.TagHandler? tagHandler);
+ method public static inline String toHtml(android.text.Spanned, optional int option);
+ }
+
+ public final class LocaleKt {
+ method @RequiresApi(17) public static inline int getLayoutDirection(java.util.Locale);
+ }
+
+ public final class SpannableStringBuilderKt {
+ method public static inline android.text.SpannableStringBuilder backgroundColor(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder bold(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannedString buildSpannedString(kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder color(android.text.SpannableStringBuilder, @ColorInt int color, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object![] spans, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder inSpans(android.text.SpannableStringBuilder, Object span, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder italic(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder scale(android.text.SpannableStringBuilder, float proportion, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder strikeThrough(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder subscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder superscript(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ method public static inline android.text.SpannableStringBuilder underline(android.text.SpannableStringBuilder, kotlin.jvm.functions.Function1<? super android.text.SpannableStringBuilder,kotlin.Unit> builderAction);
+ }
+
+ public final class SpannableStringKt {
+ method public static inline void clearSpans(android.text.Spannable);
+ method public static inline operator void set(android.text.Spannable, int start, int end, Object span);
+ method public static inline operator void set(android.text.Spannable, kotlin.ranges.IntRange range, Object span);
+ method public static inline android.text.Spannable toSpannable(CharSequence);
+ }
+
+ public final class SpannedStringKt {
+ method public static inline <reified T> T![]! getSpans(android.text.Spanned, optional int start, optional int end);
+ method public static inline android.text.Spanned toSpanned(CharSequence);
+ }
+
+ public final class StringKt {
+ method public static inline String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.transition {
+
+ public final class TransitionKt {
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener addListener(android.transition.Transition, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onEnd, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onStart, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onCancel, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onResume, optional kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> onPause);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnCancel(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnEnd(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnPause(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnResume(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ method @RequiresApi(19) public static inline android.transition.Transition.TransitionListener doOnStart(android.transition.Transition, kotlin.jvm.functions.Function1<? super android.transition.Transition,kotlin.Unit> action);
+ }
+
+}
+
+package androidx.core.util {
+
+ public final class AtomicFileKt {
+ method @RequiresApi(17) public static inline byte[] readBytes(android.util.AtomicFile);
+ method @RequiresApi(17) public static String readText(android.util.AtomicFile, optional java.nio.charset.Charset charset);
+ method @RequiresApi(17) public static inline void tryWrite(android.util.AtomicFile, kotlin.jvm.functions.Function1<? super java.io.FileOutputStream,kotlin.Unit> block);
+ method @RequiresApi(17) public static void writeBytes(android.util.AtomicFile, byte[] array);
+ method @RequiresApi(17) public static void writeText(android.util.AtomicFile, String text, optional java.nio.charset.Charset charset);
+ }
+
+ public final class HalfKt {
+ method @RequiresApi(26) public static inline android.util.Half toHalf(@HalfFloat short);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(float);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(double);
+ method @RequiresApi(26) public static inline android.util.Half toHalf(String);
+ }
+
+ public final class LongSparseArrayKt {
+ method @RequiresApi(16) public static inline operator <T> boolean contains(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsKey(android.util.LongSparseArray<T>, long key);
+ method @RequiresApi(16) public static inline <T> boolean containsValue(android.util.LongSparseArray<T>, T? value);
+ method @RequiresApi(16) public static inline <T> void forEach(android.util.LongSparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Long,? super T,kotlin.Unit> action);
+ method @RequiresApi(16) public static inline <T> T! getOrDefault(android.util.LongSparseArray<T>, long key, T? defaultValue);
+ method @RequiresApi(16) public static inline <T> T! getOrElse(android.util.LongSparseArray<T>, long key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method @RequiresApi(16) public static inline <T> int getSize(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static inline <T> boolean isNotEmpty(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static <T> kotlin.collections.LongIterator keyIterator(android.util.LongSparseArray<T>);
+ method @RequiresApi(16) public static operator <T> android.util.LongSparseArray<T> plus(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> void putAll(android.util.LongSparseArray<T>, android.util.LongSparseArray<T> other);
+ method @RequiresApi(16) public static <T> boolean remove(android.util.LongSparseArray<T>, long key, T? value);
+ method @RequiresApi(16) public static inline operator <T> void set(android.util.LongSparseArray<T>, long key, T? value);
+ method @RequiresApi(16) public static <T> java.util.Iterator<T> valueIterator(android.util.LongSparseArray<T>);
+ }
+
+ public final class LruCacheKt {
+ method public static inline <K, V> android.util.LruCache<K,V> lruCache(int maxSize, optional kotlin.jvm.functions.Function2<? super K,? super V,java.lang.Integer> sizeOf, optional kotlin.jvm.functions.Function1<? super K,? extends V> create, optional kotlin.jvm.functions.Function4<? super java.lang.Boolean,? super K,? super V,? super V,kotlin.Unit> onEntryRemoved);
+ }
+
+ public final class PairKt {
+ method public static inline operator <F, S> F! component1(androidx.core.util.Pair<F,S>);
+ method public static inline operator <F, S> F! component1(android.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(androidx.core.util.Pair<F,S>);
+ method public static inline operator <F, S> S! component2(android.util.Pair<F,S>);
+ method public static inline <F, S> android.util.Pair<F,S> toAndroidPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> androidx.core.util.Pair<F,S> toAndroidXPair(kotlin.Pair<? extends F,? extends S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(androidx.core.util.Pair<F,S>);
+ method public static inline <F, S> kotlin.Pair<F,S> toKotlinPair(android.util.Pair<F,S>);
+ }
+
+ public final class RangeKt {
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> and(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, T value);
+ method @RequiresApi(21) public static inline operator <T extends java.lang.Comparable<? super T>> android.util.Range<T> plus(android.util.Range<T>, android.util.Range<T> other);
+ method @RequiresApi(21) public static inline infix <T extends java.lang.Comparable<? super T>> android.util.Range<T> rangeTo(T, T that);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> kotlin.ranges.ClosedRange<T> toClosedRange(android.util.Range<T>);
+ method @RequiresApi(21) public static <T extends java.lang.Comparable<? super T>> android.util.Range<T> toRange(kotlin.ranges.ClosedRange<T>);
+ }
+
+ public final class SizeKt {
+ method @RequiresApi(21) public static inline operator int component1(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component1(android.util.SizeF);
+ method @RequiresApi(21) public static inline operator int component2(android.util.Size);
+ method @RequiresApi(21) public static inline operator float component2(android.util.SizeF);
+ }
+
+ public final class SparseArrayKt {
+ method public static inline operator <T> boolean contains(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsKey(android.util.SparseArray<T>, int key);
+ method public static inline <T> boolean containsValue(android.util.SparseArray<T>, T? value);
+ method public static inline <T> void forEach(android.util.SparseArray<T>, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,kotlin.Unit> action);
+ method public static inline <T> T! getOrDefault(android.util.SparseArray<T>, int key, T? defaultValue);
+ method public static inline <T> T! getOrElse(android.util.SparseArray<T>, int key, kotlin.jvm.functions.Function0<? extends T> defaultValue);
+ method public static inline <T> int getSize(android.util.SparseArray<T>);
+ method public static inline <T> boolean isEmpty(android.util.SparseArray<T>);
+ method public static inline <T> boolean isNotEmpty(android.util.SparseArray<T>);
+ method public static <T> kotlin.collections.IntIterator keyIterator(android.util.SparseArray<T>);
+ method public static operator <T> android.util.SparseArray<T> plus(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> void putAll(android.util.SparseArray<T>, android.util.SparseArray<T> other);
+ method public static <T> boolean remove(android.util.SparseArray<T>, int key, T? value);
+ method public static inline operator <T> void set(android.util.SparseArray<T>, int key, T? value);
+ method public static <T> java.util.Iterator<T> valueIterator(android.util.SparseArray<T>);
+ }
+
+ public final class SparseBooleanArrayKt {
+ method public static inline operator boolean contains(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsKey(android.util.SparseBooleanArray, int key);
+ method public static inline boolean containsValue(android.util.SparseBooleanArray, boolean value);
+ method public static inline void forEach(android.util.SparseBooleanArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Boolean,kotlin.Unit> action);
+ method public static inline boolean getOrDefault(android.util.SparseBooleanArray, int key, boolean defaultValue);
+ method public static inline boolean getOrElse(android.util.SparseBooleanArray, int key, kotlin.jvm.functions.Function0<java.lang.Boolean> defaultValue);
+ method public static inline int getSize(android.util.SparseBooleanArray);
+ method public static inline boolean isEmpty(android.util.SparseBooleanArray);
+ method public static inline boolean isNotEmpty(android.util.SparseBooleanArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseBooleanArray);
+ method public static operator android.util.SparseBooleanArray plus(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static void putAll(android.util.SparseBooleanArray, android.util.SparseBooleanArray other);
+ method public static boolean remove(android.util.SparseBooleanArray, int key, boolean value);
+ method public static inline operator void set(android.util.SparseBooleanArray, int key, boolean value);
+ method public static kotlin.collections.BooleanIterator valueIterator(android.util.SparseBooleanArray);
+ }
+
+ public final class SparseIntArrayKt {
+ method public static inline operator boolean contains(android.util.SparseIntArray, int key);
+ method public static inline boolean containsKey(android.util.SparseIntArray, int key);
+ method public static inline boolean containsValue(android.util.SparseIntArray, int value);
+ method public static inline void forEach(android.util.SparseIntArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline int getOrDefault(android.util.SparseIntArray, int key, int defaultValue);
+ method public static inline int getOrElse(android.util.SparseIntArray, int key, kotlin.jvm.functions.Function0<java.lang.Integer> defaultValue);
+ method public static inline int getSize(android.util.SparseIntArray);
+ method public static inline boolean isEmpty(android.util.SparseIntArray);
+ method public static inline boolean isNotEmpty(android.util.SparseIntArray);
+ method public static kotlin.collections.IntIterator keyIterator(android.util.SparseIntArray);
+ method public static operator android.util.SparseIntArray plus(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static void putAll(android.util.SparseIntArray, android.util.SparseIntArray other);
+ method public static boolean remove(android.util.SparseIntArray, int key, int value);
+ method public static inline operator void set(android.util.SparseIntArray, int key, int value);
+ method public static kotlin.collections.IntIterator valueIterator(android.util.SparseIntArray);
+ }
+
+ public final class SparseLongArrayKt {
+ method @RequiresApi(18) public static inline operator boolean contains(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsKey(android.util.SparseLongArray, int key);
+ method @RequiresApi(18) public static inline boolean containsValue(android.util.SparseLongArray, long value);
+ method @RequiresApi(18) public static inline void forEach(android.util.SparseLongArray, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super java.lang.Long,kotlin.Unit> action);
+ method @RequiresApi(18) public static inline long getOrDefault(android.util.SparseLongArray, int key, long defaultValue);
+ method @RequiresApi(18) public static inline long getOrElse(android.util.SparseLongArray, int key, kotlin.jvm.functions.Function0<java.lang.Long> defaultValue);
+ method @RequiresApi(18) public static inline int getSize(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static inline boolean isNotEmpty(android.util.SparseLongArray);
+ method @RequiresApi(18) public static kotlin.collections.IntIterator keyIterator(android.util.SparseLongArray);
+ method @RequiresApi(18) public static operator android.util.SparseLongArray plus(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static void putAll(android.util.SparseLongArray, android.util.SparseLongArray other);
+ method @RequiresApi(18) public static boolean remove(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static inline operator void set(android.util.SparseLongArray, int key, long value);
+ method @RequiresApi(18) public static kotlin.collections.LongIterator valueIterator(android.util.SparseLongArray);
+ }
+
+}
+
+package androidx.core.view {
+
+ public final class MenuKt {
+ method public static operator boolean contains(android.view.Menu, android.view.MenuItem item);
+ method public static inline void forEach(android.view.Menu, kotlin.jvm.functions.Function1<? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.Menu, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.MenuItem,kotlin.Unit> action);
+ method public static inline operator android.view.MenuItem get(android.view.Menu, int index);
+ method public static kotlin.sequences.Sequence<android.view.MenuItem> getChildren(android.view.Menu);
+ method public static inline int getSize(android.view.Menu);
+ method public static inline boolean isEmpty(android.view.Menu);
+ method public static inline boolean isNotEmpty(android.view.Menu);
+ method public static operator java.util.Iterator<android.view.MenuItem> iterator(android.view.Menu);
+ method public static inline operator void minusAssign(android.view.Menu, android.view.MenuItem item);
+ }
+
+ public final class ViewGroupKt {
+ method public static inline operator boolean contains(android.view.ViewGroup, android.view.View view);
+ method public static inline void forEach(android.view.ViewGroup, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void forEachIndexed(android.view.ViewGroup, kotlin.jvm.functions.Function2<? super java.lang.Integer,? super android.view.View,kotlin.Unit> action);
+ method public static operator android.view.View get(android.view.ViewGroup, int index);
+ method public static kotlin.sequences.Sequence<android.view.View> getChildren(android.view.ViewGroup);
+ method public static kotlin.sequences.Sequence<android.view.View> getDescendants(android.view.ViewGroup);
+ method public static inline int getSize(android.view.ViewGroup);
+ method public static inline boolean isEmpty(android.view.ViewGroup);
+ method public static inline boolean isNotEmpty(android.view.ViewGroup);
+ method public static operator java.util.Iterator<android.view.View> iterator(android.view.ViewGroup);
+ method public static inline operator void minusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline operator void plusAssign(android.view.ViewGroup, android.view.View view);
+ method public static inline void setMargins(android.view.ViewGroup.MarginLayoutParams, @Px int size);
+ method public static inline void updateMargins(android.view.ViewGroup.MarginLayoutParams, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ method @RequiresApi(17) public static inline void updateMarginsRelative(android.view.ViewGroup.MarginLayoutParams, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+ }
+
+ public final class ViewKt {
+ method public static inline void doOnAttach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnDetach(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline void doOnNextLayout(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static inline androidx.core.view.OneShotPreDrawListener doOnPreDraw(android.view.View, kotlin.jvm.functions.Function1<? super android.view.View,kotlin.Unit> action);
+ method public static android.graphics.Bitmap drawToBitmap(android.view.View, optional android.graphics.Bitmap.Config config);
+ method public static kotlin.sequences.Sequence<android.view.View> getAllViews(android.view.View);
+ method public static kotlin.sequences.Sequence<android.view.ViewParent> getAncestors(android.view.View);
+ method public static inline int getMarginBottom(android.view.View);
+ method public static inline int getMarginEnd(android.view.View);
+ method public static inline int getMarginLeft(android.view.View);
+ method public static inline int getMarginRight(android.view.View);
+ method public static inline int getMarginStart(android.view.View);
+ method public static inline int getMarginTop(android.view.View);
+ method public static inline boolean isGone(android.view.View);
+ method public static inline boolean isInvisible(android.view.View);
+ method public static inline boolean isVisible(android.view.View);
+ method public static inline Runnable postDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method @RequiresApi(16) public static inline Runnable postOnAnimationDelayed(android.view.View, long delayInMillis, kotlin.jvm.functions.Function0<kotlin.Unit> action);
+ method public static inline void setGone(android.view.View, boolean value);
+ method public static inline void setInvisible(android.view.View, boolean value);
+ method public static inline void setPadding(android.view.View, @Px int size);
+ method public static inline void setVisible(android.view.View, boolean value);
+ method public static inline void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super android.view.ViewGroup.LayoutParams,kotlin.Unit> block);
+ method public static inline <reified T extends android.view.ViewGroup.LayoutParams> void updateLayoutParams(android.view.View, kotlin.jvm.functions.Function1<? super T,? extends kotlin.Unit> block);
+ method public static inline void updatePadding(android.view.View, optional @Px int left, optional @Px int top, optional @Px int right, optional @Px int bottom);
+ method @RequiresApi(17) public static inline void updatePaddingRelative(android.view.View, optional @Px int start, optional @Px int top, optional @Px int end, optional @Px int bottom);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public final class TextViewKt {
+ method public static inline android.text.TextWatcher addTextChangedListener(android.widget.TextView, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> beforeTextChanged, optional kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> onTextChanged, optional kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> afterTextChanged);
+ method public static inline android.text.TextWatcher doAfterTextChanged(android.widget.TextView, kotlin.jvm.functions.Function1<? super android.text.Editable,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doBeforeTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ method public static inline android.text.TextWatcher doOnTextChanged(android.widget.TextView, kotlin.jvm.functions.Function4<? super java.lang.CharSequence,? super java.lang.Integer,? super java.lang.Integer,? super java.lang.Integer,kotlin.Unit> action);
+ }
+
+}
+
diff --git a/core/core-ktx/src/androidTest/font_licenses.txt b/core/core-ktx/src/androidTest/font_licenses.txt
index 0b83a9a..65f04ca 100644
--- a/core/core-ktx/src/androidTest/font_licenses.txt
+++ b/core/core-ktx/src/androidTest/font_licenses.txt
@@ -1,93 +1,93 @@
-Copyright 2006 The Inconsolata Project Authors
-
-This Font Software is licensed under the SIL Open Font License, Version 1.1.
-This license is copied below, and is also available with a FAQ at:
-http://scripts.sil.org/OFL
-
-
------------------------------------------------------------
-SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
------------------------------------------------------------
-
-PREAMBLE
-The goals of the Open Font License (OFL) are to stimulate worldwide
-development of collaborative font projects, to support the font creation
-efforts of academic and linguistic communities, and to provide a free and
-open framework in which fonts may be shared and improved in partnership
-with others.
-
-The OFL allows the licensed fonts to be used, studied, modified and
-redistributed freely as long as they are not sold by themselves. The
-fonts, including any derivative works, can be bundled, embedded,
-redistributed and/or sold with any software provided that any reserved
-names are not used by derivative works. The fonts and derivatives,
-however, cannot be released under any other type of license. The
-requirement for fonts to remain under this license does not apply
-to any document created using the fonts or their derivatives.
-
-DEFINITIONS
-"Font Software" refers to the set of files released by the Copyright
-Holder(s) under this license and clearly marked as such. This may
-include source files, build scripts and documentation.
-
-"Reserved Font Name" refers to any names specified as such after the
-copyright statement(s).
-
-"Original Version" refers to the collection of Font Software components as
-distributed by the Copyright Holder(s).
-
-"Modified Version" refers to any derivative made by adding to, deleting,
-or substituting -- in part or in whole -- any of the components of the
-Original Version, by changing formats or by porting the Font Software to a
-new environment.
-
-"Author" refers to any designer, engineer, programmer, technical
-writer or other person who contributed to the Font Software.
-
-PERMISSION & CONDITIONS
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of the Font Software, to use, study, copy, merge, embed, modify,
-redistribute, and sell modified and unmodified copies of the Font
-Software, subject to the following conditions:
-
-1) Neither the Font Software nor any of its individual components,
-in Original or Modified Versions, may be sold by itself.
-
-2) Original or Modified Versions of the Font Software may be bundled,
-redistributed and/or sold with any software, provided that each copy
-contains the above copyright notice and this license. These can be
-included either as stand-alone text files, human-readable headers or
-in the appropriate machine-readable metadata fields within text or
-binary files as long as those fields can be easily viewed by the user.
-
-3) No Modified Version of the Font Software may use the Reserved Font
-Name(s) unless explicit written permission is granted by the corresponding
-Copyright Holder. This restriction only applies to the primary font name as
-presented to the users.
-
-4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
-Software shall not be used to promote, endorse or advertise any
-Modified Version, except to acknowledge the contribution(s) of the
-Copyright Holder(s) and the Author(s) or with their explicit written
-permission.
-
-5) The Font Software, modified or unmodified, in part or in whole,
-must be distributed entirely under this license, and must not be
-distributed under any other license. The requirement for fonts to
-remain under this license does not apply to any document created
-using the Font Software.
-
-TERMINATION
-This license becomes null and void if any of the above conditions are
-not met.
-
-DISCLAIMER
-THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
-OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
-COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
-INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
-DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
-OTHER DEALINGS IN THE FONT SOFTWARE.
+Copyright 2006 The Inconsolata Project Authors
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+http://scripts.sil.org/OFL
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/core/core-remoteviews/api/current.txt b/core/core-remoteviews/api/current.txt
index ea600c8..8cce5c4 100644
--- a/core/core-remoteviews/api/current.txt
+++ b/core/core-remoteviews/api/current.txt
@@ -273,6 +273,8 @@
method @RequiresApi(30) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
method @RequiresApi(31) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
method @RequiresApi(31) public static void setViewStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+ method @RequiresApi(16) public static void setViewStubInflatedId(android.widget.RemoteViews, @IdRes int viewId, int inflatedId);
+ method @RequiresApi(16) public static void setViewStubLayoutResource(android.widget.RemoteViews, @IdRes int viewId, @LayoutRes int layoutResource);
method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
method @RequiresApi(31) public static void setViewTranslationXDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
diff --git a/core/core-remoteviews/api/public_plus_experimental_current.txt b/core/core-remoteviews/api/public_plus_experimental_current.txt
index ea600c8..8cce5c4 100644
--- a/core/core-remoteviews/api/public_plus_experimental_current.txt
+++ b/core/core-remoteviews/api/public_plus_experimental_current.txt
@@ -273,6 +273,8 @@
method @RequiresApi(30) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
method @RequiresApi(31) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
method @RequiresApi(31) public static void setViewStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+ method @RequiresApi(16) public static void setViewStubInflatedId(android.widget.RemoteViews, @IdRes int viewId, int inflatedId);
+ method @RequiresApi(16) public static void setViewStubLayoutResource(android.widget.RemoteViews, @IdRes int viewId, @LayoutRes int layoutResource);
method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
method @RequiresApi(31) public static void setViewTranslationXDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
diff --git a/core/core-remoteviews/api/restricted_current.txt b/core/core-remoteviews/api/restricted_current.txt
index d97a99d..12ac8fa 100644
--- a/core/core-remoteviews/api/restricted_current.txt
+++ b/core/core-remoteviews/api/restricted_current.txt
@@ -277,6 +277,8 @@
method @RequiresApi(30) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, CharSequence? stateDescription);
method @RequiresApi(31) public static void setViewStateDescription(android.widget.RemoteViews, @IdRes int viewId, @StringRes int resId);
method @RequiresApi(31) public static void setViewStateDescriptionAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
+ method @RequiresApi(16) public static void setViewStubInflatedId(android.widget.RemoteViews, @IdRes int viewId, int inflatedId);
+ method @RequiresApi(16) public static void setViewStubLayoutResource(android.widget.RemoteViews, @IdRes int viewId, @LayoutRes int layoutResource);
method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, float value, int unit);
method @RequiresApi(31) public static void setViewTranslationXDimen(android.widget.RemoteViews, @IdRes int viewId, @DimenRes int resId);
method @RequiresApi(31) public static void setViewTranslationXDimenAttr(android.widget.RemoteViews, @IdRes int viewId, @AttrRes int resId);
diff --git a/core/core-remoteviews/src/main/java/androidx/core/widget/RemoteViews.kt b/core/core-remoteviews/src/main/java/androidx/core/widget/RemoteViews.kt
index f24fa44..07aef1b 100644
--- a/core/core-remoteviews/src/main/java/androidx/core/widget/RemoteViews.kt
+++ b/core/core-remoteviews/src/main/java/androidx/core/widget/RemoteViews.kt
@@ -26,6 +26,7 @@
import androidx.annotation.DoNotInline
import androidx.annotation.DrawableRes
import androidx.annotation.IdRes
+import androidx.annotation.LayoutRes
import androidx.annotation.Px
import androidx.annotation.RequiresApi
import androidx.annotation.StringRes
@@ -2995,6 +2996,38 @@
}
/**
+ * Equivalent to calling [android.view.ViewStub.setInflatedId].
+ *
+ * Note that ViewStub may be used in RemoteViews layouts as of API 16.
+ *
+ * @param viewId The id of the target view
+ * @param inflatedId A positive integer used to identify the inflated view or
+ * [android.view.View.NO_ID] if the inflated view should keep its id.
+ */
+@RequiresApi(16)
+public fun RemoteViews.setViewStubInflatedId(@IdRes viewId: Int, inflatedId: Int) {
+ requireSdk(16, "setInflatedId")
+ setInt(viewId, "setInflatedId", inflatedId)
+}
+
+/**
+ * Equivalent to calling [android.view.ViewStub.setLayoutResource].
+ *
+ * Note that ViewStub may be used in RemoteViews layouts as of API 16.
+ *
+ * @param viewId The id of the target view
+ * @param layoutResource A valid layout resource identifier (different from 0).
+ */
+@RequiresApi(16)
+public fun RemoteViews.setViewStubLayoutResource(
+ @IdRes viewId: Int,
+ @LayoutRes layoutResource: Int
+) {
+ requireSdk(16, "setLayoutResource")
+ setInt(viewId, "setLayoutResource", layoutResource)
+}
+
+/**
* Equivalent to calling [android.widget.TextView.setTranslationX].
*
* @param viewId The id of the target view
diff --git a/core/core-splashscreen/build.gradle b/core/core-splashscreen/build.gradle
index d4aeb10..d325d3b 100644
--- a/core/core-splashscreen/build.gradle
+++ b/core/core-splashscreen/build.gradle
@@ -43,6 +43,8 @@
androidTestImplementation(libs.truth)
androidTestImplementation(project(":appcompat:appcompat"))
androidTestImplementation(project(":test:screenshot:screenshot"))
+
+ samples(project(":core:core-splashscreen:core-splashscreen-samples"))
}
androidx {
diff --git a/core/core-splashscreen/samples/lint-baseline.xml b/core/core-splashscreen/samples/lint-baseline.xml
new file mode 100644
index 0000000..97c6707
--- /dev/null
+++ b/core/core-splashscreen/samples/lint-baseline.xml
@@ -0,0 +1,26210 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha07" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha07)" variant="all" version="7.1.0-alpha07">
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED, but could be AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE, AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_APPEARED, AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED"
+ errorLine1=" return event.getContentChangeTypes();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="344"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Action.SEMANTIC_ACTION_NONE, Action.SEMANTIC_ACTION_REPLY, Action.SEMANTIC_ACTION_MARK_AS_READ, Action.SEMANTIC_ACTION_MARK_AS_UNREAD, Action.SEMANTIC_ACTION_DELETE, Action.SEMANTIC_ACTION_ARCHIVE, Action.SEMANTIC_ACTION_MUTE, Action.SEMANTIC_ACTION_UNMUTE, Action.SEMANTIC_ACTION_THUMBS_UP, Action.SEMANTIC_ACTION_THUMBS_DOWN, Action.SEMANTIC_ACTION_CALL"
+ errorLine1=" builder.setSemanticAction(action.getSemanticAction());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4707"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" ? remoteInput.getEditChoicesBeforeSending()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="6327"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" ? src.getEditChoicesBeforeSending()"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="7360"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Action.SEMANTIC_ACTION_NONE, Action.SEMANTIC_ACTION_REPLY, Action.SEMANTIC_ACTION_MARK_AS_READ, Action.SEMANTIC_ACTION_MARK_AS_UNREAD, Action.SEMANTIC_ACTION_DELETE, Action.SEMANTIC_ACTION_ARCHIVE, Action.SEMANTIC_ACTION_MUTE, Action.SEMANTIC_ACTION_UNMUTE, Action.SEMANTIC_ACTION_THUMBS_UP, Action.SEMANTIC_ACTION_THUMBS_DOWN, Action.SEMANTIC_ACTION_CALL"
+ errorLine1=" actionBuilder.setSemanticAction(action.getSemanticAction());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatBuilder.java"
+ line="390"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: LineBreaker.BREAK_STRATEGY_SIMPLE, LineBreaker.BREAK_STRATEGY_HIGH_QUALITY, LineBreaker.BREAK_STRATEGY_BALANCED"
+ errorLine1=" .setBreakStrategy(params.getBreakStrategy())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="467"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, Layout.HYPHENATION_FREQUENCY_NONE"
+ errorLine1=" .setHyphenationFrequency(params.getHyphenationFrequency())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="468"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.SOURCE_FREE_FORM_INPUT, RemoteInput.SOURCE_CHOICE"
+ errorLine1=" return android.app.RemoteInput.getResultsSource(intent);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="531"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="576"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
+ errorLine1=" builder.setEditChoicesBeforeSending(src.getEditChoicesBeforeSending());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="598"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: LineBreaker.BREAK_STRATEGY_SIMPLE, LineBreaker.BREAK_STRATEGY_HIGH_QUALITY, LineBreaker.BREAK_STRATEGY_BALANCED"
+ errorLine1=" textView.setBreakStrategy(params.getBreakStrategy());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/TextViewCompat.java"
+ line="886"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Layout.HYPHENATION_FREQUENCY_NORMAL, Layout.HYPHENATION_FREQUENCY_FULL, Layout.HYPHENATION_FREQUENCY_NONE"
+ errorLine1=" textView.setHyphenationFrequency(params.getHyphenationFrequency());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/TextViewCompat.java"
+ line="887"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: Callback.DISPATCH_MODE_STOP, Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE"
+ errorLine1=" super(compat.getDispatchMode());"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsAnimationCompat.java"
+ line="968"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one or more of: Type.STATUS_BARS, Type.NAVIGATION_BARS, Type.CAPTION_BAR, Type.IME, Type.WINDOW_DECOR, Type.SYSTEM_GESTURES, Type.MANDATORY_SYSTEM_GESTURES, Type.TAPPABLE_ELEMENT, Type.DISPLAY_CUTOUT"
+ errorLine1=" return mController.getTypes();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsAnimationControllerCompat.java"
+ line="332"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH, WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE, WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE"
+ errorLine1=" return mImpl.getSystemBarsBehavior();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsControllerCompat.java"
+ line="275"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="WrongConstant"
+ message="Must be one of: WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_TOUCH, WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE, WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, but could be WindowInsetsController.BEHAVIOR_DEFAULT"
+ errorLine1=" return mInsetsController.getSystemBarsBehavior();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/WindowInsetsControllerCompat.java"
+ line="730"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public static synchronized void preload() {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="58"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" /**"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="462"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public synchronized Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="474"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" synchronized Drawable getDrawable(@NonNull Context context, @DrawableRes int resId,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="478"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public synchronized void onConfigurationChanged(@NonNull Context context) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="483"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" synchronized Drawable onDrawableLoadedFromResources(@NonNull Context context,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="487"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" synchronized ColorStateList getTintList(@NonNull Context context, @DrawableRes int resId) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="497"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public static synchronized PorterDuffColorFilter getPorterDuffColorFilter("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="505"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatRatingBar.java"
+ line="59"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" @Override"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSeekBar.java"
+ line="58"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" /**"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="93"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public synchronized void setHooks(ResourceManagerHooks hooks) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="131"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public synchronized Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="135"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" synchronized Drawable getDrawable(@NonNull Context context, @DrawableRes int resId,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="139"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public synchronized void onConfigurationChanged(@NonNull Context context) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="162"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" private synchronized Drawable getCachedDrawable(@NonNull final Context context,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="317"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" private synchronized boolean addDrawableToCache(@NonNull final Context context, final long key,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="338"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" synchronized Drawable onDrawableLoadedFromResources(@NonNull Context context,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="353"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" synchronized ColorStateList getTintList(@NonNull Context context, @DrawableRes int resId) {"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="381"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanSynchronizedMethods"
+ message="Use of synchronized methods is not recommended"
+ errorLine1=" public static synchronized PorterDuffColorFilter getPorterDuffColorFilter("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="471"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" info.setHomeAsUpIndicator.invoke(actionBar, drawable);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggleHoneycomb.java"
+ line="55"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" info.setHomeActionContentDescription.invoke(actionBar, contentDescRes);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggleHoneycomb.java"
+ line="56"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" info.setHomeActionContentDescription.invoke(actionBar, contentDescRes);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggleHoneycomb.java"
+ line="76"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" requestRelaunchActivityMethod.invoke(activityThread,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/app/ActivityRecreator.java"
+ line="152"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" performStopActivity3ParamsMethod.invoke(activityThread,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/app/ActivityRecreator.java"
+ line="274"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" performStopActivity2ParamsMethod.invoke(activityThread,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/app/ActivityRecreator.java"
+ line="277"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" method.invoke(mTextView);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="675"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" result = (T) method.invoke(object);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="847"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mResolvedMethod.invoke(mResolvedContext, v);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="441"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (IBinder) sGetIBinderMethod.invoke(bundle, key);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/BundleCompat.java"
+ line="60"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" sPutIBinderMethod.invoke(bundle, key, binder);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/BundleCompat.java"
+ line="84"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) getMethod.invoke(systemProperties, name);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DisplayCompat.java"
+ line="135"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) sGetScriptMethod.invoke(null, args);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/ICUCompat.java"
+ line="116"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) sAddLikelySubtagsMethod.invoke(null, args);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/ICUCompat.java"
+ line="133"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (int) icon.getClass().getMethod("getType").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1104"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (String) icon.getClass().getMethod("getResPackage").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1132"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (int) icon.getClass().getMethod("getResId").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1161"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Uri) icon.getClass().getMethod("getUri").invoke(icon);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="1189"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) sActionBarOnMenuKeyMethod.invoke(actionBar, event);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/KeyEventDispatcher.java"
+ line="106"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mSetExclusiveCheckableMethod.invoke(mWrappedObject, checkable);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="391"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" Boolean result = (Boolean) sMethodUserHandleIsAppMethod.invoke(null, uid);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ProcessCompat.java"
+ line="104"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" Boolean result = (Boolean) sMethodUserIdIsAppMethod.invoke(null, uid);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ProcessCompat.java"
+ line="142"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" sRebaseMethod.invoke(theme);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="687"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mDoBeforeTextChanged.invoke(view);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="2080"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mDoAfterTextChanged.invoke(view);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="2090"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mEnsureImeVisible.invoke(view, /* visible = */ true);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="2100"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mMethod.invoke(mRealOwner, item);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportMenuInflater.java"
+ line="265"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mMethod.invoke(mRealOwner, item);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportMenuInflater.java"
+ line="267"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" removeItemAtMethod.invoke(menu, i);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/TextViewCompat.java"
+ line="625"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) sCreateFromFamiliesWithDefault.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java"
+ line="127"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" final Boolean result = (Boolean) sAddFontWeightStyle.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi21Impl.java"
+ line="138"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" final Boolean result = (Boolean) sAddFontWeightStyle.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java"
+ line="112"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) sCreateFromFamiliesWithDefault.invoke("
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi24Impl.java"
+ line="124"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mAddFontFromAssetManager.invoke(family,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="140"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mAddFontFromBuffer.invoke(family,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="155"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) mCreateFromFamiliesWithDefault.invoke(null /* static method */,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="171"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) mFreeze.invoke(family);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="183"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" mAbortCreation.invoke(family);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="194"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Typeface) mCreateFromFamiliesWithDefault.invoke(null /* static method */,"
+ errorLine2=" ^">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="51"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" sComputeFitSystemWindowsMethod.invoke(view, inoutInsets, outLocalInsets);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewUtils.java"
+ line="68"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="BanUncheckedReflection"
+ message="Calling `Method.invoke` without an SDK check"
+ errorLine1=" return (Boolean) sIsProjectedDrawableMethod.invoke(mDrawable);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/WrappedDrawableApi21.java"
+ line="131"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarBackgroundDrawable is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mContainer.mSplitBackground.getOutline(outline);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarBackgroundDrawable.java"
+ line="70"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarBackgroundDrawable is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mContainer.mBackground.getOutline(outline);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarBackgroundDrawable.java"
+ line="75"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarContainer is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" invalidateOutline();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="106"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarContainer is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" invalidateOutline();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="127"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.ActionBarContainer is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" invalidateOutline();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="147"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" actionBar.setHomeAsUpIndicator(themeImage);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="557"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" actionBar.setHomeActionContentDescription(contentDescRes);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="558"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.appcompat.app.ActionBarDrawerToggle.FrameworkActionBarDelegate is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" actionBar.setHomeActionContentDescription(contentDescRes);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="573"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 19; however, the containing class androidx.core.animation.AnimatorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" addPauseListener(listener)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/animation/Animator.kt"
+ line="124"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.show(getTextDirection(), getTextAlignment());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="610"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.show(getTextDirection(), getTextAlignment());"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="610"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" vto.removeOnGlobalLayoutListener(this);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="643"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropDownAdapter is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" if (themedAdapter.getDropDownViewTheme() != dropDownTheme) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="717"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropDownAdapter is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" themedAdapter.setDropDownViewTheme(dropDownTheme);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="718"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DialogPopup is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" listView.setTextDirection(textDirection);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="907"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DialogPopup is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" listView.setTextAlignment(textAlignment);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="908"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropdownPopup is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" listView.setTextDirection(textDirection);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="1056"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatSpinner.DropdownPopup is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" listView.setTextAlignment(textAlignment);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="1057"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextClassifierHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mTextView.getContext().getSystemService(TextClassificationManager.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextClassifierHelper.java"
+ line="64"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextClassifierHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return tcm.getTextClassifier();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextClassifierHelper.java"
+ line="66"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setFontVariationSettings(fontVariation);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="235"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 24; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setTextLocales(LocaleList.forLanguageTags(localeListString));"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="239"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 24; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setTextLocales(LocaleList.forLanguageTags(localeListString));"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="239"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setTextLocale(Locale.forLanguageTag(firstLanTag));"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="243"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setTextLocale(Locale.forLanguageTag(firstLanTag));"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="243"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" if (mView.getAutoSizeStepGranularity() != AppCompatTextViewAutoSizeHelper"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="256"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setAutoSizeTextTypeUniformWithConfiguration("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="259"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setAutoSizeTextTypeUniformWithPresetSizes("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="265"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 28; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" typeface = Typeface.create(typeface, fontWeight,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="367"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 28; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mFontTypeface = Typeface.create("
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="385"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 28; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mFontTypeface = Typeface.create("
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="404"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setFontVariationSettings(fontVariation);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="505"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final Drawable[] compoundDrawables = mView.getCompoundDrawablesRelative();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="533"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final Drawable[] existingRel = mView.getCompoundDrawablesRelative();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="673"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setCompoundDrawablesRelativeWithIntrinsicBounds("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="674"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final Drawable[] existingRel = mView.getCompoundDrawablesRelative();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="684"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.AppCompatTextHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mView.setCompoundDrawablesRelativeWithIntrinsicBounds("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextHelper.java"
+ line="686"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" isInLayout = mTextView.isInLayout();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="664"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final int maxLines = Build.VERSION.SDK_INT >= 16 ? mTextView.getMaxLines() : -1;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="753"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final StaticLayout.Builder layoutBuilder = StaticLayout.Builder.obtain("
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="779"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" layoutBuilder.setAlignment(alignment)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="782"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setLineSpacing("
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="783"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mTextView.getLineSpacingExtra(),"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="784"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mTextView.getLineSpacingMultiplier())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="785"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setIncludePad(mTextView.getIncludeFontPadding())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="786"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setIncludePad(mTextView.getIncludeFontPadding())"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="786"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setBreakStrategy(mTextView.getBreakStrategy())"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="787"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setBreakStrategy(mTextView.getBreakStrategy())"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="787"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setHyphenationFrequency(mTextView.getHyphenationFrequency())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="788"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setHyphenationFrequency(mTextView.getHyphenationFrequency())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="788"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" .setMaxLines(maxLines == -1 ? Integer.MAX_VALUE : maxLines);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="789"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return layoutBuilder.build();"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="799"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final float lineSpacingMultiplier = mTextView.getLineSpacingMultiplier();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="805"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final float lineSpacingAdd = mTextView.getLineSpacingExtra();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="806"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final boolean includePad = mTextView.getIncludeFontPadding();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextViewAutoSizeHelper.java"
+ line="807"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val stream = startWrite()"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/AtomicFile.kt"
+ line="32"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" finishWrite(stream)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/AtomicFile.kt"
+ line="39"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" failWrite(stream)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/AtomicFile.kt"
+ line="41"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun AtomicFile.readBytes(): ByteArray = readFully()"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/AtomicFile.kt"
+ line="71"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.util.AtomicFileKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return readFully().toString(charset)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/AtomicFile.kt"
+ line="80"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.BitmapKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" colorSpace: ColorSpace = ColorSpace.get(ColorSpace.Named.SRGB)"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Bitmap.kt"
+ line="116"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.BitmapKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return Bitmap.createBitmap(width, height, config, hasAlpha, colorSpace)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Bitmap.kt"
+ line="118"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.os.BundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" putBinder(key, value)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/Bundle.kt"
+ line="93"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.BundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" putSize(key, value)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/Bundle.kt"
+ line="95"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.BundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" putSizeF(key, value)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/Bundle.kt"
+ line="97"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun Color.component1(): Float = getComponent(0)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="39"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun Color.component2(): Float = getComponent(1)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="53"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun Color.component3(): Float = getComponent(2)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="67"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun Color.component4(): Float = getComponent(3)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="81"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 24; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.luminance(this)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="200"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun @receiver:ColorInt Int.toColor(): Color = Color.valueOf(this)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="207"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun @receiver:ColorInt Int.toColorLong(): Long = Color.pack(this)"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="215"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun @receiver:ColorLong Long.component1(): Float = Color.red(this)"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="229"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun @receiver:ColorLong Long.component2(): Float = Color.green(this)"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="243"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun @receiver:ColorLong Long.component3(): Float = Color.blue(this)"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="257"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun @receiver:ColorLong Long.component4(): Float = Color.alpha(this)"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="271"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.alpha(this)"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="281"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.red(this)"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="291"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.green(this)"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="301"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.blue(this)"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="311"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.luminance(this)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="319"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun @receiver:ColorLong Long.toColor(): Color = Color.valueOf(this)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="325"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun @receiver:ColorLong Long.toColorInt(): Int = Color.toArgb(this)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="332"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.isSrgb(this)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="340"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = Color.isWideGamut(this)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="347"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline val @receiver:ColorLong Long.colorSpace: ColorSpace get() = Color.colorSpace(this)"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="353"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" Color.convert(this, ColorSpace.get(colorSpace))"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="365"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" Color.convert(this, ColorSpace.get(colorSpace))"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="365"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" Color.convert(this, colorSpace)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="377"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" Color.convert(this, ColorSpace.get(colorSpace))"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="389"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" Color.convert(this, ColorSpace.get(colorSpace))"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="389"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" Color.convert(this, colorSpace)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="401"
+ column="11"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" convert(ColorSpace.get(colorSpace))"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="412"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" convert(ColorSpace.get(colorSpace))"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="412"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.ColorKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline infix fun Color.convertTo(colorSpace: ColorSpace): Color = convert(colorSpace)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Color.kt"
+ line="422"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.ColorDrawableKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun Color.toDrawable(): ColorDrawable = ColorDrawable(toArgb())"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/ColorDrawable.kt"
+ line="31"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.view.ContextThemeWrapper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" final Context resContext = createConfigurationContext(mOverrideConfiguration);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="117"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.DropDownListView is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" drawableHotspotChanged(x, y);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DropDownListView.java"
+ line="650"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.DropDownListView is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" child.drawableHotspotChanged(childX, childY);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DropDownListView.java"
+ line="673"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.util.HalfKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun @receiver:HalfFloat Short.toHalf(): Half = Half.valueOf(this)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Half.kt"
+ line="33"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.util.HalfKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun Float.toHalf(): Half = Half.valueOf(this)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Half.kt"
+ line="41"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.util.HalfKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun String.toHalf(): Half = Half.valueOf(this)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Half.kt"
+ line="57"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun Bitmap.toAdaptiveIcon(): Icon = Icon.createWithAdaptiveBitmap(this)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/Icon.kt"
+ line="32"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun Bitmap.toIcon(): Icon = Icon.createWithBitmap(this)"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/Icon.kt"
+ line="40"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun Uri.toIcon(): Icon = Icon.createWithContentUri(this)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/Icon.kt"
+ line="48"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.core.graphics.drawable.IconKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun ByteArray.toIcon(): Icon = Icon.createWithData(this, 0, size)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/Icon.kt"
+ line="56"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.ImageDecoderKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return ImageDecoder.decodeBitmap(this) { decoder, info, source ->"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/ImageDecoder.kt"
+ line="35"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 28; however, the containing class androidx.core.graphics.ImageDecoderKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return ImageDecoder.decodeDrawable(this) { decoder, info, source ->"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/ImageDecoder.kt"
+ line="49"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.ListPopupWindow is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.setEpicenterBounds(mEpicenterBounds);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ListPopupWindow.java"
+ line="753"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.ListPopupWindow is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.setIsClippedToScreen(clip);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ListPopupWindow.java"
+ line="1441"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 24; however, the containing class androidx.appcompat.widget.ListPopupWindow is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return mPopup.getMaxAvailableHeight(anchor, yOffset, ignoreBottomDecorations);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ListPopupWindow.java"
+ line="1458"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.text.LocaleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get() = TextUtils.getLayoutDirectionFromLocale(this)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/Locale.kt"
+ line="30"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline val <T> LongSparseArray<T>.size: Int get() = size()"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="26"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" indexOfKey(key) >= 0"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="31"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun <T> LongSparseArray<T>.set(key: Long, value: T): Unit = put(key, value)"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="35"
+ column="84"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val new = LongSparseArray<T>(size() + other.size())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="40"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val new = LongSparseArray<T>(size() + other.size())"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="40"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val new = LongSparseArray<T>(size() + other.size())"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="40"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun <T> LongSparseArray<T>.containsKey(key: Long): Boolean = indexOfKey(key) >= 0"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="48"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" indexOfValue(value) >= 0"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="53"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get(key) ?: defaultValue"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="58"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get(key) ?: defaultValue()"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="63"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun <T> LongSparseArray<T>.isEmpty(): Boolean = size() == 0"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="67"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun <T> LongSparseArray<T>.isNotEmpty(): Boolean = size() != 0"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="71"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val index = indexOfKey(key)"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="76"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" if (index >= 0 && value == valueAt(index)) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="77"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" removeAt(index)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="78"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" for (index in 0 until size()) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="91"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" action(keyAt(index), valueAt(index))"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="92"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.util.LongSparseArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" action(keyAt(index), valueAt(index))"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="92"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun hasNext() = index < size()"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="100"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun nextLong() = keyAt(index++)"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="101"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun hasNext() = index < size()"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="108"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun next() = valueAt(index++)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LongSparseArray.kt"
+ line="109"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.view.menu.MenuPopupHelper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" display.getRealSize(displaySize);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java"
+ line="236"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.MenuPopupWindow is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.setEnterTransition((Transition) enterTransition);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="87"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.widget.MenuPopupWindow is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.setExitTransition((Transition) exitTransition);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="93"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.MenuPopupWindow is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPopup.setTouchModal(touchModal);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="115"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.appcompat.widget.MenuPopupWindow.MenuDropDownListView is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" && ViewCompat.LAYOUT_DIRECTION_RTL == config.getLayoutDirection()) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="152"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" op(p, Path.Op.UNION)"
+ errorLine2=" ~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Path.kt"
+ line="43"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" op(p, Path.Op.DIFFERENCE)"
+ errorLine2=" ~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Path.kt"
+ line="53"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" op(this@and, p, Path.Op.INTERSECT)"
+ errorLine2=" ~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Path.kt"
+ line="70"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 19; however, the containing class androidx.core.graphics.PathKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" op(p, Path.Op.XOR)"
+ errorLine2=" ~~">
+ <location
+ file="src/main/java/androidx/core/graphics/Path.kt"
+ line="80"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="): PersistableBundle = PersistableBundle(pairs.size).apply {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="31"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" null -> putString(key, null) // Any nullable type will suffice."
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="34"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 22; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" putBoolean(key, value)"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="39"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is Double -> putDouble(key, value)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="44"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is Int -> putInt(key, value)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="45"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is Long -> putLong(key, value)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="46"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is String -> putString(key, value)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="49"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 22; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" putBooleanArray(key, value)"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="54"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is DoubleArray -> putDoubleArray(key, value)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="59"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is IntArray -> putIntArray(key, value)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="60"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" is LongArray -> putLongArray(key, value)"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="61"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.os.PersistableBundleKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" putStringArray(key, value as Array<String>)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/PersistableBundle.kt"
+ line="69"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline infix fun <T : Comparable<T>> T.rangeTo(that: T): Range<T> = Range(this, that)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="30"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun <T : Comparable<T>> Range<T>.plus(value: T): Range<T> = extend(value)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="34"
+ column="84"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" extend(other)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="39"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" intersect(other)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="48"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override val endInclusive get() = upper"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="53"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override val start get() = lower"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="54"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.RangeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public fun <T : Comparable<T>> ClosedRange<T>.toRange(): Range<T> = Range(start, endInclusive)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Range.kt"
+ line="59"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.appcompat.app.ResourcesFlusher is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" unthemedEntries.clear();"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ResourcesFlusher.java"
+ line="205"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.SearchView is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mSearchSrcTextView.refreshAutoCompleteResults();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1705"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 29; however, the containing class androidx.appcompat.widget.SearchView.SearchAutoComplete is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" setInputMethodMode(INPUT_METHOD_NEEDED);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="2033"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun Size.component1(): Int = width"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Size.kt"
+ line="35"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun Size.component2(): Int = height"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Size.kt"
+ line="47"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun SizeF.component1(): Float = width"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Size.kt"
+ line="59"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.core.util.SizeKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun SizeF.component2(): Float = height"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/Size.kt"
+ line="71"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline val SparseLongArray.size: Int get() = size()"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="26"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun SparseLongArray.contains(key: Int): Boolean = indexOfKey(key) >= 0"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="30"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline operator fun SparseLongArray.set(key: Int, value: Long): Unit = put(key, value)"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="34"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val new = SparseLongArray(size() + other.size())"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="39"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val new = SparseLongArray(size() + other.size())"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="39"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val new = SparseLongArray(size() + other.size())"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="39"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun SparseLongArray.containsKey(key: Int): Boolean = indexOfKey(key) >= 0"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="47"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun SparseLongArray.containsValue(value: Long): Boolean = indexOfValue(value) >= 0"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="51"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" get(key, defaultValue)"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="56"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" indexOfKey(key).let { if (it >= 0) valueAt(it) else defaultValue() }"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="61"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" indexOfKey(key).let { if (it >= 0) valueAt(it) else defaultValue() }"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="61"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun SparseLongArray.isEmpty(): Boolean = size() == 0"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="65"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1="public inline fun SparseLongArray.isNotEmpty(): Boolean = size() != 0"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="69"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" val index = indexOfKey(key)"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="74"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" if (index >= 0 && value == valueAt(index)) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="75"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" removeAt(index)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="76"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" for (index in 0 until size()) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="89"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" action(keyAt(index), valueAt(index))"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="90"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.core.util.SparseLongArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" action(keyAt(index), valueAt(index))"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="90"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun hasNext() = index < size()"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="98"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun nextInt() = keyAt(index++)"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="99"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun hasNext() = index < size()"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="106"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class null is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" override fun nextLong() = valueAt(index++)"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/SparseLongArray.kt"
+ line="107"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 18; however, the containing class androidx.appcompat.widget.SwitchCompat is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mPositionAnimator.setAutoCancel(true);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1130"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.TintTypedArray is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return mWrapped.getType(index);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="229"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 21; however, the containing class androidx.appcompat.widget.TintTypedArray is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return mWrapped.getChangingConfigurations();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="257"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.widget.TooltipCompat is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" view.setTooltipText(tooltipText);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TooltipCompat.java"
+ line="42"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 19; however, the containing class androidx.core.transition.TransitionKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" addListener(listener)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/transition/Transition.kt"
+ line="80"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.core.content.res.TypedArrayKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return getFont(index)!!"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/TypedArray.kt"
+ line="146"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" @Px start: Int = paddingStart,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/View.kt"
+ line="140"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" @Px end: Int = paddingEnd,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/View.kt"
+ line="142"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" setPaddingRelative(start, top, end, bottom)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/View.kt"
+ line="145"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 16; however, the containing class androidx.core.view.ViewKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" postOnAnimationDelayed(runnable, delayInMillis)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/View.kt"
+ line="208"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" @Px start: Int = marginStart,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroup.kt"
+ line="137"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" @Px end: Int = marginEnd,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroup.kt"
+ line="139"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" marginStart = start"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroup.kt"
+ line="142"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 17; however, the containing class androidx.core.view.ViewGroupKt is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" marginEnd = end"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroup.kt"
+ line="144"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return mWrapped.onSearchRequested(searchEvent);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="145"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 23; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" return mWrapped.onWindowStartingActionMode(callback, type);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="161"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 24; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mWrapped.onProvideKeyboardShortcuts(data, menu, deviceId);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="178"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 26; however, the containing class androidx.appcompat.view.WindowCallbackWrapper is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" mWrapped.onPointerCaptureChanged(hasCapture);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="184"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="PrivateConstructorForUtilityClass"
+ message="Utility class is missing private constructor"
+ errorLine1="public class NotificationCompat {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="82"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `parent` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getParent() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2164"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2179"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`CollectionInfoCompat`) and setter parameter type (`Object`) getter and setter methods for property `collectionInfo` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public CollectionInfoCompat getCollectionInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2988"
+ column="33"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2998"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`CollectionItemInfoCompat`) and setter parameter type (`Object`) getter and setter methods for property `collectionItemInfo` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public CollectionItemInfoCompat getCollectionItemInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3021"
+ column="37"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3007"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `labelFor` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabelFor() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3262"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3225"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `labeledBy` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabeledBy() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3318"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3276"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getCanOpenPopup` such that `canOpenPopup` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean canOpenPopup() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3331"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `traversalBefore` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalBefore() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3533"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3555"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `traversalAfter` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalAfter() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3598"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3620"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`AccessibilityNodeInfoCompat`) and setter parameter type (`View`) getter and setter methods for property `source` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public AccessibilityNodeInfoCompat getSource() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="159"
+ column="40"/>
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="97"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`View`) and setter parameter type (`ScrollingTabContainerView`) getter and setter methods for property `tabContainer` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public View getTabContainer() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="242"
+ column="17"/>
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="228"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getOverlayMode` such that `overlayMode` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean isInOverlayMode() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarOverlayLayout.java"
+ line="210"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`ActionBar`) and setter parameter type (`Toolbar`) getter and setter methods for property `supportActionBar` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public ActionBar getSupportActionBar() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="162"
+ column="22"/>
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="182"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`ActionBar`) and setter parameter type (`Toolbar`) getter and setter methods for property `supportActionBar` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public abstract ActionBar getSupportActionBar();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="279"
+ column="31"/>
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="296"
+ column="26"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`Theme`) and setter parameter type (`int`) getter and setter methods for property `theme` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public Resources.Theme getTheme() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="146"
+ column="28"/>
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="130"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `setLongpressEnabled` such that (along with the `isLongpressEnabled` getter) Kotlin code can access it as a property (`longpressEnabled`); see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public void setIsLongpressEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="555"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This getter should be public such that `itemIndexOffset` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" int getItemIndexOffset() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="160"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This getter should be public such that `qwertyMode` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" boolean isQwertyMode() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="791"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This getter should be public such that `optionalIconsVisible` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" boolean getOptionalIconsVisible() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1346"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This getter should be public such that `callback` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" Runnable getCallback() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="232"
+ column="14"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`SubMenu`) and setter parameter type (`SubMenuBuilder`) getter and setter methods for property `subMenu` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public SubMenu getSubMenu() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="418"
+ column="20"/>
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="427"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `setActionButton` such that (along with the `isActionButton` getter) Kotlin code can access it as a property (`actionButton`); see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public void setIsActionButton(boolean isActionButton) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="719"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getShouldShowIcon` such that `shouldShowIcon` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean shouldShowIcon() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="150"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getMipMap` such that `mipMap` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean hasMipMap() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="181"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getAntiAlias` such that `antiAlias` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public boolean hasAntiAlias() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="205"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`Theme`) and setter parameter type (`int`) getter and setter methods for property `theme` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public Resources.Theme getTheme() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
+ line="107"
+ column="28"/>
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
+ line="112"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 2, "listener", in androidx.appcompat.app.AlertDialog.Builder.setCursor) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" String labelColumn) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="677"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 1, "adapter", in androidx.appcompat.widget.DecorToolbar.setDropdownParams) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" void setDropdownParams(SpinnerAdapter adapter, AdapterView.OnItemSelectedListener listener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="83"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 2, "what", in androidx.appcompat.graphics.drawable.DrawableWrapper.scheduleDrawable) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" public void scheduleDrawable(Drawable who, Runnable what, long when) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="169"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 2, "r", in androidx.core.os.HandlerCompat.postDelayed) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" @Nullable Object token, long delayMillis) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/HandlerCompat.java"
+ line="181"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 1, "component", in androidx.core.view.KeyEventDispatcher.dispatchKeyEvent) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" @Nullable View root, @Nullable Window.Callback callback, @NonNull KeyEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/KeyEventDispatcher.java"
+ line="79"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 1, "callable", in androidx.core.provider.SelfDestructiveThread.postAndWait) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" public <T> T postAndWait(final Callable<T> callable, int timeoutMillis)"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="169"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="LambdaLast"
+ message="Functional interface parameters (such as parameter 1, "adapter", in androidx.appcompat.widget.ToolbarWidgetWrapper.setDropdownParams) should be last to improve Kotlin interoperability; see https://kotlinlang.org/docs/reference/java-interop.html#sam-conversions"
+ errorLine1=" AdapterView.OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="516"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityNodeInfoCompat nodeInfoCompat, int clickableSpanActionId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityClickableSpanCompat.java"
+ line="55"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityDelegateCompat(AccessibilityDelegate originalDelegate) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="147"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sendAccessibilityEvent(View host, int eventType) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="173"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="195"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sendAccessibilityEventUnchecked(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="195"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="216"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="216"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="236"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPopulateAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="236"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="256"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(View host, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="256"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="275"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(View host, AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="275"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="299"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onRequestSendAccessibilityEvent(ViewGroup host, View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="299"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="300"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="318"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeProviderCompat getAccessibilityNodeProvider(View host) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="318"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAccessibilityAction(View host, int action, Bundle args) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="344"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAccessibilityAction(View host, int action, Bundle args) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/AccessibilityDelegateCompat.java"
+ line="344"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getRecordCount(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="257"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void appendRecord(AccessibilityEvent event, AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="273"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void appendRecord(AccessibilityEvent event, AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="273"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat getRecord(AccessibilityEvent event, int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="287"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat getRecord(AccessibilityEvent event, int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="287"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat asRecord(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="308"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat asRecord(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="308"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setContentChangeTypes(AccessibilityEvent event,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="320"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getContentChangeTypes(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="342"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMovementGranularity(AccessibilityEvent event, int granularity) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="357"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMovementGranularity(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="368"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setAction(AccessibilityEvent event, int action) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="393"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getAction(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityEventCompat.java"
+ line="404"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean addAccessibilityStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="45"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="46"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean removeAccessibilityStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="66"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="67"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<AccessibilityServiceInfo> getInstalledAccessibilityServiceList("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="118"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityManager manager) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="119"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<AccessibilityServiceInfo> getEnabledAccessibilityServiceList("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="141"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityManager manager, int feedbackTypeFlags) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="142"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isTouchExplorationEnabled(AccessibilityManager manager) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="155"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean addTouchExplorationStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="166"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" TouchExplorationStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="167"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean removeTouchExplorationStateChangeListener(AccessibilityManager manager,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="185"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" TouchExplorationStateChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityManagerCompat.java"
+ line="186"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat(int actionId, CharSequence label) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="608"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat(int actionId, CharSequence label,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="621"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityViewCommand command) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="622"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getLabel() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="667"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean perform(View view, Bundle arguments) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="683"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean perform(View view, Bundle arguments) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="683"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat createReplacementAction(CharSequence label,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="707"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityActionCompat createReplacementAction(CharSequence label,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="707"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityViewCommand command) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="708"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionInfoCompat obtain(int rowCount, int columnCount,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="777"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionInfoCompat obtain(int rowCount, int columnCount,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="799"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="898"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CollectionItemInfoCompat obtain(int rowIndex, int rowSpan,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="923"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static RangeInfoCompat obtain(int type, float min, float max, float current) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1040"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat(Object info) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1696"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat wrap(@NonNull AccessibilityNodeInfo info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1710"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfo unwrap() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1717"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getInfo() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1727"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1738"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View source) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1738"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1752"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1752"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1766"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1777"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityNodeInfoCompat obtain(AccessibilityNodeInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1777"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View source) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1786"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1812"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat findFocus(int focus) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1832"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat focusSearch(int direction) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1854"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getChild(int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1893"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addChild(View child) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1908"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addChild(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1926"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean removeChild(View child) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1946"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean removeChild(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="1964"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addAction(AccessibilityActionCompat action) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2029"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean removeAction(AccessibilityActionCompat action) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2054"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAction(int action, Bundle arguments) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2091"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2143"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2143"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getParent() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2164"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setParent(View parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2179"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setParent(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2205"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getBoundsInParent(Rect outBounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2226"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBoundsInParent(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2249"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getBoundsInScreen(Rect outBounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2258"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBoundsInScreen(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2273"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getPackageName() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2617"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPackageName(CharSequence packageName) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2632"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getClassName() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2641"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setClassName(CharSequence className) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2656"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2665"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setText(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2695"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addSpansToExtras(CharSequence text, View view) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2703"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addSpansToExtras(CharSequence text, View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2703"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ClickableSpan[] getClickableSpans(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2740"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ClickableSpan[] getClickableSpans(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2740"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2801"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2831"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setViewIdResourceName(String viewId) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2876"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getViewIdResourceName() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2894"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CollectionInfoCompat getCollectionInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2988"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCollectionInfo(Object collectionInfo) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="2998"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCollectionItemInfo(Object collectionItemInfo) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3007"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CollectionItemInfoCompat getCollectionItemInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3021"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RangeInfoCompat getRangeInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3036"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setRangeInfo(RangeInfoCompat rangeInfo) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3056"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityActionCompat> getActionList() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3073"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setError(CharSequence error) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3200"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getError() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3211"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabelFor(View labeled) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3225"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabelFor(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3245"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabelFor() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3262"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabeledBy(View label) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3276"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLabeledBy(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3301"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getLabeledBy() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3318"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(String viewId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3378"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByViewId(String viewId) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3378"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Bundle getExtras() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3404"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalBefore() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3533"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalBefore(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3555"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalBefore(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3582"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getTraversalAfter() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3598"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalAfter(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3620"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTraversalAfter(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3646"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityWindowInfoCompat getWindow() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeInfoCompat.java"
+ line="3659"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeProviderCompat(Object provider) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="137"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getProvider() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="144"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performAction(int virtualViewId, int action, Bundle arguments) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="188"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<AccessibilityNodeInfoCompat> findAccessibilityNodeInfosByText(String text,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityNodeProviderCompat.java"
+ line="207"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityRecordCompat(Object record) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="43"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getImpl() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="54"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="69"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat obtain(AccessibilityRecordCompat record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="69"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityRecordCompat obtain() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="83"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View source) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="97"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSource(View root, int virtualDescendantId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="118"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setSource(@NonNull AccessibilityRecord record, View root,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="137"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getSource() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="159"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMaxScrollX(AccessibilityRecord record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="481"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMaxScrollX(AccessibilityRecord record, int maxScrollX) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="507"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMaxScrollY(AccessibilityRecord record) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="531"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMaxScrollY(AccessibilityRecord record, int maxScrollY) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="557"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getClassName() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="623"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setClassName(CharSequence className) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="637"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<CharSequence> getText() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="650"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getBeforeText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="662"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBeforeText(CharSequence beforeText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="676"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="688"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="702"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable getParcelableData() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="714"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setParcelableData(Parcelable parcelableData) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityRecordCompat.java"
+ line="728"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBundle(Bundle bundle) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java"
+ line="53"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getHTMLElement() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java"
+ line="103"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityViewCommand.java"
+ line="138"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getRoot() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="125"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityWindowInfoCompat getParent() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="139"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getBoundsInScreen(Rect outBounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="165"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityWindowInfoCompat getChild(int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="231"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="245"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AccessibilityNodeInfoCompat getAnchor() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="258"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityWindowInfoCompat obtain() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="273"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityWindowInfoCompat obtain(AccessibilityWindowInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="289"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AccessibilityWindowInfoCompat obtain(AccessibilityWindowInfoCompat info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/accessibility/AccessibilityWindowInfoCompat.java"
+ line="289"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setCustomView(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="217"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setCustomView(View view, LayoutParams layoutParams);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="237"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setCustomView(View view, LayoutParams layoutParams);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="237"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setIcon(Drawable icon);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="286"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setLogo(Drawable logo);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="316"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setListNavigationCallbacks(SpinnerAdapter adapter,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="339"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" OnNavigationListener callback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="340"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setTitle(CharSequence title);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="390"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setSubtitle(CharSequence subtitle);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="413"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setStackedBackgroundDrawable(Drawable d) { }"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="530"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSplitBackgroundDrawable(Drawable d) { }"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="540"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View getCustomView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="545"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab newTab();"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="622"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addTab(Tab tab);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="636"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addTab(Tab tab, boolean setSelected);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="650"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addTab(Tab tab, int position);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="666"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addTab(Tab tab, int position, boolean setSelected);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="682"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void removeTab(Tab tab);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="696"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void selectTab(Tab tab);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="736"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab getTabAt(int index);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="765"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addOnMenuVisibilityListener(OnMenuVisibilityListener listener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="823"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="831"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getThemedContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="858"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onConfigurationChanged(Configuration config) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1051"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode startActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1061"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode startActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1061"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onMenuKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1085"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyShortcut(int keyCode, KeyEvent ev) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1091"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setWindowTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1103"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Drawable getIcon();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1193"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract CharSequence getText();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1200"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setIcon(Drawable icon);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1208"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setIcon(Drawable icon);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1208"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setIcon(@DrawableRes int resId);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1216"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setText(CharSequence text);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1225"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setText(CharSequence text);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1225"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setText(int resId);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1234"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setCustomView(View view);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1243"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setCustomView(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1243"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setCustomView(int layoutResId);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1252"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View getCustomView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1259"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setTag(Object obj);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1267"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setTag(Object obj);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1267"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Object getTag();"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1272"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setTabListener(TabListener listener);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1281"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setTabListener(TabListener listener);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1281"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setContentDescription(@StringRes int resId);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1297"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setContentDescription(CharSequence contentDesc);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1308"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Tab setContentDescription(CharSequence contentDesc);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1308"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract CharSequence getContentDescription();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1317"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTabSelected(Tab tab, FragmentTransaction ft);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1340"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTabSelected(Tab tab, FragmentTransaction ft);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1340"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTabUnselected(Tab tab, FragmentTransaction ft);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1351"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTabUnselected(Tab tab, FragmentTransaction ft);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1351"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTabReselected(Tab tab, FragmentTransaction ft);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1362"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTabReselected(Tab tab, FragmentTransaction ft);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1362"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(@NonNull Context c, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1376"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(LayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1398"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(ViewGroup.LayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBar.java"
+ line="1404"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarContainer(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="54"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarContainer(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="58"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarContainer(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="58"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPrimaryBackground(Drawable bg) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="89"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setStackedBackground(Drawable bg) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="110"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSplitBackground(Drawable bg) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="131"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean verifyDrawable(Drawable who) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="161"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onInterceptTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="208"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="213"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onHoverEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="221"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTabContainer(ScrollingTabContainerView tabView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="228"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getTabContainer() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="242"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionMode startActionModeForChild(View child,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="247"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionMode startActionModeForChild(View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="247"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" android.view.ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="248"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionMode startActionModeForChild(View child,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="254"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionMode startActionModeForChild(View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="254"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" android.view.ActionMode.Callback callback, int type) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContainer.java"
+ line="255"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="101"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="116"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="122"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="127"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="131"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initForMode(final ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="162"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected ViewGroup.LayoutParams generateDefaultLayoutParams() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="236"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="243"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionBarContextView.java"
+ line="243"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setActionBarUpIndicator(Drawable upDrawable, @StringRes int contentDescRes);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="90"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Drawable getThemeUpIndicator();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="102"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context getActionBarThemedContext();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="107"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="150"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="150"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="181"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="181"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Toolbar toolbar, @StringRes int openDrawerContentDescRes,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="182"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onConfigurationChanged(Configuration newConfig) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="256"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onOptionsItemSelected(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="273"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setHomeAsUpIndicator(Drawable indicator) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="302"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerSlide(View drawerView, float slideOffset) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="412"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerOpened(View drawerView) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="428"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerClosed(View drawerView) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="443"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View.OnClickListener getToolbarNavigationClickListener() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="470"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View.OnClickListener onToolbarNavigationClickListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/ActionBarDrawerToggle.java"
+ line="484"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ActionBarPolicy get(Context context) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionBarPolicy.java"
+ line="42"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ActionBarPolicy get(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionBarPolicy.java"
+ line="42"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItem(Context context, int group, int id, int categoryOrder, int ordering,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="78"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="79"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getIcon() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="103"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Intent getIntent() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="108"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextMenuInfo getMenuInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="118"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu getSubMenu() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="138"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="143"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitleCondensed() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="148"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="178"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="184"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setCheckable(boolean checkable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="191"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItem setExclusiveCheckable(boolean exclusive) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="196"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setChecked(boolean checked) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="202"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="208"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="214"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="214"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(int iconRes) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="222"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="230"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="230"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="236"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar, int numericModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="242"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="249"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="249"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="255"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="262"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="272"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="272"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(int title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="278"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="284"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="284"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setVisible(boolean visible) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="290"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setActionView(View actionView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="324"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setActionView(View actionView) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="324"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getActionView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="329"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(android.view.ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="334"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(android.view.ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="334"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionProvider getActionProvider() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="339"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setActionView(int resId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="344"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionProvider getSupportActionProvider() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="349"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="354"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="354"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setShowAsActionFlags(int actionEnum) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="359"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="380"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="380"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="385"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="385"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="391"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setTooltipText(CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="396"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setTooltipText(CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="396"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTooltipText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="402"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="407"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList getIconTintList() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="417"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="422"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="422"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PorterDuff.Mode getIconTintMode() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItem.java"
+ line="432"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItemView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="63"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItemView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="67"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItemView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="67"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="71"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMenuItemView(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="71"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onConfigurationChanged(Configuration newConfig) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="91"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItemImpl getItemData() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="118"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initialize(MenuItemImpl itemData, int menuType) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="123"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent e) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="140"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onClick(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="149"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setItemInvoker(MenuBuilder.ItemInvoker invoker) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="155"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPopupCallback(PopupCallback popupCallback) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="159"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="214"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="246"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="330"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract ShowableListMenu getPopup();"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ActionMenuItemView.java"
+ line="337"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPresenter(ActionMenuPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="124"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onConfigurationChanged(Configuration newConfig) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="130"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="143"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateDefaultLayoutParams() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="582"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="590"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="590"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="595"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="595"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="609"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateOverflowButtonLayoutParams() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="615"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean invokeItem(MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="624"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initialize(MenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="638"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="650"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="671"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="671"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuBuilder peekMenu() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="681"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="749"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onMenuItemClick(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="771"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(Context c, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="832"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(Context c, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="832"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(ViewGroup.LayoutParams other) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="836"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(LayoutParams other) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActionMenuView.java"
+ line="840"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTag(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="56"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getTag() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="70"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setTitle(CharSequence title);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="83"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setSubtitle(CharSequence subtitle);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="105"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setCustomView(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="165"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Menu getMenu();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="187"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract CharSequence getTitle();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="194"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract CharSequence getSubtitle();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="201"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View getCustomView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="208"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract MenuInflater getMenuInflater();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="213"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onCreateActionMode(ActionMode mode, Menu menu);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="256"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onCreateActionMode(ActionMode mode, Menu menu);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="256"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onPrepareActionMode(ActionMode mode, Menu menu);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="265"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onPrepareActionMode(ActionMode mode, Menu menu);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="265"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onActionItemClicked(ActionMode mode, MenuItem item);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="275"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onActionItemClicked(ActionMode mode, MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="275"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDestroyActionMode(ActionMode mode);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ActionMode.java"
+ line="282"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionProvider(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="133"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="140"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View onCreateActionView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="149"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateActionView(MenuItem forItem) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="163"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateActionView(MenuItem forItem) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="163"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPrepareSubMenu(SubMenu subMenu) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="262"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubUiVisibilityListener(SubUiVisibilityListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="282"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setVisibilityListener(VisibilityListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ActionProvider.java"
+ line="292"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setActivityChooserModel(ActivityChooserModel dataModel);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="101"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sort(Intent intent, List<ActivityResolveInfo> activities,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="120"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void sort(Intent intent, List<ActivityResolveInfo> activities,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="120"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<HistoricalRecord> historicalRecords);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="121"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onChooseActivity(ActivityChooserModel host, Intent intent);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="145"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onChooseActivity(ActivityChooserModel host, Intent intent);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="145"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public HistoricalRecord(String activityName, long time, float weight) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="782"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public HistoricalRecord(ComponentName activityName, long time, float weight) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="793"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActivityResolveInfo(ResolveInfo resolveInfo) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="869"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int compareTo(ActivityResolveInfo another) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserModel.java"
+ line="897"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setActivityChooserModel(ActivityChooserModel dataModel) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="304"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setExpandActivityOverflowButtonDrawable(Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="323"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setProvider(ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="347"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActivityChooserModel getDataModel() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="488"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnDismissListener(PopupWindow.OnDismissListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="497"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InnerLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="877"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InnerLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ActivityChooserView.java"
+ line="877"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PermissionCompatDelegate getPermissionCompatDelegate() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="173"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean invalidateOptionsMenu(Activity activity) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="211"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static DragAndDropPermissionsCompat requestDragAndDropPermissions(Activity activity,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="605"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" DragEvent dragEvent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityCompat.java"
+ line="606"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Pair<View, String>... sharedElements) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ActivityOptionsCompat.java"
+ line="206"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RecycleListView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="839"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RecycleListView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="843"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RecycleListView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="843"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable mIcon;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="870"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mTitle;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="872"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View mCustomTitleView;"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="873"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mMessage;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="874"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mPositiveButtonText;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="875"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable mPositiveButtonIcon;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="876"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnClickListener mPositiveButtonListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="877"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mNegativeButtonText;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="878"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable mNegativeButtonIcon;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="879"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnClickListener mNegativeButtonListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="880"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mNeutralButtonText;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="881"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable mNeutralButtonIcon;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="882"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnClickListener mNeutralButtonListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="883"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnCancelListener mOnCancelListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="885"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnDismissListener mOnDismissListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="886"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnKeyListener mOnKeyListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="887"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence[] mItems;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="888"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListAdapter mAdapter;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="889"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnClickListener mOnClickListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="890"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View mView;"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="892"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean[] mCheckedItems;"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="898"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DialogInterface.OnMultiChoiceClickListener mOnCheckboxClickListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="902"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Cursor mCursor;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="903"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String mLabelColumn;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="904"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String mIsCheckedColumn;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="905"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AdapterView.OnItemSelectedListener mOnItemSelectedListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="907"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public OnPrepareListViewListener mOnPrepareListViewListener;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="908"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onPrepareListView(ListView listView);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="921"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AlertParams(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="924"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(AlertController dialog) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertController.java"
+ line="930"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Button getButton(int whichButton) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="130"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListView getListView() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="139"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="144"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomTitle(View customTitleView) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="154"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMessage(CharSequence message) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="163"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="171"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setView(View view, int viewSpacingLeft, int viewSpacingTop, int viewSpacingRight,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="185"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButton(int whichButton, CharSequence text, Message msg) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="210"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButton(int whichButton, CharSequence text, Message msg) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="210"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButton(int whichButton, CharSequence text, OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="225"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButton(int whichButton, CharSequence text, OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="225"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButton(int whichButton, CharSequence text, Drawable icon,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="242"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButton(int whichButton, CharSequence text, Drawable icon,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="242"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="243"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="261"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onCreate(Bundle savedInstanceState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="277"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyDown(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="283"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyUp(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="291"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTitle(@StringRes int titleId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="366"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTitle(@Nullable CharSequence title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="376"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setCustomTitle(@Nullable View customTitleView) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="397"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMessage(@StringRes int messageId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="407"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMessage(@Nullable CharSequence message) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="417"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setIcon(@DrawableRes int iconId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="429"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setIcon(@Nullable Drawable icon) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="444"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setIconAttribute(@AttrRes int attrId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="458"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="472"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButton(@StringRes int textId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="472"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="485"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="485"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="485"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButtonIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="496"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setPositiveButtonIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="496"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButton(@StringRes int textId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="508"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButton(@StringRes int textId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="508"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="521"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="521"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="521"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButtonIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="532"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNegativeButtonIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="532"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButton(@StringRes int textId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="544"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButton(@StringRes int textId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="544"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="557"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="557"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButton(CharSequence text, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="557"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButtonIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="568"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setNeutralButtonIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="568"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setCancelable(boolean cancelable) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="578"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnCancelListener(OnCancelListener onCancelListener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="599"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnCancelListener(OnCancelListener onCancelListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="599"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnDismissListener(OnDismissListener onDismissListener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="609"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnDismissListener(OnDismissListener onDismissListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="609"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnKeyListener(OnKeyListener onKeyListener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="619"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnKeyListener(OnKeyListener onKeyListener) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="619"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setItems(@ArrayRes int itemsId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="630"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setItems(@ArrayRes int itemsId, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="630"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setItems(CharSequence[] items, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="642"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setItems(CharSequence[] items, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="642"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setItems(CharSequence[] items, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="642"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setAdapter(final ListAdapter adapter, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="658"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setAdapter(final ListAdapter adapter, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="658"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setAdapter(final ListAdapter adapter, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="658"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setCursor(final Cursor cursor, final OnClickListener listener,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="676"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setCursor(final Cursor cursor, final OnClickListener listener,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="676"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setCursor(final Cursor cursor, final OnClickListener listener,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="676"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String labelColumn) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="677"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="702"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(@ArrayRes int itemsId, boolean[] checkedItems,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="702"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnMultiChoiceClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="703"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="728"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="728"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(CharSequence[] items, boolean[] checkedItems,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="728"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnMultiChoiceClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="729"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="756"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="756"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="756"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setMultiChoiceItems(Cursor cursor, String isCheckedColumn, String labelColumn,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="756"
+ column="83"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnMultiChoiceClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="757"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(@ArrayRes int itemsId, int checkedItem,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="781"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="782"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="806"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="806"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(Cursor cursor, int checkedItem, String labelColumn,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="806"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="807"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="830"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="830"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(CharSequence[] items, int checkedItem, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="830"
+ column="90"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="852"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="852"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setSingleChoiceItems(ListAdapter adapter, int checkedItem, final OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="852"
+ column="89"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnItemSelectedListener(final AdapterView.OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="867"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setOnItemSelectedListener(final AdapterView.OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="867"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setView(int layoutResId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="880"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setView(View view) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="901"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="901"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setView(View view, int viewSpacingLeft, int viewSpacingTop,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="933"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setView(View view, int viewSpacingLeft, int viewSpacingTop,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="933"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setInverseBackgroundForced(boolean useInverseBackground) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="956"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setRecycleOnMeasureEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="965"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AlertDialog show() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AlertDialog.java"
+ line="1007"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AllCapsTransformationMethod(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="37"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTransformation(CharSequence source, View view) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="42"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTransformation(CharSequence source, View view) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="42"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTransformation(CharSequence source, View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="42"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onFocusChanged(View view, CharSequence sourceText, boolean focused,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="47"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onFocusChanged(View view, CharSequence sourceText, boolean focused,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="47"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int direction, Rect previouslyFocusedRect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/text/AllCapsTransformationMethod.java"
+ line="48"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static AnimatedStateListDrawableCompat createFromXmlInner("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java"
+ line="165"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean onStateChange(int[] stateSet) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java"
+ line="276"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable mutate() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/AnimatedStateListDrawableCompat.java"
+ line="605"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void attachBaseContext(Context newBase) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="138"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="199"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="205"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="205"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="211"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="211"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onTitleChanged(CharSequence title, int color) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="283"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onMenuOpened(int featureId, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="563"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="590"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Resources getResources() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="603"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyDown(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatActivity.java"
+ line="632"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextAppearance(Context context, int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java"
+ line="193"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java"
+ line="201"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatAutoCompleteTextView.java"
+ line="201"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextAppearance(Context context, int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
+ line="179"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
+ line="187"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
+ line="193"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
+ line="218"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int[] getAutoSizeTextAvailableSizes() {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatButton.java"
+ line="352"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onSupportActionModeStarted(ActionMode mode);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatCallback.java"
+ line="35"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onSupportActionModeFinished(ActionMode mode);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatCallback.java"
+ line="42"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatCallback.java"
+ line="54"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButtonDrawable(Drawable buttonDrawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatCheckBox.java"
+ line="104"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract MenuInflater getMenuInflater();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="301"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onCreate(Bundle savedInstanceState);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="315"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onPostCreate(Bundle savedInstanceState);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="320"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onConfigurationChanged(Configuration newConfig);"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="326"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setContentView(View v);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="363"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setContentView(View v, ViewGroup.LayoutParams lp);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="374"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void setContentView(View v, ViewGroup.LayoutParams lp);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="374"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addContentView(View v, ViewGroup.LayoutParams lp);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="380"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void addContentView(View v, ViewGroup.LayoutParams lp);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="380"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void attachBaseContext(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="386"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View createView(@Nullable View parent, String name, @NonNull Context context,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="481"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract View createView(@Nullable View parent, String name, @NonNull Context context,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="481"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onSaveInstanceState(Bundle outState);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDelegate.java"
+ line="503"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AppCompatDialog(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="52"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AppCompatDialog(Context context, int theme) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="56"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatDialog(Context context, boolean cancelable,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="70"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" OnCancelListener cancelListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="71"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onCreate(Bundle savedInstanceState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="76"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBar getSupportActionBar() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="89"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="99"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="104"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="104"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="116"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="128"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addContentView(View view, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="128"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AppCompatDelegate getDelegate() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="175"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSupportActionModeStarted(ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="193"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSupportActionModeFinished(ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="197"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode onWindowStartingSupportActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="202"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatDialog.java"
+ line="212"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static synchronized AppCompatDrawableManager get() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="465"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public synchronized Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="474"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static synchronized PorterDuffColorFilter getPorterDuffColorFilter("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="505"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int color, PorterDuff.Mode mode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatDrawableManager.java"
+ line="506"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextAppearance(Context context, int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
+ line="213"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onDragEvent(@SuppressWarnings("MissingNullability") DragEvent event) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatEditText.java"
+ line="295"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setImageBitmap(Bitmap bm) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatImageButton.java"
+ line="112"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void loadFromAttributes(AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatImageHelper.java"
+ line="52"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setImageBitmap(Bitmap bm) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatImageView.java"
+ line="123"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextAppearance(Context context, int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java"
+ line="191"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java"
+ line="199"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatMultiAutoCompleteTextView.java"
+ line="199"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AppCompatRadioButton(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java"
+ line="65"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AppCompatRadioButton(Context context, @Nullable AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java"
+ line="69"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AppCompatRadioButton(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java"
+ line="73"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setButtonDrawable(Drawable buttonDrawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatRadioButton.java"
+ line="102"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorStateList getColorStateList(@NonNull Context context, @ColorRes int resId) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/content/res/AppCompatResources.java"
+ line="47"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected synchronized void onDraw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSeekBar.java"
+ line="59"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int defStyleAttr, int mode, Resources.Theme popupTheme) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="210"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getPopupContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="310"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPopupBackgroundDrawable(Drawable background) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="315"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getPopupBackground() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="329"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setAdapter(SpinnerAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="403"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="429"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPrompt(CharSequence prompt) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="464"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getPrompt() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="473"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onSaveInstanceState() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="618"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatSpinner.java"
+ line="626"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextAppearance(Context context, int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
+ line="210"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
+ line="269"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int[] getAutoSizeTextAvailableSizes() {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
+ line="430"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
+ line="442"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo outAttrs) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
+ line="442"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/AppCompatTextView.java"
+ line="550"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatTextView createTextView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="200"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatTextView createTextView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="200"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatImageView createImageView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="205"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatImageView createImageView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="205"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatButton createButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="210"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatButton createButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="210"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatEditText createEditText(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="215"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatEditText createEditText(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="215"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatSpinner createSpinner(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="220"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatSpinner createSpinner(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="220"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatImageButton createImageButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="225"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatImageButton createImageButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="225"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatCheckBox createCheckBox(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="230"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatCheckBox createCheckBox(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="230"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatRadioButton createRadioButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="235"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatRadioButton createRadioButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="235"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatCheckedTextView createCheckedTextView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="240"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatCheckedTextView createCheckedTextView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="240"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatAutoCompleteTextView createAutoCompleteTextView(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="245"
+ column="72"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="246"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatMultiAutoCompleteTextView createMultiAutoCompleteTextView(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="251"
+ column="82"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="252"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatRatingBar createRatingBar(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="257"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatRatingBar createRatingBar(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="257"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatSeekBar createSeekBar(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="262"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatSeekBar createSeekBar(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="262"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatToggleButton createToggleButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="267"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected AppCompatToggleButton createToggleButton(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="267"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected View createView(Context context, String name, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="279"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected View createView(Context context, String name, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="279"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected View createView(Context context, String name, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/AppCompatViewInflater.java"
+ line="279"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AutoScrollHelper setEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="235"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AutoScrollHelper setExclusive(boolean exclusive) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="263"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="465"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoScrollHelper.java"
+ line="465"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] getAutoSizeTextAvailableSizes();"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/AutoSizeableTextView.java"
+ line="151"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Context mSystemContext;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="40"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Context mContext;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="41"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder mMenu;"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="42"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutInflater mSystemInflater;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="43"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutInflater mInflater;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="44"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuView mMenuView;"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="50"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public BaseMenuPresenter(Context context, int menuLayoutRes, int itemLayoutRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="61"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initForMenu(Context context, MenuBuilder menu) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="69"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initForMenu(Context context, MenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="69"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuView getMenuView(ViewGroup root) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="76"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuView getMenuView(ViewGroup root) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="76"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void addItemView(View itemView, int childIndex) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="133"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean filterLeftoverView(ViewGroup parent, int childIndex) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="147"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCallback(Callback cb) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="153"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Callback getCallback() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="157"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuView.ItemView createItemView(ViewGroup parent) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="166"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuView.ItemView createItemView(ViewGroup parent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="166"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="181"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="181"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="181"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getItemView(MenuItemImpl item, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="181"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void bindItemView(MenuItemImpl item, MenuView.ItemView itemView);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="198"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void bindItemView(MenuItemImpl item, MenuView.ItemView itemView);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="198"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean shouldIncludeItem(int childIndex, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="207"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="212"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onSubMenuSelected(SubMenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="219"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="233"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="233"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="238"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/BaseMenuPresenter.java"
+ line="238"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="157"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder stereoReset(boolean stereoReset) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="176"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTextDirectionHeuristic(TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="192"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTextDirectionHeuristic(TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="192"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public BidiFormatter build() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="204"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="235"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance(boolean rtlContext) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="244"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance(Locale locale) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="253"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static BidiFormatter getInstance(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="253"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean isRtl(String str) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="346"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean isRtl(CharSequence str) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="357"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="390"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="390"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic, boolean isolate) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="390"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="409"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="409"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="409"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="440"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="440"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="440"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="455"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="455"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, TextDirectionHeuristicCompat heuristic) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="455"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="468"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str, boolean isolate) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="468"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, boolean isolate) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="482"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str, boolean isolate) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="482"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="493"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String unicodeWrap(String str) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="493"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="505"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence unicodeWrap(CharSequence str) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/BidiFormatter.java"
+ line="505"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onStateChanged(int[] stateSet) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ComplexColorCompat.java"
+ line="107"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void putExtraData(ExtraData extraData) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="78"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T extends ExtraData> T getExtraData(Class<T> extraDataClass) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="106"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean superDispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="121"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyShortcutEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="126"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/ComponentActivity.java"
+ line="135"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dispatchFitSystemWindows(Rect insets) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="77"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setAttachListener(OnAttachListener attachListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="81"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue getMinWidthMajor() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="176"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue getMinWidthMinor() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="181"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue getFixedWidthMajor() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="186"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue getFixedWidthMinor() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="191"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue getFixedHeightMajor() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="196"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue getFixedHeightMinor() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ContentFrameLayout.java"
+ line="201"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Cursor query(ContentResolver resolver,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="71"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Cursor query(ContentResolver resolver,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="71"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Uri uri, String[] projection, String selection, String[] selectionArgs,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="72"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String sortOrder, CancellationSignal cancellationSignal) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="73"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String sortOrder, CancellationSignal cancellationSignal) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/ContentResolverCompat.java"
+ line="73"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextThemeWrapper(Context base, @StyleRes int themeResId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="62"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextThemeWrapper(Context base, Resources.Theme theme) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="76"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextThemeWrapper(Context base, Resources.Theme theme) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="76"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void attachBaseContext(Context newBase) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="82"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void applyOverrideConfiguration(Configuration overrideConfiguration) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="96"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Resources getResources() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="108"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Resources.Theme getTheme() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="146"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getSystemService(String name) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="160"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getSystemService(String name) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="160"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onApplyThemeResource(Resources.Theme theme, int resid, boolean first) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="181"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AssetManager getAssets() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ContextThemeWrapper.java"
+ line="198"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Object getWrapper();"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/CoreComponentFactory.java"
+ line="118"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String concatenateWhere(String a, String b) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="40"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String concatenateWhere(String a, String b) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="40"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String concatenateWhere(String a, String b) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="40"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="59"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="59"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String[] appendSelectionArgs(String[] originalValues, String[] newValues) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/database/DatabaseUtilsCompat.java"
+ line="59"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void buildShortClassTag(Object cls, StringBuilder out) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/DebugUtils.java"
+ line="31"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void buildShortClassTag(Object cls, StringBuilder out) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/DebugUtils.java"
+ line="31"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setWindowCallback(Window.Callback cb);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="39"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setWindowTitle(CharSequence title);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="40"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getTitle();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="41"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setIcon(Drawable d);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="47"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setMenu(Menu menu, MenuPresenter.Callback cb);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="55"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setMenu(Menu menu, MenuPresenter.Callback cb);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="55"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void saveToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="56"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void restoreToolbarHierarchyState(SparseArray<Parcelable> toolbarStates);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorContentParent.java"
+ line="57"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewGroup getViewGroup();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="47"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context getContext();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="48"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setWindowCallback(Window.Callback cb);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="51"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setWindowTitle(CharSequence title);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="52"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getTitle();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="53"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setTitle(CharSequence title);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="54"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getSubtitle();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="55"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setSubtitle(CharSequence subtitle);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="56"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setIcon(Drawable d);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="62"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setLogo(Drawable d);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="64"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setMenu(Menu menu, MenuPresenter.Callback cb);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="71"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setMenu(Menu menu, MenuPresenter.Callback cb);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="71"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setEmbeddedTabView(ScrollingTabContainerView tabView);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="76"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setDropdownParams(SpinnerAdapter adapter, AdapterView.OnItemSelectedListener listener);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="83"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setDropdownParams(SpinnerAdapter adapter, AdapterView.OnItemSelectedListener listener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="83"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setCustomView(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="87"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View getCustomView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="88"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewPropertyAnimatorCompat setupAnimatorToVisibility(int visibility, long duration);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="90"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setNavigationIcon(Drawable icon);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="91"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setNavigationContentDescription(CharSequence description);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="93"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setDefaultNavigationIcon(Drawable icon);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="96"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void saveHierarchyState(SparseArray<Parcelable> toolbarStates);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="97"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void restoreHierarchyState(SparseArray<Parcelable> toolbarStates);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="98"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setBackgroundDrawable(Drawable d);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="99"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setMenuCallbacks(MenuPresenter.Callback presenterCallback,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="103"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuBuilder.Callback menuBuilderCallback);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="104"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Menu getMenu();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DecorToolbar.java"
+ line="105"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DisplayCutoutCompat(Rect safeInsets, List<Rect> boundingRects) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+ line="55"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DisplayCutoutCompat(Rect safeInsets, List<Rect> boundingRects) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DisplayCutoutCompat.java"
+ line="55"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static DragAndDropPermissionsCompat request(Activity activity, DragEvent dragEvent) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
+ line="49"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static DragAndDropPermissionsCompat request(Activity activity, DragEvent dragEvent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragAndDropPermissionsCompat.java"
+ line="49"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onDragStart(View v, DragStartHelper helper);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="87"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onDragStart(View v, DragStartHelper helper);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="87"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DragStartHelper(View view, OnDragStartListener listener) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="96"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DragStartHelper(View view, OnDragStartListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="96"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="128"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="128"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onLongClick(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="169"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void getTouchPosition(Point point) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/DragStartHelper.java"
+ line="177"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorFilter getColorFilter(@NonNull Drawable drawable) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+ line="209"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Drawable wrap(@NonNull Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/DrawableCompat.java"
+ line="306"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PorterDuff.Mode parseTintMode(int value, PorterDuff.Mode defaultMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"
+ line="159"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PorterDuff.Mode parseTintMode(int value, PorterDuff.Mode defaultMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/DrawableUtils.java"
+ line="159"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DrawableWrapper(Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="46"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="51"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onBoundsChange(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="56"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setColorFilter(ColorFilter cf) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="87"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean setState(final int[] stateSet) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="97"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int[] getState() {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="102"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getCurrent() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="112"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Region getTransparentRegion() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="128"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean getPadding(Rect padding) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="153"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void invalidateDrawable(Drawable who) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="161"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void scheduleDrawable(Drawable who, Runnable what, long when) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="169"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void scheduleDrawable(Drawable who, Runnable what, long when) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="169"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void unscheduleDrawable(Drawable who, Runnable what) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="177"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void unscheduleDrawable(Drawable who, Runnable what) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="177"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTintList(ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="202"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTintMode(PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="207"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getWrappedDrawable() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="221"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setWrappedDrawable(Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawableWrapper.java"
+ line="225"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DrawerArrowDrawable(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java"
+ line="128"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java"
+ line="325"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setColorFilter(ColorFilter colorFilter) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java"
+ line="412"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public final Paint getPaint() {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/graphics/drawable/DrawerArrowDrawable.java"
+ line="457"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public EdgeEffectCompat(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="53"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="294"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ExpandedMenuView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="52"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ExpandedMenuView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="52"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ExpandedMenuView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="56"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ExpandedMenuView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="56"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initialize(MenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="72"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean invokeItem(MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="85"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemClick(AdapterView parent, View v, int position, long id) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="91"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemClick(AdapterView parent, View v, int position, long id) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ExpandedMenuView.java"
+ line="91"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Uri getUriForFile(@NonNull Context context, @NonNull String authority,"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="439"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Cursor query(@NonNull Uri uri, @Nullable String[] projection, @Nullable String selection,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="504"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getType(@NonNull Uri uri) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="546"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Uri insert(@NonNull Uri uri, ContentValues values) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="567"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Uri insert(@NonNull Uri uri, ContentValues values) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="567"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int update(@NonNull Uri uri, ContentValues values, @Nullable String selection,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/FileProvider.java"
+ line="576"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AuthenticationResult(CryptoObject crypto) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="251"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CryptoObject getCryptoObject() { return mCryptoObject; }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="260"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAuthenticationError(int errMsgId, CharSequence errString) { }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="277"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAuthenticationHelp(int helpMsgId, CharSequence helpString) { }"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="286"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAuthenticationSucceeded(AuthenticationResult result) { }"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/hardware/fingerprint/FingerprintManagerCompat.java"
+ line="292"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java"
+ line="47"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean fitSystemWindows(Rect insets) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/FitWindowsFrameLayout.java"
+ line="52"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java"
+ line="47"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean fitSystemWindows(Rect insets) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/FitWindowsLinearLayout.java"
+ line="52"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onFitSystemWindows(Rect insets);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/FitWindowsViewGroup.java"
+ line="32"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setOnFitSystemWindowsListener(OnFitSystemWindowsListener listener);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/FitWindowsViewGroup.java"
+ line="35"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getIdentifier() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontRequest.java"
+ line="156"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static @Nullable FamilyResourceEntry parse(XmlPullParser parser, Resources resources)"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="181"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static @Nullable FamilyResourceEntry parse(XmlPullParser parser, Resources resources)"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="181"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<List<byte[]>> readCerts(Resources resources, @ArrayRes int certsId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="269"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static List<List<byte[]>> readCerts(Resources resources, @ArrayRes int certsId) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/FontResourcesParserCompat.java"
+ line="269"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public FontInfo[] getFonts() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="399"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onTypefaceRetrieved(Typeface typeface) {}"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="486"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Typeface getFontSync("
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="543"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="544"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final FontRequest request,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="545"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Map<Uri, ByteBuffer> prepareFontData("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="588"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="589"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontInfo[] fonts,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="590"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CancellationSignal cancellationSignal"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/FontsContractCompat.java"
+ line="591"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ForwardingListener(View src) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ForwardingListener.java"
+ line="68"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract ShowableListMenu getPopup();"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ForwardingListener.java"
+ line="90"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ForwardingListener.java"
+ line="93"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouch(View v, MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ForwardingListener.java"
+ line="93"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onViewAttachedToWindow(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ForwardingListener.java"
+ line="116"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onViewDetachedFromWindow(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ForwardingListener.java"
+ line="120"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="505"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="505"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="519"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="519"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public GestureDetectorCompat(Context context, OnGestureListener listener, Handler handler) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="519"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="542"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnDoubleTapListener(OnDoubleTapListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GestureDetectorCompat.java"
+ line="566"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void apply(int gravity, int w, int h, Rect container,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="62"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Rect outRect, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="63"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void apply(int gravity, int w, int h, Rect container,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="96"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int xAdj, int yAdj, Rect outRect, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="97"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void applyDisplay(int gravity, Rect display, Rect inoutObj, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="125"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void applyDisplay(int gravity, Rect display, Rect inoutObj, int layoutDirection) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/GravityCompat.java"
+ line="125"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static String maximizeAndGetScript(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/ICUCompat.java"
+ line="88"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public byte[] mData = null;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="176"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable mParcelable = null;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="182"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList mTintList = null;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="206"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String mTintModeStr = null;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="216"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String mString1;"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="223"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Context context, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="232"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Context context, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="232"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="243"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="243"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithResource(Resources r, String pkg, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="243"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="270"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="270"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="285"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithAdaptiveBitmap(Bitmap bits) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="285"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithData(byte[] data, int offset, int length) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="303"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithData(byte[] data, int offset, int length) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="303"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(String uri) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="320"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(String uri) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="320"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(Uri uri) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="335"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static IconCompat createWithContentUri(Uri uri) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="335"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTint(@ColorInt int tint) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="496"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintList(ColorStateList tintList) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="506"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintList(ColorStateList tintList) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="506"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintMode(PorterDuff.Mode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="517"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat setTintMode(PorterDuff.Mode mode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/IconCompat.java"
+ line="517"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IBinder onBind(@NonNull Intent intent) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/JobIntentService.java"
+ line="468"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean superDispatchKeyEvent(KeyEvent event);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/KeyEventDispatcher.java"
+ line="191"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LayoutInflaterFactory getFactory(LayoutInflater inflater) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterCompat.java"
+ line="169"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LayoutInflaterFactory getFactory(LayoutInflater inflater) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterCompat.java"
+ line="169"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View onCreateView(View parent, String name, Context context, AttributeSet attrs);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/LayoutInflaterFactory.java"
+ line="46"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getDividerDrawable() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="239"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setDividerDrawable(Drawable divider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="250"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onDraw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="302"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1750"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1750"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateDefaultLayoutParams() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1763"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1773"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1773"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1780"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1785"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1791"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(Context c, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1804"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(Context c, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1804"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1832"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(ViewGroup.MarginLayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/LinearLayoutCompat.java"
+ line="1839"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListMenuItemView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="73"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListMenuItemView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="73"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="77"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListMenuItemView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="77"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initialize(MenuItemImpl itemData, int menuType) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="123"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="154"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItemImpl getItemData() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="165"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="255"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void adjustListItemSelectionBounds(Rect rect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuItemView.java"
+ line="346"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListMenuPresenter(Context context, int itemLayoutRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="70"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initForMenu(Context context, MenuBuilder menu) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="87"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void initForMenu(Context context, MenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="87"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuView getMenuView(ViewGroup root) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="104"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuView getMenuView(ViewGroup root) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="104"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListAdapter getAdapter() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="124"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCallback(Callback cb) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="137"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onSubMenuSelected(SubMenuBuilder subMenu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="142"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="154"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemClick(AdapterView<?> parent, View view, int position, long id) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="172"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemClick(AdapterView<?> parent, View view, int position, long id) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="172"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="182"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="182"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="187"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="187"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void saveHierarchyState(Bundle outState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="191"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void restoreHierarchyState(Bundle inState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="199"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onSaveInstanceState() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="216"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ListMenuPresenter.java"
+ line="227"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setListSelector(Drawable selector) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ListPopupWindow.java"
+ line="416"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public OnTouchListener createDragToOpenListener(View src) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ListPopupWindow.java"
+ line="1140"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public OnTouchListener createDragToOpenListener(View src) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ListPopupWindow.java"
+ line="1140"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+ line="64"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+ line="64"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static OnTouchListener createDragToOpenListener(Object listPopupWindow, View src) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ListPopupWindowCompat.java"
+ line="64"
+ column="84"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LocaleListCompat wrap(Object localeList) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="45"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static LocaleListCompat wrap(Object localeList) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="45"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Locale get(int index) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="85"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int indexOf(Locale locale) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/LocaleListCompat.java"
+ line="116"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LogWriter(String tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LogWriter.java"
+ line="43"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" @Override public void write(char[] buf, int offset, int count) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/LogWriter.java"
+ line="55"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMarginStart(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="41"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMarginEnd(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="60"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMarginStart(ViewGroup.MarginLayoutParams lp, int marginStart) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="79"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMarginEnd(ViewGroup.MarginLayoutParams lp, int marginEnd) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="98"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isMarginRelative(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="111"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getLayoutDirection(ViewGroup.MarginLayoutParams lp) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="125"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setLayoutDirection(ViewGroup.MarginLayoutParams lp, int layoutDirection) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="149"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void resolveLayoutDirection(ViewGroup.MarginLayoutParams lp,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MarginLayoutParamsCompat.java"
+ line="159"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuAdapter(MenuBuilder menu, LayoutInflater inflater, boolean overflowOnly,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="43"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuAdapter(MenuBuilder menu, LayoutInflater inflater, boolean overflowOnly,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="43"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuBuilder getAdapterMenu() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="70"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItemImpl getItem(int position) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="75"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getView(int position, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="92"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getView(int position, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="92"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getView(int position, View convertView, ViewGroup parent) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuAdapter.java"
+ line="92"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean invokeItem(MenuItemImpl item);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="220"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuBuilder(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="223"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuBuilder setDefaultShowAsAction(int defaultShowAsAction) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="238"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addMenuPresenter(MenuPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="249"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addMenuPresenter(MenuPresenter presenter, Context menuContext) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="262"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addMenuPresenter(MenuPresenter presenter, Context menuContext) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="262"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeMenuPresenter(MenuPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="274"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void savePresenterStates(Bundle outState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="364"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void restorePresenterStates(Bundle state) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="368"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void saveActionViewStates(Bundle outStates) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="372"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void restoreActionViewStates(Bundle states) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="399"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected String getActionViewStatesKey() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="429"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCallback(Callback cb) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="433"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="440"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuItem addInternal(int group, int id, int categoryOrder, CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="440"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="465"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="465"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int titleRes) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="470"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int group, int id, int categoryOrder, CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="475"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int group, int id, int categoryOrder, CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="475"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int group, int id, int categoryOrder, int title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="480"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(CharSequence title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="485"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="485"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int titleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="490"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="495"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int group, int id, int categoryOrder, CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="495"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int group, int id, int categoryOrder, int title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="504"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int addIntentOptions(int group, int id, int categoryOrder, ComponentName caller,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="518"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="519"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="519"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="519"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem findItem(int id) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="692"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem getItem(int index) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="751"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean isShortcutKey(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="756"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="829"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performShortcut(int keyCode, KeyEvent event, int flags) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="858"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performItemAction(MenuItem item, int flags) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="974"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performItemAction(MenuItem item, MenuPresenter preferredPresenter, int flags) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="978"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performItemAction(MenuItem item, MenuPresenter preferredPresenter, int flags) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="978"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ArrayList<MenuItemImpl> getActionItems() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1202"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ArrayList<MenuItemImpl> getNonActionItems() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1207"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderTitleInt(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1258"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderTitleInt(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1258"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderTitleInt(int titleRes) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1270"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderIconInt(Drawable icon) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1282"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderIconInt(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1282"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderIconInt(int iconRes) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1294"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderViewInt(View view) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1306"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected MenuBuilder setHeaderViewInt(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1306"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getHeaderTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1311"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getHeaderIcon() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1315"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getHeaderView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1319"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuBuilder getRootMenu() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1327"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCurrentMenuInfo(ContextMenu.ContextMenuInfo menuInfo) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1338"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean expandItemActionView(MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1350"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean collapseItemActionView(MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1372"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItemImpl getExpandedItem() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuBuilder.java"
+ line="1394"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setShowAsAction(MenuItem item, int actionEnum) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuCompat.java"
+ line="35"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setGroupDividerEnabled(Menu menu, boolean enabled) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuCompat.java"
+ line="45"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onMenuItemActionExpand(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="109"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onMenuItemActionCollapse(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="118"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setShowAsAction(MenuItem item, int actionEnum) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="134"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, View view) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="152"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, View view) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="152"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="152"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="174"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionView(MenuItem item, int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="174"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static View getActionView(MenuItem item) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="187"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static View getActionView(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="187"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionProvider(MenuItem item, ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="206"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionProvider(MenuItem item, ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="206"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setActionProvider(MenuItem item, ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="206"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ActionProvider getActionProvider(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="223"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ActionProvider getActionProvider(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="223"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean expandActionView(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="248"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean collapseActionView(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="267"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isActionViewExpanded(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="283"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setOnActionExpandListener(MenuItem item,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="300"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static MenuItem setOnActionExpandListener(MenuItem item,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="300"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="301"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setContentDescription(MenuItem item, CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="321"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setContentDescription(MenuItem item, CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="321"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getContentDescription(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="334"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getContentDescription(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="334"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTooltipText(MenuItem item, CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="350"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTooltipText(MenuItem item, CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="350"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getTooltipText(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="363"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static CharSequence getTooltipText(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="363"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setShortcut(MenuItem item, char numericChar, char alphaChar,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="395"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setNumericShortcut(MenuItem item, char numericChar, int numericModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="417"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getNumericModifiers(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="435"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setAlphabeticShortcut(MenuItem item, char alphaChar, int alphaModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="462"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getAlphabeticModifiers(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="480"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintList(MenuItem item, ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="502"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintList(MenuItem item, ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="502"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorStateList getIconTintList(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="514"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ColorStateList getIconTintList(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="514"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="533"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setIconTintMode(MenuItem item, PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="533"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PorterDuff.Mode getIconTintMode(MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="547"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PorterDuff.Mode getIconTintMode(MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MenuItemCompat.java"
+ line="547"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="189"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Intent getIntent() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="222"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="227"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="227"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setCallback(Runnable callback) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="236"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setCallback(Runnable callback) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="236"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="247"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="260"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="289"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar, int numericModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="302"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="316"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="326"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu getSubMenu() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="418"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubMenu(SubMenuBuilder subMenu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="427"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="435"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="452"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="452"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(int title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="465"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitleCondensed() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="470"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="485"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="485"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getIcon() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="499"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="515"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="515"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(int iconResId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="525"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintList(@Nullable ColorStateList iconTintList) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="538"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList getIconTintList() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="549"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="554"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintMode(PorterDuff.Mode iconTintMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="554"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PorterDuff.Mode getIconTintMode() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="565"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setCheckable(boolean checkable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="594"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setChecked(boolean checked) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="618"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setVisible(boolean shown) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="661"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="671"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(MenuItem.OnMenuItemClickListener clickListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="671"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextMenuInfo getMenuInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="686"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setActionView(View view) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="750"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setActionView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="750"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setActionView(int resId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="761"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getActionView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="769"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(android.view.ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="781"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(android.view.ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="781"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionProvider getActionProvider() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="787"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionProvider getSupportActionProvider() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="793"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="798"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setSupportActionProvider(ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="798"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setShowAsActionFlags(int actionEnum) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="817"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="875"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="875"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="881"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="881"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="890"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setTooltipText(CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="895"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuItem setTooltipText(CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="895"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTooltipText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemImpl.java"
+ line="904"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItemWrapperICS(Context context, SupportMenuItem object) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="55"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItemWrapperICS(Context context, SupportMenuItem object) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="55"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="79"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="79"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(int title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="85"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="91"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="96"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="96"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitleCondensed() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="102"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="107"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="107"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(int iconRes) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="113"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getIcon() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="119"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="124"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="124"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Intent getIntent() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="130"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="135"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="141"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="148"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar, int numericModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="154"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="170"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="176"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setCheckable(boolean checkable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="192"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setChecked(boolean checked) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="203"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setVisible(boolean visible) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="214"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="224"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu getSubMenu() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="240"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="245"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="245"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextMenu.ContextMenuInfo getMenuInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="252"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShowAsActionFlags(int actionEnum) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="262"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionView(View view) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="268"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="268"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionView(int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="277"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getActionView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="290"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(android.view.ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="299"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(android.view.ActionProvider provider) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="299"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public android.view.ActionProvider getActionProvider() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="311"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="335"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(MenuItem.OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="335"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="342"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setContentDescription(CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="342"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="348"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTooltipText(CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="353"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTooltipText(CharSequence tooltipText) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="353"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTooltipText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="359"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintList(ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="364"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintList(ColorStateList tint) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="364"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList getIconTintList() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="370"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintMode(PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="375"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIconTintMode(PorterDuff.Mode tintMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="375"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PorterDuff.Mode getIconTintMode() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuItemWrapperICS.java"
+ line="381"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ListView getListView() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPopupHelper.java"
+ line="350"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setEnterTransition(Object enterTransition) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="85"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setExitTransition(Object exitTransition) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="91"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setHoverListener(MenuItemHoverListener hoverListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="97"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuDropDownListView(Context context, boolean hijackFocus) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="146"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setHoverListener(MenuItemHoverListener hoverListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="161"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyDown(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="170"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onHoverEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/MenuPopupWindow.java"
+ line="199"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void initForMenu(Context context, MenuBuilder menu);"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="70"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void initForMenu(Context context, MenuBuilder menu);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="70"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuView getMenuView(ViewGroup root);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="79"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuView getMenuView(ViewGroup root);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="79"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setCallback(Callback cb);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="94"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onSubMenuSelected(SubMenuBuilder subMenu);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="104"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="116"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="131"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean expandItemActionView(MenuBuilder menu, MenuItemImpl item);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="131"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="140"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean collapseItemActionView(MenuBuilder menu, MenuItemImpl item);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="140"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Parcelable onSaveInstanceState();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="154"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onRestoreInstanceState(Parcelable state);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuPresenter.java"
+ line="160"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void initialize(MenuBuilder menu);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuView.java"
+ line="39"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void initialize(MenuItemImpl itemData, int menuType);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuView.java"
+ line="60"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItemImpl getItemData();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuView.java"
+ line="66"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setTitle(CharSequence title);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuView.java"
+ line="72"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setIcon(Drawable icon);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuView.java"
+ line="106"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuWrapperICS(Context context, SupportMenu object) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="40"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuWrapperICS(Context context, SupportMenu object) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="40"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="49"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="49"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int titleRes) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="54"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int groupId, int itemId, int order, CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="59"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int groupId, int itemId, int order, CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="59"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem add(int groupId, int itemId, int order, int titleRes) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="64"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(CharSequence title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="69"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="69"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int titleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="74"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="79"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int groupId, int itemId, int order, CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="79"
+ column="67"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu addSubMenu(int groupId, int itemId, int order, int titleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="84"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int addIntentOptions(int groupId, int itemId, int order, ComponentName caller,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="90"
+ column="69"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="91"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="91"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent[] specifics, Intent intent, int flags, MenuItem[] outSpecificItems) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="91"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem findItem(int id) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="148"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem getItem(int index) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="158"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean performShortcut(int keyCode, KeyEvent event, int flags) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="168"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean isShortcutKey(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/MenuWrapperICS.java"
+ line="173"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getActionMasked(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="464"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getActionIndex(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="476"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int findPointerIndex(MotionEvent event, int pointerId) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="487"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getPointerId(MotionEvent event, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="498"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getX(MotionEvent event, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="509"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getY(MotionEvent event, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="520"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getPointerCount(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="531"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getSource(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="543"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isFromSource(MotionEvent event, int source) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="552"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getAxisValue(MotionEvent event, int axis) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="569"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getAxisValue(MotionEvent event, int axis, int pointerIndex) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="589"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getButtonState(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/MotionEventCompat.java"
+ line="598"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onScrollChange(NestedScrollView v, int scrollX, int scrollY,"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="99"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int dyUnconsumed, int[] offsetInWindow, int type) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="262"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow,"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="268"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow,"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="268"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int dyUnconsumed, int[] offsetInWindow) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="302"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="308"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchNestedPreScroll(int dx, int dy, int[] consumed, int[] offsetInWindow) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="308"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="487"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="496"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="505"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="505"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="514"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="514"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="635"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onInterceptTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="732"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="844"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onGenericMotionEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1067"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void measureChild(View child, int parentWidthMeasureSpec,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1630"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void measureChildWithMargins(View child, int parentWidthMeasureSpec, int widthUsed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1646"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected int computeScrollDeltaToGetChildRectOnScreen(Rect rect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1814"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void requestChildFocus(View child, View focused) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1880"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void requestChildFocus(View child, View focused) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1880"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Rect previouslyFocusedRect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1900"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean requestChildRectangleOnScreen(View child, Rect rectangle,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1927"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean requestChildRectangleOnScreen(View child, Rect rectangle,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="1927"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="2072"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="2151"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Parcelable onSaveInstanceState() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/NestedScrollView.java"
+ line="2164"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Notification.Builder getBuilder();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationBuilderWithBuilderAccessor.java"
+ line="34"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context mContext;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="882"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ArrayList<Action> mActions = new ArrayList<>();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="886"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ArrayList<String> mPeople;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="948"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews getContentView() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2435"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews getBigContentView() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2443"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews getHeadsUpContentView() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2451"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Builder mBuilder;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2519"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2565"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2581"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2581"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2589"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2589"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2597"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2597"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Bitmap createColoredBitmap(int iconId, int color) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2908"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void buildIntoRemoteViews(RemoteViews outerView,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2958"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" RemoteViews innerView) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="2959"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="3083"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="3278"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="3622"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4182"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void apply(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4283"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4294"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4294"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4311"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeBigContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4311"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4332"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public RemoteViews makeHeadsUpContentView(NotificationBuilderWithBuilderAccessor builder) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4332"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence title;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4516"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PendingIntent actionIntent;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompat.java"
+ line="4521"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IBinder onBind(Intent intent) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IBinder onBind(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="47"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void notify(String packageName, int id, String tag, Notification notification);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="62"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void notify(String packageName, int id, String tag, Notification notification);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="62"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void notify(String packageName, int id, String tag, Notification notification);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="62"
+ column="73"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void cancel(String packageName, int id, String tag);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="67"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void cancel(String packageName, int id, String tag);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="67"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void cancelAll(String packageName);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/NotificationCompatSideChannelService.java"
+ line="72"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OnApplyWindowInsetsListener.java"
+ line="42"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OnApplyWindowInsetsListener.java"
+ line="42"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WindowInsetsCompat onApplyWindowInsets(View v, WindowInsetsCompat insets);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OnApplyWindowInsetsListener.java"
+ line="42"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onViewAttachedToWindow(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OneShotPreDrawListener.java"
+ line="89"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onViewDetachedFromWindow(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/OneShotPreDrawListener.java"
+ line="94"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static <T> Parcelable.Creator<T> newCreator("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompat.java"
+ line="39"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ParcelableCompatCreatorCallbacks<T> callbacks) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompat.java"
+ line="40"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" T createFromParcel(Parcel in, ClassLoader loader);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
+ line="40"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" T createFromParcel(Parcel in, ClassLoader loader);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
+ line="40"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" T[] newArray(int size);"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/os/ParcelableCompatCreatorCallbacks.java"
+ line="49"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(Path path) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="47"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(Path path) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="47"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(float controlX, float controlY) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="62"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Interpolator create(float controlX1, float controlY1,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/animation/PathInterpolatorCompat.java"
+ line="79"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Path createPathFromPathData(String pathData) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="72"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Path createPathFromPathData(String pathData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="72"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] createNodesFromPathData(String pathData) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="90"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] createNodesFromPathData(String pathData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="90"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="119"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PathDataNode[] deepCopyNodes(PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="119"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="162"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void updateNodes(PathDataNode[] target, PathDataNode[] source) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="162"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean interpolatePathDataNodes(PathDataNode[] target, PathDataNode[] from,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="313"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean interpolatePathDataNodes(PathDataNode[] target, PathDataNode[] from,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="313"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" PathDataNode[] to, float fraction) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="314"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public float[] mParams;"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="350"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void nodesToPath(PathDataNode[] node, Path path) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="368"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void nodesToPath(PathDataNode[] node, Path path) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="368"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void interpolatePathDataNode(PathDataNode nodeFrom, PathDataNode nodeTo,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="386"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void interpolatePathDataNode(PathDataNode nodeFrom, PathDataNode nodeTo,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/PathParser.java"
+ line="386"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getPointerIcon() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="115"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat getSystemIcon(Context context, int style) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="129"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat getSystemIcon(Context context, int style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="129"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat create(Bitmap bitmap, float hotSpotX, float hotSpotY) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="150"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat create(Bitmap bitmap, float hotSpotX, float hotSpotY) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="150"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat load(Resources resources, int resourceId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="179"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PointerIconCompat load(Resources resources, int resourceId) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/PointerIconCompat.java"
+ line="179"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onMenuItemClick(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/PopupMenu.java"
+ line="295"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onDismiss(PopupMenu menu);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/PopupMenu.java"
+ line="307"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setBreakStrategy(int strategy) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="143"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setHyphenationFrequency(int frequency) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="161"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setTextDirection(@NonNull TextDirectionHeuristic textDir) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="179"
+ column="20"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static PrecomputedTextCompat create(@NonNull CharSequence text, @NonNull Params params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="428"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Future<PrecomputedTextCompat> getTextFuture("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="644"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSpan(Object what, int start, int end, int flags) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="670"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeSpan(Object what) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="686"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> T[] getSpans(int start, int end, Class<T> type) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="704"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> T[] getSpans(int start, int end, Class<T> type) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="704"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getSpanStart(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="714"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getSpanEnd(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="719"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getSpanFlags(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="724"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int nextSpanTransition(int start, int limit, Class type) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="729"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence subSequence(int start, int end) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/PrecomputedTextCompat.java"
+ line="749"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat mIcon;"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mTitle;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="53"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence mContentDescription;"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="59"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PendingIntent mActionIntent;"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteActionCompat.java"
+ line="65"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getResultKey() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="115"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getLabel() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="122"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence[] getChoices() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="129"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Set<String> getAllowedDataTypes() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="133"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Bundle getExtras() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="170"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Map<String, Uri> getDataResultsFromIntent("
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="336"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent intent, String remoteInputResultKey) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="337"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Intent intent, String remoteInputResultKey) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="337"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Bundle getResultsFromIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="375"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Bundle getResultsFromIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="375"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="400"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addResultsToIntent(RemoteInput[] remoteInputs, Intent intent,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="400"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Bundle results) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="401"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addDataResultToIntent(RemoteInput remoteInput, Intent intent,"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="464"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void addDataResultToIntent(RemoteInput remoteInput, Intent intent,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="464"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Map<String, Uri> results) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/RemoteInput.java"
+ line="465"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static synchronized ResourceManagerInternal get() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="96"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public synchronized void setHooks(ResourceManagerHooks hooks) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="131"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public synchronized Drawable getDrawable(@NonNull Context context, @DrawableRes int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="135"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static synchronized PorterDuffColorFilter getPorterDuffColorFilter("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="471"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int color, PorterDuff.Mode mode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ResourceManagerInternal.java"
+ line="472"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public final void callbackSuccessAsync(final Typeface typeface, @Nullable Handler handler) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="433"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="502"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Typeface getFont(@NonNull Context context, @FontRes int id, TypedValue value,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/ResourcesCompat.java"
+ line="502"
+ column="79"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ResultReceiver(Handler handler) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="83"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void send(int resultCode, Bundle resultData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="95"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onReceiveResult(int resultCode, Bundle resultData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="120"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void writeToParcel(Parcel out, int flags) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/android/support/v4/os/ResultReceiver.java"
+ line="129"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setColorFilter(ColorFilter cf) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="288"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorFilter getColorFilter() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="294"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onBoundsChange(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/RoundedBitmapDrawable.java"
+ line="344"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setQuickScaleEnabled(Object scaleGestureDetector, boolean enabled) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="39"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ScaleGestureDetector scaleGestureDetector, boolean enabled) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="52"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isQuickScaleEnabled(Object scaleGestureDetector) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="67"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isQuickScaleEnabled(ScaleGestureDetector scaleGestureDetector) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ScaleGestureDetectorCompat.java"
+ line="77"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="40"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="40"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context, Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="48"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context, Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="48"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ScrollerCompat create(Context context, Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/ScrollerCompat.java"
+ line="48"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected ViewPropertyAnimator mVisibilityAnim;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="75"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onConfigurationChanged(Configuration newConfig) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="225"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addTab(ActionBar.Tab tab, boolean setSelected) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="310"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addTab(ActionBar.Tab tab, int position, boolean setSelected) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="325"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="371"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemSelected(AdapterView<?> adapterView, View view, int position, long id) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="371"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onNothingSelected(AdapterView<?> adapterView) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ScrollingTabContainerView.java"
+ line="377"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onQueryTextSubmit(String query);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="217"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean onQueryTextChange(String newText);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="227"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSearchableInfo(SearchableInfo searchable) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="408"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setAppSearchData(Bundle appSearchData) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="431"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean requestFocus(int direction, Rect previouslyFocusedRect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="482"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnQueryTextListener(OnQueryTextListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="514"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnCloseListener(OnCloseListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="523"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnQueryTextFocusChangeListener(OnFocusChangeListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="532"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnSuggestionListener(OnSuggestionListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="541"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnSearchClickListener(OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="553"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getQuery() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="562"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setQuery(CharSequence query, boolean submit) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="574"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSuggestionsAdapter(CursorAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="750"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CursorAdapter getSuggestionsAdapter() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="760"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Parcelable onSaveInstanceState() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1351"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1359"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SearchAutoComplete(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1848"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SearchAutoComplete(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1852"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SearchAutoComplete(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1852"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1856"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SearchAutoComplete(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1856"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void replaceText(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1891"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1927"
+ column="71"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyPreIme(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1942"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo editorInfo) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1989"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public InputConnection onCreateInputConnection(EditorInfo editorInfo) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SearchView.java"
+ line="1989"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" String threadName, int priority, int destructAfterMillisec) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="83"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> void postAndReply(final Callable<T> callable, final ReplyCallback<T> reply) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="140"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> void postAndReply(final Callable<T> callable, final ReplyCallback<T> reply) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="140"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public <T> T postAndWait(final Callable<T> callable, int timeoutMillis)"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/provider/SelfDestructiveThread.java"
+ line="169"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onShareTargetSelected(ShareActionProvider source, Intent intent);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="153"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onShareTargetSelected(ShareActionProvider source, Intent intent);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="153"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ShareActionProvider(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="196"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnShareTargetSelectedListener(OnShareTargetSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="211"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateActionView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="220"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPrepareSubMenu(SubMenu subMenu) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="256"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setShareHistoryFileName(String shareHistoryFile) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="320"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setShareIntent(Intent shareIntent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ShareActionProvider.java"
+ line="341"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSharedElementStart(List<String> sharedElementNames,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="77"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="78"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="78"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSharedElementEnd(List<String> sharedElementNames,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="108"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="109"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, List<View> sharedElementSnapshots) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="109"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onRejectSharedElements(List<View> rejectedSharedElements) {}"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="133"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="144"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {}"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="144"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="166"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="166"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Parcelable onCaptureSharedElementSnapshot(View sharedElement, Matrix viewToGlobalMatrix,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="166"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" RectF screenBounds) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="167"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateSnapshotView(Context context, Parcelable snapshot) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="256"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateSnapshotView(Context context, Parcelable snapshot) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="256"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreateSnapshotView(Context context, Parcelable snapshot) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="256"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSharedElementsArrived(List<String> sharedElementNames,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="299"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, OnSharedElementsReadyListener listener) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="300"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<View> sharedElements, OnSharedElementsReadyListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/SharedElementCallback.java"
+ line="300"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static EditorCompat getInstance() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/SharedPreferencesCompat.java"
+ line="65"
+ column="23"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ShortcutInfo toShortcutInfo() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+ line="107"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public IconCompat getIcon() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+ line="325"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Builder setIcon(IconCompat icon) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompat.java"
+ line="662"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract T addShortcuts(List<ShortcutInfoCompat> shortcuts);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="38"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract T removeShortcuts(List<String> shortcutIds);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="41"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public List<ShortcutInfoCompat> getShortcuts() throws Exception {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="47"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void addShortcuts(List<ShortcutInfoCompat> shortcuts) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="59"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void addShortcuts(List<ShortcutInfoCompat> shortcuts) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="59"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void removeShortcuts(List<String> shortcutIds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="64"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void removeShortcuts(List<String> shortcutIds) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="64"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Void removeAllShortcuts() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/content/pm/ShortcutInfoCompatSaver.java"
+ line="69"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ListView getListView();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/ShowableListMenu.java"
+ line="41"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public StandaloneActionMode(Context context, ActionBarContextView view,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="49"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public StandaloneActionMode(Context context, ActionBarContextView view,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="49"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ActionMode.Callback callback, boolean isFocusable) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="50"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="62"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="67"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="93"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="114"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="119"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="124"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getCustomView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="129"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuInflater getMenuInflater() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="134"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="143"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onSubMenuSelected(SubMenuBuilder subMenu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="146"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCloseSubMenu(SubMenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/StandaloneActionMode.java"
+ line="155"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="42"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="42"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenuBuilder(Context context, MenuBuilder parentMenu, MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="42"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getParentMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="69"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem getItem() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="74"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCallback(Callback callback) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="79"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuBuilder getRootMenu() {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="84"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="95"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="95"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setIcon(int iconRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="101"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="107"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="107"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderIcon(int iconRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="112"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="117"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="117"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderTitle(int titleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="122"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderView(View view) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="127"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu setHeaderView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="127"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean expandItemActionView(MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="132"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean collapseItemActionView(MenuItemImpl item) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="137"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getActionViewStatesKey() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/menu/SubMenuBuilder.java"
+ line="142"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportActionModeWrapper(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="48"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" androidx.appcompat.view.ActionMode supportActionMode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="49"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getTag() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="55"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTag(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="60"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="65"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="70"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="85"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="90"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="100"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getCustomView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="110"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="115"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuInflater getMenuInflater() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="120"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CallbackWrapper(Context context, Callback supportCallback) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="150"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CallbackWrapper(Context context, Callback supportCallback) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="150"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onCreateActionMode(androidx.appcompat.view.ActionMode mode, Menu menu) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="158"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onCreateActionMode(androidx.appcompat.view.ActionMode mode, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="158"
+ column="84"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode mode, Menu menu) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="164"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onPrepareActionMode(androidx.appcompat.view.ActionMode mode, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="164"
+ column="85"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onActionItemClicked(androidx.appcompat.view.ActionMode mode,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="170"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" android.view.MenuItem item) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="171"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDestroyActionMode(androidx.appcompat.view.ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="177"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode getActionModeWrapper(androidx.appcompat.view.ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="190"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode getActionModeWrapper(androidx.appcompat.view.ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportActionModeWrapper.java"
+ line="190"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SupportMenuInflater(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportMenuInflater.java"
+ line="100"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void inflate(@LayoutRes int menuRes, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/SupportMenuInflater.java"
+ line="117"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setShowAsActionFlags(int actionEnum);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="107"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setActionView(View view);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="122"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setActionView(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="122"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setActionView(int resId);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="137"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View getActionView();"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="147"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setSupportActionProvider(ActionProvider actionProvider);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="162"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setSupportActionProvider(ActionProvider actionProvider);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="162"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ActionProvider getSupportActionProvider();"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="171"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setContentDescription(CharSequence contentDescription);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="220"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setContentDescription(CharSequence contentDescription);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="220"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getContentDescription();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="228"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setTooltipText(CharSequence tooltipText);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="237"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" SupportMenuItem setTooltipText(CharSequence tooltipText);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="237"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" CharSequence getTooltipText();"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="245"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setShortcut(char numericChar, char alphaChar, int numericModifiers,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="271"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setNumericShortcut(char numericChar, int numericModifiers);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="288"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setAlphabeticShortcut(char alphaChar, int alphaModifiers);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="322"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintList(ColorStateList tint);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="350"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintList(ColorStateList tint);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="350"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ColorStateList getIconTintList();"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="357"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintMode(PorterDuff.Mode tintMode);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="369"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuItem setIconTintMode(PorterDuff.Mode tintMode);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="369"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" PorterDuff.Mode getIconTintMode();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/internal/view/SupportMenuItem.java"
+ line="378"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSwitchTextAppearance(Context context, int resid) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="340"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSwitchTypeface(Typeface tf, int style) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="407"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSwitchTypeface(Typeface typeface) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="435"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTrackDrawable(Drawable track) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="526"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getTrackDrawable() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="556"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setThumbDrawable(Drawable thumb) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="648"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getThumbDrawable() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="680"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTextOn() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="796"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextOn(CharSequence textOn) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="819"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTextOff() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="835"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTextOff(CharSequence textOff) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="857"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPopulateAccessibilityEvent(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="970"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1007"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void draw(Canvas c) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1240"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onDraw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1305"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected int[] onCreateDrawableState(int extraSpace) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1429"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean verifyDrawable(Drawable who) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1475"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityEvent(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1498"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onInitializeAccessibilityNodeInfo(AccessibilityNodeInfo info) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/SwitchCompat.java"
+ line="1504"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TaskStackBuilder from(Context context) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="108"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TaskStackBuilder from(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="108"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TaskStackBuilder addParentStack(ComponentName sourceActivityName) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="200"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TaskStackBuilder addParentStack(ComponentName sourceActivityName) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="200"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Intent getIntent(int index) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="233"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Iterator<Intent> iterator() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/app/TaskStackBuilder.java"
+ line="255"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean isRtl(char[] array, int start, int count);"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/TextDirectionHeuristicCompat.java"
+ line="33"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" boolean isRtl(CharSequence cs, int start, int count);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/text/TextDirectionHeuristicCompat.java"
+ line="45"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long duration, StringBuilder builder) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="153"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long duration, PrintWriter pw, int fieldLen) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="162"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long duration, PrintWriter pw) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="171"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void formatDuration(long time, long now, PrintWriter pw) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/util/TimeUtils.java"
+ line="177"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setTintList(ColorStateList tint);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java"
+ line="36"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setTintMode(PorterDuff.Mode tintMode);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/TintAwareDrawable.java"
+ line="37"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Context wrap(@NonNull final Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
+ line="45"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Resources.Theme getTheme() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
+ line="107"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Resources getResources() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
+ line="121"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public AssetManager getAssets() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintContextWrapper.java"
+ line="126"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList mTintList;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintInfo.java"
+ line="29"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PorterDuff.Mode mTintMode;"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintInfo.java"
+ line="30"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="52"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="52"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="52"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] attrs) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="53"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="57"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="57"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, AttributeSet set,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="57"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="58"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, int resid, int[] attrs) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="63"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, int resid, int[] attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="63"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static TintTypedArray obtainStyledAttributes(Context context, int resid, int[] attrs) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="63"
+ column="85"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedArray getWrappedTypeArray() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="75"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getDrawable(int index) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="79"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getDrawableIfKnown(int index) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="89"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Resources getResources() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="141"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText(int index) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="145"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getString(int index) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="149"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getNonResourceString(int index) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="153"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList getColorStateList(int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="173"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int getLayoutDimension(int index, String name) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="203"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence[] getTextArray(int index) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="219"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean getValue(int index, TypedValue outValue) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="223"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public TypedValue peekValue(int index) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="243"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public String getPositionDescription() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/TintTypedArray.java"
+ line="247"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenu(MenuBuilder menu, ActionMenuPresenter outerPresenter) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="564"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenu(MenuBuilder menu, ActionMenuPresenter outerPresenter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="564"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLogo(Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="638"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getLogo() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="661"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLogoDescription(CharSequence description) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="685"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getLogoDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="700"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="748"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="772"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="805"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="827"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitleTextAppearance(Context context, @StyleRes int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="858"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitleTextAppearance(Context context, @StyleRes int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="869"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setNavigationOnClickListener(OnClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1035"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1144"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1221"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Parcelable onSaveInstanceState() {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1555"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onRestoreInstanceState(Parcelable state) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1567"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1601"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onHoverEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="1627"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2222"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2222"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2227"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2227"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected LayoutParams generateDefaultLayoutParams() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2240"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2245"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public DecorToolbar getWrapper() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2251"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2300"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenuCallbacks(MenuPresenter.Callback pcb, MenuBuilder.Callback mcb) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2300"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onMenuItemClick(MenuItem item);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2355"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(@NonNull Context c, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2374"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(LayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2392"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(ActionBar.LayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2398"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(MarginLayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2402"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams(ViewGroup.LayoutParams source) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2409"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SavedState(Parcel source) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2425"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SavedState(Parcel source, ClassLoader loader) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2429"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SavedState(Parcel source, ClassLoader loader) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2429"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SavedState(Parcelable superState) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2435"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void writeToParcel(Parcel out, int flags) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/Toolbar.java"
+ line="2440"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ToolbarWidgetWrapper(Toolbar toolbar, boolean style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="95"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ToolbarWidgetWrapper(Toolbar toolbar, boolean style,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="100"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewGroup getViewGroup() {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="216"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="221"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setWindowCallback(Window.Callback cb) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="236"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setWindowTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="241"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="249"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="254"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="270"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="275"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(Drawable d) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="308"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLogo(Drawable d) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="319"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenu(Menu menu, MenuPresenter.Callback cb) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="367"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenu(Menu menu, MenuPresenter.Callback cb) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="367"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setEmbeddedTabView(ScrollingTabContainerView tabView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="424"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setDropdownParams(SpinnerAdapter adapter,"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="515"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AdapterView.OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="516"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="542"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getCustomView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="553"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setupAnimatorToVisibility(final int visibility,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="567"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setNavigationIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="595"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setDefaultNavigationIcon(Drawable defaultNavigationIcon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="606"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setNavigationContentDescription(CharSequence description) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="622"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void saveHierarchyState(SparseArray<Parcelable> toolbarStates) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="643"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void restoreHierarchyState(SparseArray<Parcelable> toolbarStates) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="648"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBackgroundDrawable(Drawable d) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="653"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setMenuCallbacks(MenuPresenter.Callback actionMenuPresenterCallback,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="673"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" MenuBuilder.Callback menuBuilderCallback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="674"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ToolbarWidgetWrapper.java"
+ line="679"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void tagSocket(Socket socket) throws SocketException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
+ line="113"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void untagSocket(Socket socket) throws SocketException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/net/TrafficStatsCompat.java"
+ line="123"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ComplexColorCompat getNamedComplexColor(@NonNull TypedArray a,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/content/res/TypedArrayUtils.java"
+ line="137"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" @NonNull Context context, @NonNull Resources resources, int id, String path,"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompat.java"
+ line="172"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromFamiliesWithDefault(Object family) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="167"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontFamilyFilesResourceEntry(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="200"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry entry, Resources resources,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="201"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry entry, Resources resources,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="201"
+ column="75"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontInfo(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="226"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="290"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="290"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="290"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Class<?> obtainFontFamily() throws ClassNotFoundException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="315"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Constructor<?> obtainFontFamilyCtor(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="319"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Constructor<?> obtainFontFamilyCtor(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="319"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromAssetManagerMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="324"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromAssetManagerMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="324"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromBufferMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="331"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAddFontFromBufferMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="331"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainFreezeMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="338"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainFreezeMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="338"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAbortCreationMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="342"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainAbortCreationMethod(Class<?> fontFamily) throws NoSuchMethodException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="342"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="346"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi26Impl.java"
+ line="346"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromFamiliesWithDefault(Object family) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="47"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromFamiliesWithDefault(Object family) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="47"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="59"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Method obtainCreateFromFamiliesWithDefaultMethod(Class<?> fontFamily)"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi28Impl.java"
+ line="59"
+ column="64"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected FontsContractCompat.FontInfo findBestInfo(FontsContractCompat.FontInfo[] fonts,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="46"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected FontsContractCompat.FontInfo findBestInfo(FontsContractCompat.FontInfo[] fonts,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="46"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromInputStream(Context context, InputStream is) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="53"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromInputStream(Context context, InputStream is) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="53"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected Typeface createFromInputStream(Context context, InputStream is) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="53"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontInfo(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="59"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Typeface createFromFontFamilyFilesResourceEntry(Context context,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="105"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry familyEntry, Resources resources,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="106"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" FontResourcesParserCompat.FontFamilyFilesResourceEntry familyEntry, Resources resources,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="106"
+ column="81"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="151"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="151"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, Resources resources, int id, String path, int style) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatApi29Impl.java"
+ line="151"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static File getTempFile(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="68"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="108"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="108"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer mmap(Context context, CancellationSignal cancellationSignal, Uri uri) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="108"
+ column="91"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer copyToDirectBuffer(Context context, Resources res, int id) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="129"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static ByteBuffer copyToDirectBuffer(Context context, Resources res, int id) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="129"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, InputStream is) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="147"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, InputStream is) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="147"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, Resources res, int id) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="170"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean copyToFile(File file, Resources res, int id) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="170"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void closeQuietly(Closeable c) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/TypefaceCompatUtil.java"
+ line="180"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getDrawable(int id) throws NotFoundException {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/VectorEnabledTintResources.java"
+ line="66"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getXVelocity(VelocityTracker tracker, int pointerId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/VelocityTrackerCompat.java"
+ line="36"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getYVelocity(VelocityTracker tracker, int pointerId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/VelocityTrackerCompat.java"
+ line="48"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean canScrollHorizontally(View view, int direction) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="543"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean canScrollVertically(View view, int direction) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="556"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getOverScrollMode(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="573"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setOverScrollMode(View v, @OverScroll int overScrollMode) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="593"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="633"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onPopulateAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="633"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="665"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onInitializeAccessibilityEvent(View v, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="665"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getAlpha(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1469"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setLayerType(View view, @LayerType int layerType, Paint paint) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1508"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setLayerType(View view, @LayerType int layerType, Paint paint) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1508"
+ column="74"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getLayerType(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1532"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isOpaque(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1700"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMeasuredWidthAndState(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1737"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMeasuredHeightAndState(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1754"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getMeasuredState(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1768"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getTranslationX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1960"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getTranslationY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1974"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static Matrix getMatrix(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="1996"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTranslationX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2102"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setTranslationY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2119"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setAlpha(View view, @FloatRange(from = 0.0, to = 1.0) float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2136"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2151"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2166"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setRotation(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2179"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setRotationX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2193"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setRotationY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2207"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setScaleX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2220"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setScaleY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2233"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getPivotX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2244"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setPivotX(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2260"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getPivotY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2273"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setPivotY(View view, float value) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2289"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getRotation(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2297"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getRotationX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2305"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getRotationY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2313"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getScaleX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2321"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getScaleY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2329"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getX(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2337"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static float getY(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2345"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setChildrenDrawingOrderEnabled(ViewGroup viewGroup, boolean enabled) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2469"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setFitsSystemWindows(View view, boolean fitSystemWindows) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2510"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void jumpDrawablesToCurrentState(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2524"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setSaveFromParentEnabled(View v, boolean enabled) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2930"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setActivated(View view, boolean activated) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewCompat.java"
+ line="2946"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getScaledPagingTouchSlop(ViewConfiguration config) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="56"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean hasPermanentMenuKey(ViewConfiguration config) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="67"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getScaledHoverSlop(ViewConfiguration config) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="127"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(ViewConfiguration config,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewConfigurationCompat.java"
+ line="139"
+ column="70"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="73"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onRequestSendAccessibilityEvent(ViewGroup group, View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="73"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="74"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void setMotionEventSplittingEnabled(ViewGroup group, boolean split) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewGroupCompat.java"
+ line="97"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewParent parent, View child, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="65"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewParent parent, View child, AccessibilityEvent event) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="65"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewParent parent, View child, AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="65"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="83"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="83"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="83"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="100"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="100"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="100"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="113"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="113"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="130"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="130"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="158"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="158"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="176"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="176"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] consumed) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="177"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="205"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="205"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onStartNestedScroll(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="205"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="246"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="246"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScrollAccepted(ViewParent parent, View child, View target,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="246"
+ column="78"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target, int type) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="281"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onStopNestedScroll(ViewParent parent, View target, int type) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="281"
+ column="62"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="325"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedScroll(ViewParent parent, View target, int dxConsumed,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="325"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="382"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void onNestedPreScroll(ViewParent parent, View target, int dx, int dy,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="382"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int[] consumed, int type) {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="383"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="422"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="422"
+ column="60"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedPreFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="459"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean onNestedPreFling(ViewParent parent, View target, float velocityX,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="459"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void notifySubtreeAccessibilityStateChanged(ViewParent parent, View child,"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="490"
+ column="63"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void notifySubtreeAccessibilityStateChanged(ViewParent parent, View child,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="490"
+ column="82"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View source, int changeType) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewParentCompat.java"
+ line="491"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setDuration(long value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="121"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat alpha(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="136"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat alphaBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="151"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationX(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="166"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationY(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="181"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="214"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withEndAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="214"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="252"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setInterpolator(Interpolator value) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="252"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Interpolator getInterpolator() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="265"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setStartDelay(long value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="284"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotation(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="316"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="331"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationX(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="346"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationXBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="361"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationY(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="376"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat rotationYBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="391"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleX(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="406"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleXBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="421"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleY(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="436"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat scaleYBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="451"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat x(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="476"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat xBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="491"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat y(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="506"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat yBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="521"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationXBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="536"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationYBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="551"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationZBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="568"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat translationZ(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="587"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat z(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="606"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat zBy(float value) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="625"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withLayer() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="678"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="706"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat withStartAction(Runnable runnable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="706"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setListener(final ViewPropertyAnimatorListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="727"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setListener(final ViewPropertyAnimatorListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="727"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompat setUpdateListener("
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="773"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final ViewPropertyAnimatorUpdateListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorCompat.java"
+ line="774"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="52"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet play(ViewPropertyAnimatorCompat animator) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="52"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet playSequentially(ViewPropertyAnimatorCompat anim1,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="59"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet playSequentially(ViewPropertyAnimatorCompat anim1,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="59"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" ViewPropertyAnimatorCompat anim2) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="60"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet setDuration(long duration) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="99"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="106"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet setInterpolator(Interpolator interpolator) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="106"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="113"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ViewPropertyAnimatorCompatSet setListener(ViewPropertyAnimatorListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/ViewPropertyAnimatorCompatSet.java"
+ line="113"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationStart(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListener.java"
+ line="32"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationEnd(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListener.java"
+ line="40"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationCancel(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListener.java"
+ line="48"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationStart(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListenerAdapter.java"
+ line="33"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationEnd(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListenerAdapter.java"
+ line="40"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationCancel(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorListenerAdapter.java"
+ line="47"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onAnimationUpdate(View view);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ViewPropertyAnimatorUpdateListener.java"
+ line="34"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLayoutInflater(LayoutInflater inflater) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="138"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutInflater getLayoutInflater() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="145"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void draw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="156"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void dispatchDraw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="160"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View inflate() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="197"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnInflateListener(OnInflateListener inflateListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="249"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onInflate(ViewStubCompat stub, View inflated);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="268"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onInflate(ViewStubCompat stub, View inflated);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewStubCompat.java"
+ line="268"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isLayoutRtl(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewUtils.java"
+ line="57"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void computeFitSystemWindows(View view, Rect inoutInsets, Rect outLocalInsets) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewUtils.java"
+ line="65"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void computeFitSystemWindows(View view, Rect inoutInsets, Rect outLocalInsets) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewUtils.java"
+ line="65"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void computeFitSystemWindows(View view, Rect inoutInsets, Rect outLocalInsets) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewUtils.java"
+ line="65"
+ column="77"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static void makeOptionalFitsSystemWindows(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/widget/ViewUtils.java"
+ line="79"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WindowCallbackWrapper(Window.Callback wrapped) {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="50"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="58"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchKeyShortcutEvent(KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="63"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="68"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchTrackballEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="73"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchGenericMotionEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="78"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean dispatchPopulateAccessibilityEvent(AccessibilityEvent event) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="83"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View onCreatePanelView(int featureId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="88"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onCreatePanelMenu(int featureId, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="93"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onPreparePanel(int featureId, View view, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="98"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onPreparePanel(int featureId, View view, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="98"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onMenuOpened(int featureId, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="103"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onMenuItemSelected(int featureId, MenuItem item) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="108"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onWindowAttributesChanged(WindowManager.LayoutParams attrs) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="113"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPanelClosed(int featureId, Menu menu) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="138"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onSearchRequested(SearchEvent searchEvent) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="144"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="154"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode onWindowStartingActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="154"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="160"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode onWindowStartingActionMode(ActionMode.Callback callback, int type) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="160"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onActionModeStarted(ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="165"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onActionModeFinished(ActionMode mode) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="170"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<KeyboardShortcutGroup> data, Menu menu, int deviceId) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="177"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" List<KeyboardShortcutGroup> data, Menu menu, int deviceId) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="177"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public final Window.Callback getWrapped() {"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/view/WindowCallbackWrapper.java"
+ line="187"
+ column="18"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WindowDecorActionBar(Activity activity, boolean overlayMode) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="168"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WindowDecorActionBar(Dialog dialog) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="178"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WindowDecorActionBar(View layout) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="187"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onConfigurationChanged(Configuration newConfig) {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="255"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addOnMenuVisibilityListener(OnMenuVisibilityListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="337"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeOnMenuVisibilityListener(OnMenuVisibilityListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="342"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="437"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setWindowTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="442"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="457"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setBackgroundDrawable(Drawable d) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="479"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setStackedBackgroundDrawable(Drawable d) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="484"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSplitBackgroundDrawable(Drawable d) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="489"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getCustomView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="494"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="499"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="504"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode startActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="519"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionMode startActionMode(ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="519"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addTab(Tab tab) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="557"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addTab(Tab tab, int position) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="562"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addTab(Tab tab, boolean setSelected) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="567"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addTab(Tab tab, int position, boolean setSelected) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="577"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab newTab() {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="587"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeTab(Tab tab) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="592"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void selectTab(Tab tab) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="622"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab getSelectedTab() {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="659"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Context getThemedContext() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="916"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setHomeAsUpIndicator(Drawable indicator) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="938"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setHomeActionContentDescription(CharSequence description) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="948"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionModeImpl(Context context, ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="989"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionModeImpl(Context context, ActionMode.Callback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="989"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuInflater getMenuInflater() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="998"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1003"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1063"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setSubtitle(CharSequence subtitle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1069"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1074"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1089"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getSubtitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1094"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getCustomView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1110"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCloseMenu(MenuBuilder menu, boolean allMenusAreClosing) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1123"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onSubMenuSelected(SubMenuBuilder subMenu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1126"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCloseSubMenu(SubMenuBuilder menu) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1139"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Object getTag() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1166"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setTag(Object tag) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1171"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setTag(Object tag) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1171"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionBar.TabListener getCallback() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1176"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setTabListener(ActionBar.TabListener callback) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1181"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setTabListener(ActionBar.TabListener callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1181"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getCustomView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1187"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setCustomView(View view) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1192"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1192"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setCustomView(int layoutResId) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1201"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getIcon() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1207"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getText() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1221"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setIcon(Drawable icon) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1226"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1226"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setIcon(int resId) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1235"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setText(CharSequence text) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1240"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setText(CharSequence text) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1240"
+ column="28"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setText(int resId) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1249"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setContentDescription(int resId) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1259"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setContentDescription(CharSequence contentDesc) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1264"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab setContentDescription(CharSequence contentDesc) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1264"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getContentDescription() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1273"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1279"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view, LayoutParams layoutParams) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1284"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCustomView(View view, LayoutParams layoutParams) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1284"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1290"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setListNavigationCallbacks(SpinnerAdapter adapter, OnNavigationListener callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1290"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Tab getTabAt(int index) {"
+ errorLine2=" ~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1354"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1365"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setLogo(Drawable logo) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1379"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onKeyShortcut(int keyCode, KeyEvent event) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/appcompat/app/WindowDecorActionBar.java"
+ line="1395"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Drawable getWrappedDrawable();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java"
+ line="33"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setWrappedDrawable(Drawable drawable);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/graphics/drawable/WrappedDrawable.java"
+ line="34"
+ column="29"/>
+ </issue>
+
+</issues>
diff --git a/core/core/api/1.7.0-beta03.txt b/core/core/api/1.7.0-beta03.txt
new file mode 100644
index 0000000..38b153e
--- /dev/null
+++ b/core/core/api/1.7.0-beta03.txt
@@ -0,0 +1,3696 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+ public final class AccessibilityServiceInfoCompat {
+ method public static String capabilityToString(int);
+ method public static String feedbackTypeToString(int);
+ method public static String? flagToString(int);
+ method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+ method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+ field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+ field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+ field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+ field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+ field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+ field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+ field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+ }
+
+}
+
+package androidx.core.app {
+
+ public class ActivityCompat extends androidx.core.content.ContextCompat {
+ ctor protected ActivityCompat();
+ method public static void finishAffinity(android.app.Activity);
+ method public static void finishAfterTransition(android.app.Activity);
+ method public static android.net.Uri? getReferrer(android.app.Activity);
+ method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+ method public static boolean isLaunchedFromBubble(android.app.Activity);
+ method public static void postponeEnterTransition(android.app.Activity);
+ method public static void recreate(android.app.Activity);
+ method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+ method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+ method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+ method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+ method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+ method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+ method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+ method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public static void startPostponedEnterTransition(android.app.Activity);
+ }
+
+ public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+ method public void onRequestPermissionsResult(int, String![], int[]);
+ }
+
+ public static interface ActivityCompat.PermissionCompatDelegate {
+ method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+ method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+ }
+
+ public final class ActivityManagerCompat {
+ method public static boolean isLowRamDevice(android.app.ActivityManager);
+ }
+
+ public class ActivityOptionsCompat {
+ ctor protected ActivityOptionsCompat();
+ method public android.graphics.Rect? getLaunchBounds();
+ method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+ method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+ method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+ method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+ method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+ method public android.os.Bundle? toBundle();
+ method public void update(androidx.core.app.ActivityOptionsCompat);
+ field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+ field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+ }
+
+ public final class AlarmManagerCompat {
+ method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+ method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ }
+
+ @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+ ctor public AppComponentFactory();
+ method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public class AppLaunchChecker {
+ ctor @Deprecated public AppLaunchChecker();
+ method public static boolean hasStartedFromLauncher(android.content.Context);
+ method public static void onActivityCreate(android.app.Activity);
+ }
+
+ public final class AppOpsManagerCompat {
+ method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+ method public static int noteOp(android.content.Context, String, int, String);
+ method public static int noteOpNoThrow(android.content.Context, String, int, String);
+ method public static int noteProxyOp(android.content.Context, String, String);
+ method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+ method public static String? permissionToOp(String);
+ field public static final int MODE_ALLOWED = 0; // 0x0
+ field public static final int MODE_DEFAULT = 3; // 0x3
+ field public static final int MODE_ERRORED = 2; // 0x2
+ field public static final int MODE_IGNORED = 1; // 0x1
+ }
+
+ public final class BundleCompat {
+ method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+ method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+ }
+
+ public class DialogCompat {
+ method public static android.view.View requireViewById(android.app.Dialog, int);
+ }
+
+ public class FrameMetricsAggregator {
+ ctor public FrameMetricsAggregator();
+ ctor public FrameMetricsAggregator(int);
+ method public void add(android.app.Activity);
+ method public android.util.SparseIntArray![]? getMetrics();
+ method public android.util.SparseIntArray![]? remove(android.app.Activity);
+ method public android.util.SparseIntArray![]? reset();
+ method public android.util.SparseIntArray![]? stop();
+ field public static final int ANIMATION_DURATION = 256; // 0x100
+ field public static final int ANIMATION_INDEX = 8; // 0x8
+ field public static final int COMMAND_DURATION = 32; // 0x20
+ field public static final int COMMAND_INDEX = 5; // 0x5
+ field public static final int DELAY_DURATION = 128; // 0x80
+ field public static final int DELAY_INDEX = 7; // 0x7
+ field public static final int DRAW_DURATION = 8; // 0x8
+ field public static final int DRAW_INDEX = 3; // 0x3
+ field public static final int EVERY_DURATION = 511; // 0x1ff
+ field public static final int INPUT_DURATION = 2; // 0x2
+ field public static final int INPUT_INDEX = 1; // 0x1
+ field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+ field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+ field public static final int SWAP_DURATION = 64; // 0x40
+ field public static final int SWAP_INDEX = 6; // 0x6
+ field public static final int SYNC_DURATION = 16; // 0x10
+ field public static final int SYNC_INDEX = 4; // 0x4
+ field public static final int TOTAL_DURATION = 1; // 0x1
+ field public static final int TOTAL_INDEX = 0; // 0x0
+ }
+
+ @Deprecated public abstract class JobIntentService extends android.app.Service {
+ ctor @Deprecated public JobIntentService();
+ method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+ method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+ method @Deprecated public boolean isStopped();
+ method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+ method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+ method @Deprecated public boolean onStopCurrentWork();
+ method @Deprecated public void setInterruptIfStopped(boolean);
+ }
+
+ public final class NavUtils {
+ method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static String? getParentActivityName(android.app.Activity);
+ method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void navigateUpFromSameTask(android.app.Activity);
+ method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+ method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+ field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+ }
+
+ public class NotificationChannelCompat {
+ method public boolean canBubble();
+ method public boolean canBypassDnd();
+ method public boolean canShowBadge();
+ method public android.media.AudioAttributes? getAudioAttributes();
+ method public String? getConversationId();
+ method public String? getDescription();
+ method public String? getGroup();
+ method public String getId();
+ method public int getImportance();
+ method public int getLightColor();
+ method public int getLockscreenVisibility();
+ method public CharSequence? getName();
+ method public String? getParentChannelId();
+ method public android.net.Uri? getSound();
+ method public long[]? getVibrationPattern();
+ method public boolean isImportantConversation();
+ method public boolean shouldShowLights();
+ method public boolean shouldVibrate();
+ method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+ field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+ }
+
+ public static class NotificationChannelCompat.Builder {
+ ctor public NotificationChannelCompat.Builder(String, int);
+ method public androidx.core.app.NotificationChannelCompat build();
+ method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+ method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+ method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+ method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+ }
+
+ public class NotificationChannelGroupCompat {
+ method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+ method public String? getDescription();
+ method public String getId();
+ method public CharSequence? getName();
+ method public boolean isBlocked();
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+ }
+
+ public static class NotificationChannelGroupCompat.Builder {
+ ctor public NotificationChannelGroupCompat.Builder(String);
+ method public androidx.core.app.NotificationChannelGroupCompat build();
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+ }
+
+ public class NotificationCompat {
+ ctor @Deprecated public NotificationCompat();
+ method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+ method public static int getActionCount(android.app.Notification);
+ method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+ method public static boolean getAutoCancel(android.app.Notification);
+ method public static int getBadgeIconType(android.app.Notification);
+ method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+ method public static String? getCategory(android.app.Notification);
+ method public static String? getChannelId(android.app.Notification);
+ method public static int getColor(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+ method public static android.os.Bundle? getExtras(android.app.Notification);
+ method public static String? getGroup(android.app.Notification);
+ method public static int getGroupAlertBehavior(android.app.Notification);
+ method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+ method public static boolean getLocalOnly(android.app.Notification);
+ method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+ method public static boolean getOngoing(android.app.Notification);
+ method public static boolean getOnlyAlertOnce(android.app.Notification);
+ method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+ method public static android.app.Notification? getPublicVersion(android.app.Notification);
+ method public static CharSequence? getSettingsText(android.app.Notification);
+ method public static String? getShortcutId(android.app.Notification);
+ method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+ method public static String? getSortKey(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+ method public static long getTimeoutAfter(android.app.Notification);
+ method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+ method public static int getVisibility(android.app.Notification);
+ method public static boolean isGroupSummary(android.app.Notification);
+ field public static final int BADGE_ICON_LARGE = 2; // 0x2
+ field public static final int BADGE_ICON_NONE = 0; // 0x0
+ field public static final int BADGE_ICON_SMALL = 1; // 0x1
+ field public static final String CATEGORY_ALARM = "alarm";
+ field public static final String CATEGORY_CALL = "call";
+ field public static final String CATEGORY_EMAIL = "email";
+ field public static final String CATEGORY_ERROR = "err";
+ field public static final String CATEGORY_EVENT = "event";
+ field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+ field public static final String CATEGORY_MESSAGE = "msg";
+ field public static final String CATEGORY_MISSED_CALL = "missed_call";
+ field public static final String CATEGORY_NAVIGATION = "navigation";
+ field public static final String CATEGORY_PROGRESS = "progress";
+ field public static final String CATEGORY_PROMO = "promo";
+ field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+ field public static final String CATEGORY_REMINDER = "reminder";
+ field public static final String CATEGORY_SERVICE = "service";
+ field public static final String CATEGORY_SOCIAL = "social";
+ field public static final String CATEGORY_STATUS = "status";
+ field public static final String CATEGORY_STOPWATCH = "stopwatch";
+ field public static final String CATEGORY_SYSTEM = "sys";
+ field public static final String CATEGORY_TRANSPORT = "transport";
+ field public static final String CATEGORY_WORKOUT = "workout";
+ field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+ field public static final int DEFAULT_ALL = -1; // 0xffffffff
+ field public static final int DEFAULT_LIGHTS = 4; // 0x4
+ field public static final int DEFAULT_SOUND = 1; // 0x1
+ field public static final int DEFAULT_VIBRATE = 2; // 0x2
+ field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+ field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+ field public static final String EXTRA_BIG_TEXT = "android.bigText";
+ field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+ field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+ field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+ field public static final String EXTRA_COLORIZED = "android.colorized";
+ field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+ field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+ field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+ field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+ field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+ field public static final String EXTRA_INFO_TEXT = "android.infoText";
+ field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+ field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+ field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+ field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+ field public static final String EXTRA_MESSAGES = "android.messages";
+ field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+ field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+ field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+ field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+ field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+ field public static final String EXTRA_PICTURE = "android.picture";
+ field public static final String EXTRA_PROGRESS = "android.progress";
+ field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+ field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+ field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+ field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+ field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+ field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+ field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+ field public static final String EXTRA_SMALL_ICON = "android.icon";
+ field public static final String EXTRA_SUB_TEXT = "android.subText";
+ field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+ field public static final String EXTRA_TEMPLATE = "android.template";
+ field public static final String EXTRA_TEXT = "android.text";
+ field public static final String EXTRA_TEXT_LINES = "android.textLines";
+ field public static final String EXTRA_TITLE = "android.title";
+ field public static final String EXTRA_TITLE_BIG = "android.title.big";
+ field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+ field public static final int FLAG_BUBBLE = 4096; // 0x1000
+ field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+ field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+ field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+ field public static final int FLAG_INSISTENT = 4; // 0x4
+ field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+ field public static final int FLAG_NO_CLEAR = 32; // 0x20
+ field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+ field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+ field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+ field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+ field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+ field public static final String GROUP_KEY_SILENT = "silent";
+ field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+ field public static final int PRIORITY_DEFAULT = 0; // 0x0
+ field public static final int PRIORITY_HIGH = 1; // 0x1
+ field public static final int PRIORITY_LOW = -1; // 0xffffffff
+ field public static final int PRIORITY_MAX = 2; // 0x2
+ field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+ field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+ field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+ field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+ field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+ }
+
+ public static class NotificationCompat.Action {
+ ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+ method public android.app.PendingIntent? getActionIntent();
+ method public boolean getAllowGeneratedReplies();
+ method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+ method public android.os.Bundle getExtras();
+ method @Deprecated public int getIcon();
+ method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+ method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+ method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+ method public boolean getShowsUserInterface();
+ method public CharSequence? getTitle();
+ method public boolean isContextual();
+ field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+ field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+ field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+ field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+ field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+ field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+ field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+ field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+ field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+ field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+ field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+ field public android.app.PendingIntent! actionIntent;
+ field @Deprecated public int icon;
+ field public CharSequence! title;
+ }
+
+ public static final class NotificationCompat.Action.Builder {
+ ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+ method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+ method public androidx.core.app.NotificationCompat.Action build();
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+ method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+ }
+
+ public static interface NotificationCompat.Action.Extender {
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+ }
+
+ public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+ ctor public NotificationCompat.Action.WearableExtender();
+ ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+ method @Deprecated public CharSequence? getCancelLabel();
+ method @Deprecated public CharSequence? getConfirmLabel();
+ method public boolean getHintDisplayActionInline();
+ method public boolean getHintLaunchesActivity();
+ method @Deprecated public CharSequence? getInProgressLabel();
+ method public boolean isAvailableOffline();
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+ }
+
+ public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigPictureStyle();
+ ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+ method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+ }
+
+ public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigTextStyle();
+ ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+ }
+
+ public static final class NotificationCompat.BubbleMetadata {
+ method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+ method public boolean getAutoExpandBubble();
+ method public android.app.PendingIntent? getDeleteIntent();
+ method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+ method @DimenRes public int getDesiredHeightResId();
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public android.app.PendingIntent? getIntent();
+ method public String? getShortcutId();
+ method public boolean isNotificationSuppressed();
+ method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+ }
+
+ public static final class NotificationCompat.BubbleMetadata.Builder {
+ ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+ ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+ ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+ }
+
+ public static class NotificationCompat.Builder {
+ ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+ ctor public NotificationCompat.Builder(android.content.Context, String);
+ ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+ method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+ method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+ method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+ method public android.app.Notification build();
+ method public androidx.core.app.NotificationCompat.Builder clearActions();
+ method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+ method public androidx.core.app.NotificationCompat.Builder clearPeople();
+ method public android.widget.RemoteViews? createBigContentView();
+ method public android.widget.RemoteViews? createContentView();
+ method public android.widget.RemoteViews? createHeadsUpContentView();
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+ method public android.os.Bundle getExtras();
+ method @Deprecated public android.app.Notification getNotification();
+ method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+ method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+ method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+ method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+ method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+ method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+ method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+ method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+ method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+ method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+ method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+ method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+ method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+ method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+ method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+ method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+ method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+ method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+ method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+ method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+ method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+ method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+ method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+ method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+ method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+ method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+ method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+ method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+ method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+ method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+ field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+ }
+
+ public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.CarExtender();
+ ctor public NotificationCompat.CarExtender(android.app.Notification);
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ method @ColorInt public int getColor();
+ method public android.graphics.Bitmap? getLargeIcon();
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+ method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+ }
+
+ @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+ method @Deprecated public long getLatestTimestamp();
+ method @Deprecated public String![]? getMessages();
+ method @Deprecated public String? getParticipant();
+ method @Deprecated public String![]? getParticipants();
+ method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+ method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+ method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+ }
+
+ @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+ ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+ }
+
+ public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.DecoratedCustomViewStyle();
+ }
+
+ public static interface NotificationCompat.Extender {
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ }
+
+ public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.InboxStyle();
+ ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+ method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+ }
+
+ public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+ ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+ method public void addCompatExtras(android.os.Bundle);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+ method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+ method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+ method public CharSequence? getConversationTitle();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+ method public androidx.core.app.Person getUser();
+ method @Deprecated public CharSequence? getUserDisplayName();
+ method public boolean isGroupConversation();
+ method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+ field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+ }
+
+ public static final class NotificationCompat.MessagingStyle.Message {
+ ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+ ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+ method public String? getDataMimeType();
+ method public android.net.Uri? getDataUri();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.Person? getPerson();
+ method @Deprecated public CharSequence? getSender();
+ method public CharSequence? getText();
+ method public long getTimestamp();
+ method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+ }
+
+ public abstract static class NotificationCompat.Style {
+ ctor public NotificationCompat.Style();
+ method public android.app.Notification? build();
+ method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+ }
+
+ public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.WearableExtender();
+ ctor public NotificationCompat.WearableExtender(android.app.Notification);
+ method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+ method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+ method public androidx.core.app.NotificationCompat.WearableExtender clone();
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+ method @Deprecated public android.graphics.Bitmap? getBackground();
+ method public String? getBridgeTag();
+ method public int getContentAction();
+ method @Deprecated public int getContentIcon();
+ method @Deprecated public int getContentIconGravity();
+ method public boolean getContentIntentAvailableOffline();
+ method @Deprecated public int getCustomContentHeight();
+ method @Deprecated public int getCustomSizePreset();
+ method public String? getDismissalId();
+ method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+ method @Deprecated public int getGravity();
+ method @Deprecated public boolean getHintAmbientBigPicture();
+ method @Deprecated public boolean getHintAvoidBackgroundClipping();
+ method public boolean getHintContentIntentLaunchesActivity();
+ method @Deprecated public boolean getHintHideIcon();
+ method @Deprecated public int getHintScreenTimeout();
+ method @Deprecated public boolean getHintShowBackgroundOnly();
+ method @Deprecated public java.util.List<android.app.Notification!> getPages();
+ method public boolean getStartScrollBottom();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+ method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+ field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+ field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+ field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+ field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+ field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+ field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+ field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+ field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+ }
+
+ public final class NotificationCompatExtras {
+ field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+ field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+ field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+ field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+ field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+ field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+ }
+
+ public abstract class NotificationCompatSideChannelService extends android.app.Service {
+ ctor public NotificationCompatSideChannelService();
+ method public abstract void cancel(String!, int, String!);
+ method public abstract void cancelAll(String!);
+ method public abstract void notify(String!, int, String!, android.app.Notification!);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ }
+
+ public final class NotificationManagerCompat {
+ method public boolean areNotificationsEnabled();
+ method public void cancel(int);
+ method public void cancel(String?, int);
+ method public void cancelAll();
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+ method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+ method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+ method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+ method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+ method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+ method public void deleteNotificationChannel(String);
+ method public void deleteNotificationChannelGroup(String);
+ method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+ method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+ method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+ method public int getImportance();
+ method public android.app.NotificationChannel? getNotificationChannel(String);
+ method public android.app.NotificationChannel? getNotificationChannel(String, String);
+ method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+ method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+ method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+ method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+ method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+ method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+ method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+ method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+ method public void notify(int, android.app.Notification);
+ method public void notify(String?, int, android.app.Notification);
+ field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+ field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+ field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+ field public static final int IMPORTANCE_HIGH = 4; // 0x4
+ field public static final int IMPORTANCE_LOW = 2; // 0x2
+ field public static final int IMPORTANCE_MAX = 5; // 0x5
+ field public static final int IMPORTANCE_MIN = 1; // 0x1
+ field public static final int IMPORTANCE_NONE = 0; // 0x0
+ field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+ }
+
+ public class Person {
+ method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public String? getKey();
+ method public CharSequence? getName();
+ method public String? getUri();
+ method public boolean isBot();
+ method public boolean isImportant();
+ method public androidx.core.app.Person.Builder toBuilder();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static class Person.Builder {
+ ctor public Person.Builder();
+ method public androidx.core.app.Person build();
+ method public androidx.core.app.Person.Builder setBot(boolean);
+ method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+ method public androidx.core.app.Person.Builder setImportant(boolean);
+ method public androidx.core.app.Person.Builder setKey(String?);
+ method public androidx.core.app.Person.Builder setName(CharSequence?);
+ method public androidx.core.app.Person.Builder setUri(String?);
+ }
+
+ public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+ ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+ ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+ method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+ method public android.app.PendingIntent getActionIntent();
+ method public CharSequence getContentDescription();
+ method public androidx.core.graphics.drawable.IconCompat getIcon();
+ method public CharSequence getTitle();
+ method public boolean isEnabled();
+ method public void setEnabled(boolean);
+ method public void setShouldShowIcon(boolean);
+ method public boolean shouldShowIcon();
+ method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+ }
+
+ public final class RemoteInput {
+ method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+ method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+ method public boolean getAllowFreeFormInput();
+ method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+ method public CharSequence![]! getChoices();
+ method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+ method public int getEditChoicesBeforeSending();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence! getLabel();
+ method public String! getResultKey();
+ method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+ method public static int getResultsSource(android.content.Intent);
+ method public boolean isDataOnly();
+ method public static void setResultsSource(android.content.Intent, int);
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+ field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+ field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+ field public static final int SOURCE_CHOICE = 1; // 0x1
+ field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+ }
+
+ public static final class RemoteInput.Builder {
+ ctor public RemoteInput.Builder(String);
+ method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+ method public androidx.core.app.RemoteInput build();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+ method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+ method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+ method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+ method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+ }
+
+ public final class ServiceCompat {
+ method public static void stopForeground(android.app.Service, int);
+ field public static final int START_STICKY = 1; // 0x1
+ field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+ field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+ }
+
+ public final class ShareCompat {
+ method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+ method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+ method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+ method public static String? getCallingPackage(android.app.Activity);
+ field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+ field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+ }
+
+ public static class ShareCompat.IntentBuilder {
+ ctor public ShareCompat.IntentBuilder(android.content.Context);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+ method public android.content.Intent createChooserIntent();
+ method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+ method public android.content.Intent getIntent();
+ method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+ method public void startChooser();
+ }
+
+ public static class ShareCompat.IntentReader {
+ ctor public ShareCompat.IntentReader(android.app.Activity);
+ ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+ method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+ method public android.content.ComponentName? getCallingActivity();
+ method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+ method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+ method public CharSequence? getCallingApplicationLabel();
+ method public String? getCallingPackage();
+ method public String![]? getEmailBcc();
+ method public String![]? getEmailCc();
+ method public String![]? getEmailTo();
+ method public String? getHtmlText();
+ method public android.net.Uri? getStream();
+ method public android.net.Uri? getStream(int);
+ method public int getStreamCount();
+ method public String? getSubject();
+ method public CharSequence? getText();
+ method public String? getType();
+ method public boolean isMultipleShare();
+ method public boolean isShareIntent();
+ method public boolean isSingleShare();
+ }
+
+ public abstract class SharedElementCallback {
+ ctor public SharedElementCallback();
+ method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+ method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+ method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+ method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+ method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+ method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+ method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+ }
+
+ public static interface SharedElementCallback.OnSharedElementsReadyListener {
+ method public void onSharedElementsReady();
+ }
+
+ public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+ method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+ method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+ method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+ method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+ method public android.content.Intent? editIntentAt(int);
+ method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+ method @Deprecated public android.content.Intent! getIntent(int);
+ method public int getIntentCount();
+ method public android.content.Intent![] getIntents();
+ method public android.app.PendingIntent? getPendingIntent(int, int);
+ method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+ method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+ method public void startActivities();
+ method public void startActivities(android.os.Bundle?);
+ }
+
+ public static interface TaskStackBuilder.SupportParentable {
+ method public android.content.Intent? getSupportParentActivityIntent();
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentProviderCompat {
+ method public static android.content.Context requireContext(android.content.ContentProvider);
+ }
+
+ public final class ContentResolverCompat {
+ method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+ }
+
+ public class ContextCompat {
+ ctor protected ContextCompat();
+ method public static int checkSelfPermission(android.content.Context, String);
+ method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+ method public static String? getAttributionTag(android.content.Context);
+ method public static java.io.File getCodeCacheDir(android.content.Context);
+ method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+ method public static java.io.File? getDataDir(android.content.Context);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+ method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+ method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+ method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+ method public static java.io.File![] getObbDirs(android.content.Context);
+ method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+ method public static String? getSystemServiceName(android.content.Context, Class<?>);
+ method public static boolean isDeviceProtectedStorage(android.content.Context);
+ method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+ method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+ method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+ method public static void startForegroundService(android.content.Context, android.content.Intent);
+ }
+
+ public class FileProvider extends android.content.ContentProvider {
+ ctor public FileProvider();
+ method public int delete(android.net.Uri, String?, String![]?);
+ method public String! getType(android.net.Uri);
+ method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+ method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+ method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+ method public boolean onCreate();
+ method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+ method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+ }
+
+ public final class IntentCompat {
+ method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+ method public static android.content.Intent makeMainSelectorActivity(String, String);
+ field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+ field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+ field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+ field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+ field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+ }
+
+ public final class LocusIdCompat {
+ ctor public LocusIdCompat(String);
+ method public String getId();
+ method @RequiresApi(29) public android.content.LocusId toLocusId();
+ method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+ }
+
+ public final class MimeTypeFilter {
+ method public static boolean matches(String?, String);
+ method public static String? matches(String?, String![]);
+ method public static String? matches(String![]?, String);
+ method public static String![] matchesMany(String![]?, String);
+ }
+
+ public final class PackageManagerCompat {
+ method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+ field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+ }
+
+ public final class PermissionChecker {
+ method public static int checkCallingOrSelfPermission(android.content.Context, String);
+ method public static int checkCallingPermission(android.content.Context, String, String?);
+ method public static int checkPermission(android.content.Context, String, int, int, String?);
+ method public static int checkSelfPermission(android.content.Context, String);
+ field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+ field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+ field public static final int PERMISSION_GRANTED = 0; // 0x0
+ }
+
+ @Deprecated public final class SharedPreferencesCompat {
+ }
+
+ @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+ method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+ method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+ }
+
+ public class UnusedAppRestrictionsBackportCallback {
+ method public void onResult(boolean, boolean) throws android.os.RemoteException;
+ }
+
+ public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+ ctor public UnusedAppRestrictionsBackportService();
+ method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+ method public android.os.IBinder? onBind(android.content.Intent?);
+ field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+ }
+
+ public final class UnusedAppRestrictionsConstants {
+ field public static final int API_30 = 4; // 0x4
+ field public static final int API_30_BACKPORT = 3; // 0x3
+ field public static final int API_31 = 5; // 0x5
+ field public static final int DISABLED = 2; // 0x2
+ field public static final int ERROR = 0; // 0x0
+ field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+ }
+
+}
+
+package androidx.core.content.pm {
+
+ @Deprecated public final class ActivityInfoCompat {
+ field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+ }
+
+ public final class PackageInfoCompat {
+ method public static long getLongVersionCode(android.content.pm.PackageInfo);
+ method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+ }
+
+ public final class PermissionInfoCompat {
+ method public static int getProtection(android.content.pm.PermissionInfo);
+ method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+ }
+
+ public class ShortcutInfoCompat {
+ method public android.content.ComponentName? getActivity();
+ method public java.util.Set<java.lang.String!>? getCategories();
+ method public CharSequence? getDisabledMessage();
+ method public int getDisabledReason();
+ method public android.os.PersistableBundle? getExtras();
+ method public String getId();
+ method public android.content.Intent getIntent();
+ method public android.content.Intent![] getIntents();
+ method public long getLastChangedTimestamp();
+ method public androidx.core.content.LocusIdCompat? getLocusId();
+ method public CharSequence? getLongLabel();
+ method public String getPackage();
+ method public int getRank();
+ method public CharSequence getShortLabel();
+ method public android.os.UserHandle? getUserHandle();
+ method public boolean hasKeyFieldsOnly();
+ method public boolean isCached();
+ method public boolean isDeclaredInManifest();
+ method public boolean isDynamic();
+ method public boolean isEnabled();
+ method public boolean isImmutable();
+ method public boolean isPinned();
+ method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+ }
+
+ public static class ShortcutInfoCompat.Builder {
+ ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+ method public androidx.core.content.pm.ShortcutInfoCompat build();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+ 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);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+ }
+
+ public class ShortcutManagerCompat {
+ method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+ method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+ method public static int getIconMaxHeight(android.content.Context);
+ method public static int getIconMaxWidth(android.content.Context);
+ method public static int getMaxShortcutCountPerActivity(android.content.Context);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+ method public static boolean isRateLimitingActive(android.content.Context);
+ method public static boolean isRequestPinShortcutSupported(android.content.Context);
+ method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static void removeAllDynamicShortcuts(android.content.Context);
+ method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+ method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+ method public static void reportShortcutUsed(android.content.Context, String);
+ method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+ method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+ field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+ field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+ field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+ field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class ConfigurationHelper {
+ method public static int getDensityDpi(android.content.res.Resources);
+ }
+
+ public final class ResourcesCompat {
+ method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static float getFloat(android.content.res.Resources, @DimenRes int);
+ method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+ field @AnyRes public static final int ID_NULL = 0; // 0x0
+ }
+
+ public abstract static class ResourcesCompat.FontCallback {
+ ctor public ResourcesCompat.FontCallback();
+ method public abstract void onFontRetrievalFailed(int);
+ method public abstract void onFontRetrieved(android.graphics.Typeface);
+ }
+
+ public static final class ResourcesCompat.ThemeCompat {
+ method public static void rebase(android.content.res.Resources.Theme);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorWindowCompat {
+ method public static android.database.CursorWindow create(String?, long);
+ }
+
+ @Deprecated public final class DatabaseUtilsCompat {
+ method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+ method @Deprecated public static String! concatenateWhere(String!, String!);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteCursorCompat {
+ method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapCompat {
+ method public static int getAllocationByteCount(android.graphics.Bitmap);
+ method public static boolean hasMipMap(android.graphics.Bitmap);
+ method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+ }
+
+ public class BlendModeColorFilterCompat {
+ method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+ }
+
+ public enum BlendModeCompat {
+ enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+ }
+
+ public final class ColorUtils {
+ method @ColorInt public static int HSLToColor(float[]);
+ method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+ method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+ method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+ method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+ method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+ method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+ method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+ method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+ method public static double calculateContrast(@ColorInt int, @ColorInt int);
+ method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+ method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+ method public static void colorToHSL(@ColorInt int, float[]);
+ method public static void colorToLAB(@ColorInt int, double[]);
+ method public static void colorToXYZ(@ColorInt int, double[]);
+ method public static int compositeColors(@ColorInt int, @ColorInt int);
+ method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+ method public static double distanceEuclidean(double[], double[]);
+ method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+ }
+
+ public final class Insets {
+ method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets of(int, int, int, int);
+ method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+ method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+ method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+ field public static final androidx.core.graphics.Insets NONE;
+ field public final int bottom;
+ field public final int left;
+ field public final int right;
+ field public final int top;
+ }
+
+ public final class PaintCompat {
+ method public static boolean hasGlyph(android.graphics.Paint, String);
+ method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+ }
+
+ public final class PathSegment {
+ ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+ method public android.graphics.PointF getEnd();
+ method public float getEndFraction();
+ method public android.graphics.PointF getStart();
+ method public float getStartFraction();
+ }
+
+ public final class PathUtils {
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+ }
+
+ public class TypefaceCompat {
+ method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class DrawableCompat {
+ method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+ method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+ method public static void clearColorFilter(android.graphics.drawable.Drawable);
+ method public static int getAlpha(android.graphics.drawable.Drawable);
+ method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+ method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+ method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+ method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+ method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+ method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+ method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+ method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+ method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+ method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+ method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+ method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+ method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+ }
+
+ public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+ method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+ method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+ method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+ method @IdRes public int getResId();
+ method public String getResPackage();
+ method public int getType();
+ method public android.net.Uri getUri();
+ method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+ method public void onPostParceling();
+ method public void onPreParceling(boolean);
+ method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+ method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+ method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+ method public android.os.Bundle toBundle();
+ method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+ method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+ field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+ field public static final int TYPE_BITMAP = 1; // 0x1
+ field public static final int TYPE_DATA = 3; // 0x3
+ field public static final int TYPE_RESOURCE = 2; // 0x2
+ field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+ field public static final int TYPE_URI = 4; // 0x4
+ field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+ }
+
+ public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.Bitmap? getBitmap();
+ method public float getCornerRadius();
+ method public int getGravity();
+ method public int getOpacity();
+ method public final android.graphics.Paint getPaint();
+ method public boolean hasAntiAlias();
+ method public boolean hasMipMap();
+ method public boolean isCircular();
+ method public void setAlpha(int);
+ method public void setAntiAlias(boolean);
+ method public void setCircular(boolean);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setCornerRadius(float);
+ method public void setDither(boolean);
+ method public void setGravity(int);
+ method public void setMipMap(boolean);
+ method public void setTargetDensity(android.graphics.Canvas);
+ method public void setTargetDensity(android.util.DisplayMetrics);
+ method public void setTargetDensity(int);
+ }
+
+ public final class RoundedBitmapDrawableFactory {
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+ }
+
+}
+
+package androidx.core.hardware.display {
+
+ public final class DisplayManagerCompat {
+ method public android.view.Display? getDisplay(int);
+ method public android.view.Display![] getDisplays();
+ method public android.view.Display![] getDisplays(String?);
+ method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+ field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+ }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+ @Deprecated public class FingerprintManagerCompat {
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+ method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+ }
+
+ @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+ method @Deprecated public void onAuthenticationError(int, CharSequence!);
+ method @Deprecated public void onAuthenticationFailed();
+ method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+ method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+ }
+
+ @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+ method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+ }
+
+ @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+ method @Deprecated public javax.crypto.Cipher? getCipher();
+ method @Deprecated public javax.crypto.Mac? getMac();
+ method @Deprecated public java.security.Signature? getSignature();
+ }
+
+}
+
+package androidx.core.location {
+
+ public abstract class GnssStatusCompat {
+ method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+ method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+ method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+ method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+ method public abstract int getConstellationType(@IntRange(from=0) int);
+ method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+ method @IntRange(from=0) public abstract int getSatelliteCount();
+ method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+ method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+ method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+ method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+ method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+ method public abstract boolean usedInFix(@IntRange(from=0) int);
+ method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+ method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+ field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+ field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+ field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+ field public static final int CONSTELLATION_GPS = 1; // 0x1
+ field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+ field public static final int CONSTELLATION_QZSS = 4; // 0x4
+ field public static final int CONSTELLATION_SBAS = 2; // 0x2
+ field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+ }
+
+ public abstract static class GnssStatusCompat.Callback {
+ ctor public GnssStatusCompat.Callback();
+ method public void onFirstFix(@IntRange(from=0) int);
+ method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+ method public void onStarted();
+ method public void onStopped();
+ }
+
+ public final class LocationCompat {
+ method public static float getBearingAccuracyDegrees(android.location.Location);
+ method public static long getElapsedRealtimeMillis(android.location.Location);
+ method public static long getElapsedRealtimeNanos(android.location.Location);
+ method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+ method public static float getVerticalAccuracyMeters(android.location.Location);
+ method public static boolean hasBearingAccuracy(android.location.Location);
+ method public static boolean hasSpeedAccuracy(android.location.Location);
+ method public static boolean hasVerticalAccuracy(android.location.Location);
+ method public static boolean isMock(android.location.Location);
+ method public static void setBearingAccuracyDegrees(android.location.Location, float);
+ method public static void setMock(android.location.Location, boolean);
+ method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+ method public static void setVerticalAccuracyMeters(android.location.Location, float);
+ field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+ field public static final String EXTRA_IS_MOCK = "mockLocation";
+ field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+ field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+ }
+
+ public interface LocationListenerCompat extends android.location.LocationListener {
+ method public default void onStatusChanged(String, int, android.os.Bundle?);
+ }
+
+ public final class LocationManagerCompat {
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+ method public static String? getGnssHardwareModelName(android.location.LocationManager);
+ method public static int getGnssYearOfHardware(android.location.LocationManager);
+ method public static boolean hasProvider(android.location.LocationManager, String);
+ method public static boolean isLocationEnabled(android.location.LocationManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+ method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+ }
+
+ public final class LocationRequestCompat {
+ method @IntRange(from=1) public long getDurationMillis();
+ method @IntRange(from=0) public long getIntervalMillis();
+ method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+ method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+ method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+ method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+ method public int getQuality();
+ method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+ method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+ field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+ field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+ field public static final int QUALITY_LOW_POWER = 104; // 0x68
+ }
+
+ public static final class LocationRequestCompat.Builder {
+ ctor public LocationRequestCompat.Builder(long);
+ ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+ method public androidx.core.location.LocationRequestCompat build();
+ method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+ method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+ method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+ method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+ }
+
+}
+
+package androidx.core.math {
+
+ public class MathUtils {
+ method public static int addExact(int, int);
+ method public static long addExact(long, long);
+ method public static float clamp(float, float, float);
+ method public static double clamp(double, double, double);
+ method public static int clamp(int, int, int);
+ method public static long clamp(long, long, long);
+ method public static int decrementExact(int);
+ method public static long decrementExact(long);
+ method public static int incrementExact(int);
+ method public static long incrementExact(long);
+ method public static int multiplyExact(int, int);
+ method public static long multiplyExact(long, long);
+ method public static int negateExact(int);
+ method public static long negateExact(long);
+ method public static int subtractExact(int, int);
+ method public static long subtractExact(long, long);
+ method public static int toIntExact(long);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class ConnectivityManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+ method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+ }
+
+ public final class MailTo {
+ method public String? getBcc();
+ method public String? getBody();
+ method public String? getCc();
+ method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+ method public String? getSubject();
+ method public String? getTo();
+ method public static boolean isMailTo(String?);
+ method public static boolean isMailTo(android.net.Uri?);
+ method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+ method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+ field public static final String MAILTO_SCHEME = "mailto:";
+ }
+
+ public class ParseException extends java.lang.RuntimeException {
+ field public final String response;
+ }
+
+ public final class TrafficStatsCompat {
+ method @Deprecated public static void clearThreadStatsTag();
+ method @Deprecated public static int getThreadStatsTag();
+ method @Deprecated public static void incrementOperationCount(int);
+ method @Deprecated public static void incrementOperationCount(int, int);
+ method @Deprecated public static void setThreadStatsTag(int);
+ method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+ method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+ }
+
+ public final class UriCompat {
+ method public static String toSafeString(android.net.Uri);
+ }
+
+}
+
+package androidx.core.os {
+
+ public class BuildCompat {
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+ method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+ }
+
+ public final class CancellationSignal {
+ ctor public CancellationSignal();
+ method public void cancel();
+ method public Object? getCancellationSignalObject();
+ method public boolean isCanceled();
+ method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+ method public void throwIfCanceled();
+ }
+
+ public static interface CancellationSignal.OnCancelListener {
+ method public void onCancel();
+ }
+
+ public final class ConfigurationCompat {
+ method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+ }
+
+ public final class EnvironmentCompat {
+ method public static String getStorageState(java.io.File);
+ field public static final String MEDIA_UNKNOWN = "unknown";
+ }
+
+ public final class ExecutorCompat {
+ method public static java.util.concurrent.Executor create(android.os.Handler);
+ }
+
+ public final class HandlerCompat {
+ method public static android.os.Handler createAsync(android.os.Looper);
+ method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+ method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+ method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+ }
+
+ public final class LocaleListCompat {
+ method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+ method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+ method public java.util.Locale! get(int);
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+ method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+ method public java.util.Locale? getFirstMatch(String![]);
+ method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+ method public boolean isEmpty();
+ method @IntRange(from=0) public int size();
+ method public String toLanguageTags();
+ method public Object? unwrap();
+ method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+ method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+ }
+
+ public final class MessageCompat {
+ method public static boolean isAsynchronous(android.os.Message);
+ method public static void setAsynchronous(android.os.Message, boolean);
+ }
+
+ public class OperationCanceledException extends java.lang.RuntimeException {
+ ctor public OperationCanceledException();
+ ctor public OperationCanceledException(String?);
+ }
+
+ public final class ParcelCompat {
+ method public static boolean readBoolean(android.os.Parcel);
+ method public static void writeBoolean(android.os.Parcel, boolean);
+ }
+
+ @Deprecated public final class ParcelableCompat {
+ method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+ }
+
+ @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+ method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+ method @Deprecated public T![]! newArray(int);
+ }
+
+ public final class ProcessCompat {
+ method public static boolean isApplicationUid(int);
+ }
+
+ @Deprecated public final class TraceCompat {
+ method @Deprecated public static void beginAsyncSection(String, int);
+ method @Deprecated public static void beginSection(String);
+ method @Deprecated public static void endAsyncSection(String, int);
+ method @Deprecated public static void endSection();
+ method @Deprecated public static boolean isEnabled();
+ method @Deprecated public static void setCounter(String, int);
+ }
+
+ @RequiresApi(17) public class UserHandleCompat {
+ method public static android.os.UserHandle getUserHandleForUid(int);
+ }
+
+ public class UserManagerCompat {
+ method public static boolean isUserUnlocked(android.content.Context);
+ }
+
+}
+
+package androidx.core.provider {
+
+ public final class DocumentsContractCompat {
+ method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+ method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri? buildDocumentUri(String, String);
+ method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri? buildTreeDocumentUri(String, String);
+ method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+ method public static String? getDocumentId(android.net.Uri);
+ method public static String? getTreeDocumentId(android.net.Uri);
+ method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+ method public static boolean isTreeUri(android.net.Uri);
+ method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+ }
+
+ public static final class DocumentsContractCompat.DocumentCompat {
+ field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+ }
+
+ public final class FontRequest {
+ ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+ ctor public FontRequest(String, String, String, @ArrayRes int);
+ method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+ method @ArrayRes public int getCertificatesArrayResId();
+ method public String getProviderAuthority();
+ method public String getProviderPackage();
+ method public String getQuery();
+ }
+
+ public class FontsContractCompat {
+ method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+ method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+ }
+
+ public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+ ctor public FontsContractCompat.Columns();
+ field public static final String FILE_ID = "file_id";
+ field public static final String ITALIC = "font_italic";
+ field public static final String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
+ field public static final String TTC_INDEX = "font_ttc_index";
+ field public static final String VARIATION_SETTINGS = "font_variation_settings";
+ field public static final String WEIGHT = "font_weight";
+ }
+
+ public static class FontsContractCompat.FontFamilyResult {
+ method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+ method public int getStatusCode();
+ field public static final int STATUS_OK = 0; // 0x0
+ field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+ field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+ }
+
+ public static class FontsContractCompat.FontInfo {
+ method public int getResultCode();
+ method @IntRange(from=0) public int getTtcIndex();
+ method public android.net.Uri getUri();
+ method @IntRange(from=1, to=1000) public int getWeight();
+ method public boolean isItalic();
+ }
+
+ public static class FontsContractCompat.FontRequestCallback {
+ ctor public FontsContractCompat.FontRequestCallback();
+ method public void onTypefaceRequestFailed(int);
+ method public void onTypefaceRetrieved(android.graphics.Typeface!);
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+ }
+
+}
+
+package androidx.core.telephony {
+
+ @RequiresApi(22) public class SubscriptionManagerCompat {
+ method public static int getSlotIndex(int);
+ }
+
+ public class TelephonyManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+ method public static int getSubscriptionId(android.telephony.TelephonyManager);
+ }
+
+}
+
+package androidx.core.telephony.mbms {
+
+ public final class MbmsHelper {
+ method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class BidiFormatter {
+ method public static androidx.core.text.BidiFormatter! getInstance();
+ method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+ method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+ method public boolean getStereoReset();
+ method public boolean isRtl(String!);
+ method public boolean isRtl(CharSequence!);
+ method public boolean isRtlContext();
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public String! unicodeWrap(String!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, boolean);
+ method public String! unicodeWrap(String!);
+ method public CharSequence! unicodeWrap(CharSequence!);
+ }
+
+ public static final class BidiFormatter.Builder {
+ ctor public BidiFormatter.Builder();
+ ctor public BidiFormatter.Builder(boolean);
+ ctor public BidiFormatter.Builder(java.util.Locale!);
+ method public androidx.core.text.BidiFormatter! build();
+ method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+ method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+ }
+
+ public final class HtmlCompat {
+ method public static android.text.Spanned fromHtml(String, int);
+ method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+ method public static String toHtml(android.text.Spanned, int);
+ field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+ field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+ field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+ field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+ field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+ }
+
+ public final class ICUCompat {
+ method public static String? maximizeAndGetScript(java.util.Locale!);
+ }
+
+ public class PrecomputedTextCompat implements android.text.Spannable {
+ method public char charAt(int);
+ method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+ method @IntRange(from=0) public int getParagraphCount();
+ method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+ method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+ method public int getSpanEnd(Object!);
+ method public int getSpanFlags(Object!);
+ method public int getSpanStart(Object!);
+ method public <T> T![]! getSpans(int, int, Class<T!>!);
+ method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+ method public int length();
+ method public int nextSpanTransition(int, int, Class!);
+ method public void removeSpan(Object!);
+ method public void setSpan(Object!, int, int, int);
+ method public CharSequence! subSequence(int, int);
+ }
+
+ public static final class PrecomputedTextCompat.Params {
+ ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+ method @RequiresApi(23) public int getBreakStrategy();
+ method @RequiresApi(23) public int getHyphenationFrequency();
+ method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+ method public android.text.TextPaint getTextPaint();
+ }
+
+ public static class PrecomputedTextCompat.Params.Builder {
+ ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+ method public androidx.core.text.PrecomputedTextCompat.Params build();
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+ method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+ }
+
+ public interface TextDirectionHeuristicCompat {
+ method public boolean isRtl(char[]!, int, int);
+ method public boolean isRtl(CharSequence!, int, int);
+ }
+
+ public final class TextDirectionHeuristicsCompat {
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+ }
+
+ public final class TextUtilsCompat {
+ method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+ method public static String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.text.util {
+
+ public final class LinkifyCompat {
+ method public static boolean addLinks(android.text.Spannable, int);
+ method public static boolean addLinks(android.widget.TextView, int);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ }
+
+}
+
+package androidx.core.util {
+
+ public class AtomicFile {
+ ctor public AtomicFile(java.io.File);
+ method public void delete();
+ method public void failWrite(java.io.FileOutputStream?);
+ method public void finishWrite(java.io.FileOutputStream?);
+ method public java.io.File getBaseFile();
+ method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+ method public byte[] readFully() throws java.io.IOException;
+ method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+ }
+
+ public interface Consumer<T> {
+ method public void accept(T!);
+ }
+
+ public class ObjectsCompat {
+ method public static boolean equals(Object?, Object?);
+ method public static int hash(java.lang.Object!...);
+ method public static int hashCode(Object?);
+ method public static <T> T requireNonNull(T?);
+ method public static <T> T requireNonNull(T?, String);
+ method public static String? toString(Object?, String?);
+ }
+
+ public class Pair<F, S> {
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
+ }
+
+ public final class PatternsCompat {
+ field public static final java.util.regex.Pattern DOMAIN_NAME;
+ field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+ field public static final java.util.regex.Pattern IP_ADDRESS;
+ field public static final java.util.regex.Pattern WEB_URL;
+ }
+
+ public final class Pools {
+ }
+
+ public static interface Pools.Pool<T> {
+ method public T? acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+ ctor public Pools.SimplePool(int);
+ method public T! acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+ ctor public Pools.SynchronizedPool(int);
+ }
+
+ public interface Predicate<T> {
+ method public boolean test(T!);
+ }
+
+ public interface Supplier<T> {
+ method public T! get();
+ }
+
+}
+
+package androidx.core.view {
+
+ public class AccessibilityDelegateCompat {
+ ctor public AccessibilityDelegateCompat();
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+ method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+ method public void sendAccessibilityEvent(android.view.View!, int);
+ method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public abstract class ActionProvider {
+ ctor public ActionProvider(android.content.Context!);
+ method public android.content.Context! getContext();
+ method public boolean hasSubMenu();
+ method public boolean isVisible();
+ method public abstract android.view.View! onCreateActionView();
+ method public android.view.View! onCreateActionView(android.view.MenuItem!);
+ method public boolean onPerformDefaultAction();
+ method public void onPrepareSubMenu(android.view.SubMenu!);
+ method public boolean overridesItemVisibility();
+ method public void refreshVisibility();
+ method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+ }
+
+ public static interface ActionProvider.VisibilityListener {
+ method public void onActionProviderVisibilityChanged(boolean);
+ }
+
+ public final class ContentInfoCompat {
+ method public android.content.ClipData getClip();
+ method public android.os.Bundle? getExtras();
+ method public int getFlags();
+ method public android.net.Uri? getLinkUri();
+ method public int getSource();
+ method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+ method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+ method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+ method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+ field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+ field public static final int SOURCE_APP = 0; // 0x0
+ field public static final int SOURCE_AUTOFILL = 4; // 0x4
+ field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+ field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+ field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+ field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+ }
+
+ public static final class ContentInfoCompat.Builder {
+ ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+ ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+ method public androidx.core.view.ContentInfoCompat build();
+ method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+ method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+ method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+ method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+ method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+ }
+
+ public final class DisplayCompat {
+ method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+ method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+ }
+
+ public static final class DisplayCompat.ModeCompat {
+ method public int getPhysicalHeight();
+ method public int getPhysicalWidth();
+ method @Deprecated public boolean isNative();
+ method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+ }
+
+ public final class DisplayCutoutCompat {
+ ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+ ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+ method public java.util.List<android.graphics.Rect!> getBoundingRects();
+ method public int getSafeInsetBottom();
+ method public int getSafeInsetLeft();
+ method public int getSafeInsetRight();
+ method public int getSafeInsetTop();
+ method public androidx.core.graphics.Insets getWaterfallInsets();
+ }
+
+ public final class DragAndDropPermissionsCompat {
+ method public void release();
+ }
+
+ public class DragStartHelper {
+ ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+ method public void attach();
+ method public void detach();
+ method public void getTouchPosition(android.graphics.Point!);
+ method public boolean onLongClick(android.view.View!);
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ }
+
+ public static interface DragStartHelper.OnDragStartListener {
+ method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+ }
+
+ public final class GestureDetectorCompat {
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+ method public boolean isLongpressEnabled();
+ method public boolean onTouchEvent(android.view.MotionEvent!);
+ method public void setIsLongpressEnabled(boolean);
+ method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+ }
+
+ public final class GravityCompat {
+ method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+ method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static int getAbsoluteGravity(int, int);
+ field public static final int END = 8388613; // 0x800005
+ field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+ field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+ field public static final int START = 8388611; // 0x800003
+ }
+
+ public final class InputDeviceCompat {
+ field public static final int SOURCE_ANY = -256; // 0xffffff00
+ field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+ field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+ field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+ field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+ field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+ field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+ field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+ field public static final int SOURCE_DPAD = 513; // 0x201
+ field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+ field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+ field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+ field public static final int SOURCE_KEYBOARD = 257; // 0x101
+ field public static final int SOURCE_MOUSE = 8194; // 0x2002
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+ field public static final int SOURCE_STYLUS = 16386; // 0x4002
+ field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+ field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+ field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+ field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+ field public static final int SOURCE_UNKNOWN = 0; // 0x0
+ }
+
+ public final class LayoutInflaterCompat {
+ method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+ method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+ method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+ }
+
+ @Deprecated public interface LayoutInflaterFactory {
+ method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+ }
+
+ public final class MarginLayoutParamsCompat {
+ method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+ method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+ method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+ }
+
+ public final class MenuCompat {
+ method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ }
+
+ public interface MenuHost {
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void invalidateMenu();
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ }
+
+ public class MenuHostHelper {
+ ctor public MenuHostHelper(Runnable);
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+ method public boolean onMenuItemSelected(android.view.MenuItem);
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ }
+
+ public final class MenuItemCompat {
+ method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+ method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+ method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+ method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+ method public static int getAlphabeticModifiers(android.view.MenuItem!);
+ method public static CharSequence! getContentDescription(android.view.MenuItem!);
+ method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+ method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+ method public static int getNumericModifiers(android.view.MenuItem!);
+ method public static CharSequence! getTooltipText(android.view.MenuItem!);
+ method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+ method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+ method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+ method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+ method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+ method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+ method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+ method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+ method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+ field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+ field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+ field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+ field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+ field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+ }
+
+ @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+ method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+ method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+ }
+
+ public interface MenuProvider {
+ method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+ method public boolean onMenuItemSelected(android.view.MenuItem);
+ }
+
+ public final class MotionEventCompat {
+ method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+ method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+ method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+ method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+ method @Deprecated public static int getSource(android.view.MotionEvent!);
+ method @Deprecated public static float getX(android.view.MotionEvent!, int);
+ method @Deprecated public static float getY(android.view.MotionEvent!, int);
+ method public static boolean isFromSource(android.view.MotionEvent!, int);
+ field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+ field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+ field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+ field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+ field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+ field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+ field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+ field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+ field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+ field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+ field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+ field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+ field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+ field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+ field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+ field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+ field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+ field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+ field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+ field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+ field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+ field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+ field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+ field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+ field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+ field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+ field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+ field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+ field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+ field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+ field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+ field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+ field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+ field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+ field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+ field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+ field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+ field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+ field @Deprecated public static final int AXIS_RX = 12; // 0xc
+ field @Deprecated public static final int AXIS_RY = 13; // 0xd
+ field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
+ field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+ field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+ field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+ field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+ field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+ field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+ field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+ field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+ field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+ field @Deprecated public static final int AXIS_X = 0; // 0x0
+ field @Deprecated public static final int AXIS_Y = 1; // 0x1
+ field @Deprecated public static final int AXIS_Z = 11; // 0xb
+ field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+ }
+
+ public interface NestedScrollingChild {
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean isNestedScrollingEnabled();
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(int);
+ method public void stopNestedScroll();
+ }
+
+ public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+ }
+
+ public class NestedScrollingChildHelper {
+ ctor public NestedScrollingChildHelper(android.view.View);
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isNestedScrollingEnabled();
+ method public void onDetachedFromWindow();
+ method public void onStopNestedScroll(android.view.View);
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll();
+ method public void stopNestedScroll(int);
+ }
+
+ public interface NestedScrollingParent {
+ method public int getNestedScrollAxes();
+ method public boolean onNestedFling(android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(android.view.View, float, float);
+ method public void onNestedPreScroll(android.view.View, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+ method public void onStopNestedScroll(android.view.View);
+ }
+
+ public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+ method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, int);
+ }
+
+ public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+ method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+ }
+
+ public class NestedScrollingParentHelper {
+ ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+ method public int getNestedScrollAxes();
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View);
+ method public void onStopNestedScroll(android.view.View, int);
+ }
+
+ public interface OnApplyWindowInsetsListener {
+ method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+ }
+
+ public interface OnReceiveContentListener {
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ }
+
+ public interface OnReceiveContentViewBehavior {
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ }
+
+ public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+ method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+ method public boolean onPreDraw();
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ method public void removeListener();
+ }
+
+ public final class PointerIconCompat {
+ method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+ method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+ method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+ field public static final int TYPE_ALIAS = 1010; // 0x3f2
+ field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+ field public static final int TYPE_ARROW = 1000; // 0x3e8
+ field public static final int TYPE_CELL = 1006; // 0x3ee
+ field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+ field public static final int TYPE_COPY = 1011; // 0x3f3
+ field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+ field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+ field public static final int TYPE_GRAB = 1020; // 0x3fc
+ field public static final int TYPE_GRABBING = 1021; // 0x3fd
+ field public static final int TYPE_HAND = 1002; // 0x3ea
+ field public static final int TYPE_HELP = 1003; // 0x3eb
+ field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+ field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+ field public static final int TYPE_NULL = 0; // 0x0
+ field public static final int TYPE_TEXT = 1008; // 0x3f0
+ field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+ field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+ field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+ field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+ field public static final int TYPE_WAIT = 1004; // 0x3ec
+ field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+ field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+ }
+
+ public final class ScaleGestureDetectorCompat {
+ method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+ method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+ method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+ method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+ }
+
+ public interface ScrollingView {
+ method public int computeHorizontalScrollExtent();
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ }
+
+ public interface TintableBackgroundView {
+ method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @Deprecated public final class VelocityTrackerCompat {
+ method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+ method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+ }
+
+ public class ViewCompat {
+ ctor @Deprecated protected ViewCompat();
+ method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+ method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+ method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+ method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+ method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+ method public static void cancelDragAndDrop(android.view.View);
+ method @Deprecated public static int combineMeasuredStates(int, int);
+ method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+ method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+ method public static void dispatchFinishTemporaryDetach(android.view.View);
+ method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+ method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+ method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+ method public static void dispatchStartTemporaryDetach(android.view.View);
+ method public static void enableAccessibleClickableSpanSupport(android.view.View);
+ method public static int generateViewId();
+ method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+ method public static int getAccessibilityLiveRegion(android.view.View);
+ method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+ method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+ method @Deprecated public static float getAlpha(android.view.View!);
+ method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+ method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+ method public static android.graphics.Rect? getClipBounds(android.view.View);
+ method public static android.view.Display? getDisplay(android.view.View);
+ method public static float getElevation(android.view.View);
+ method public static boolean getFitsSystemWindows(android.view.View);
+ method public static int getImportantForAccessibility(android.view.View);
+ method public static int getImportantForAutofill(android.view.View);
+ method public static int getLabelFor(android.view.View);
+ method @Deprecated public static int getLayerType(android.view.View!);
+ method public static int getLayoutDirection(android.view.View);
+ method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+ method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+ method @Deprecated public static int getMeasuredState(android.view.View!);
+ method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+ method public static int getMinimumHeight(android.view.View);
+ method public static int getMinimumWidth(android.view.View);
+ method public static int getNextClusterForwardId(android.view.View);
+ method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+ method @Deprecated public static int getOverScrollMode(android.view.View!);
+ method @Px public static int getPaddingEnd(android.view.View);
+ method @Px public static int getPaddingStart(android.view.View);
+ method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+ method @Deprecated public static float getPivotX(android.view.View!);
+ method @Deprecated public static float getPivotY(android.view.View!);
+ method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+ method @Deprecated public static float getRotation(android.view.View!);
+ method @Deprecated public static float getRotationX(android.view.View!);
+ method @Deprecated public static float getRotationY(android.view.View!);
+ method @Deprecated public static float getScaleX(android.view.View!);
+ method @Deprecated public static float getScaleY(android.view.View!);
+ method public static int getScrollIndicators(android.view.View);
+ method @UiThread public static CharSequence? getStateDescription(android.view.View);
+ method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+ method public static String? getTransitionName(android.view.View);
+ method @Deprecated public static float getTranslationX(android.view.View!);
+ method @Deprecated public static float getTranslationY(android.view.View!);
+ method public static float getTranslationZ(android.view.View);
+ method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+ method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+ method @Deprecated public static float getX(android.view.View!);
+ method @Deprecated public static float getY(android.view.View!);
+ method public static float getZ(android.view.View);
+ method public static boolean hasAccessibilityDelegate(android.view.View);
+ method public static boolean hasExplicitFocusable(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View, int);
+ method public static boolean hasOnClickListeners(android.view.View);
+ method public static boolean hasOverlappingRendering(android.view.View);
+ method public static boolean hasTransientState(android.view.View);
+ method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+ method public static boolean isAttachedToWindow(android.view.View);
+ method public static boolean isFocusedByDefault(android.view.View);
+ method public static boolean isImportantForAccessibility(android.view.View);
+ method public static boolean isImportantForAutofill(android.view.View);
+ method public static boolean isInLayout(android.view.View);
+ method public static boolean isKeyboardNavigationCluster(android.view.View);
+ method public static boolean isLaidOut(android.view.View);
+ method public static boolean isLayoutDirectionResolved(android.view.View);
+ method public static boolean isNestedScrollingEnabled(android.view.View);
+ method @Deprecated public static boolean isOpaque(android.view.View!);
+ method public static boolean isPaddingRelative(android.view.View);
+ method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+ method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+ method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+ method public static void offsetLeftAndRight(android.view.View, int);
+ method public static void offsetTopAndBottom(android.view.View, int);
+ method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+ method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+ method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+ method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ method public static void postInvalidateOnAnimation(android.view.View);
+ method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+ method public static void postOnAnimation(android.view.View, Runnable);
+ method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+ method public static void removeAccessibilityAction(android.view.View, int);
+ method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+ method public static void requestApplyInsets(android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+ method @Deprecated public static int resolveSizeAndState(int, int, int);
+ method public static boolean restoreDefaultFocus(android.view.View);
+ method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+ method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+ method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+ method public static void setAccessibilityLiveRegion(android.view.View, int);
+ method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+ method @Deprecated public static void setActivated(android.view.View!, boolean);
+ method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+ method public static void setAutofillHints(android.view.View, java.lang.String!...);
+ method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+ method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+ method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+ method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+ method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+ method public static void setElevation(android.view.View, float);
+ method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+ method public static void setFocusedByDefault(android.view.View, boolean);
+ method public static void setHasTransientState(android.view.View, boolean);
+ method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+ method public static void setImportantForAutofill(android.view.View, int);
+ method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+ method public static void setLabelFor(android.view.View, @IdRes int);
+ method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+ method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+ method public static void setLayoutDirection(android.view.View, int);
+ method public static void setNestedScrollingEnabled(android.view.View, boolean);
+ method public static void setNextClusterForwardId(android.view.View, int);
+ method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+ method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+ method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+ method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+ method @Deprecated public static void setPivotX(android.view.View!, float);
+ method @Deprecated public static void setPivotY(android.view.View!, float);
+ method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+ method @Deprecated public static void setRotation(android.view.View!, float);
+ method @Deprecated public static void setRotationX(android.view.View!, float);
+ method @Deprecated public static void setRotationY(android.view.View!, float);
+ method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+ method @Deprecated public static void setScaleX(android.view.View!, float);
+ method @Deprecated public static void setScaleY(android.view.View!, float);
+ method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+ method public static void setScrollIndicators(android.view.View, int);
+ method public static void setScrollIndicators(android.view.View, int, int);
+ method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+ method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ method public static void setTransitionName(android.view.View, String?);
+ method @Deprecated public static void setTranslationX(android.view.View!, float);
+ method @Deprecated public static void setTranslationY(android.view.View!, float);
+ method public static void setTranslationZ(android.view.View, float);
+ method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+ method @Deprecated public static void setX(android.view.View!, float);
+ method @Deprecated public static void setY(android.view.View!, float);
+ method public static void setZ(android.view.View, float);
+ method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+ method public static boolean startNestedScroll(android.view.View, int);
+ method public static boolean startNestedScroll(android.view.View, int, int);
+ method public static void stopNestedScroll(android.view.View);
+ method public static void stopNestedScroll(android.view.View, int);
+ method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+ field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+ field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+ field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+ field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+ field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+ field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+ field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+ field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+ field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+ field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+ field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+ field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+ field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+ field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+ field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+ field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+ field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+ field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+ field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+ field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+ field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+ field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+ field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+ field public static final int TYPE_NON_TOUCH = 1; // 0x1
+ field public static final int TYPE_TOUCH = 0; // 0x0
+ }
+
+ public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+ method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+ }
+
+ public final class ViewConfigurationCompat {
+ method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+ method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+ method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+ method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+ }
+
+ public final class ViewGroupCompat {
+ method public static int getLayoutMode(android.view.ViewGroup);
+ method public static int getNestedScrollAxes(android.view.ViewGroup);
+ method public static boolean isTransitionGroup(android.view.ViewGroup);
+ method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void setLayoutMode(android.view.ViewGroup, int);
+ method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+ method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+ field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+ field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+ }
+
+ public final class ViewParentCompat {
+ method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+ method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+ method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public final class ViewPropertyAnimatorCompat {
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+ method public void cancel();
+ method public long getDuration();
+ method public android.view.animation.Interpolator! getInterpolator();
+ method public long getStartDelay();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+ method public void start();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+ }
+
+ public interface ViewPropertyAnimatorListener {
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+ ctor public ViewPropertyAnimatorListenerAdapter();
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public interface ViewPropertyAnimatorUpdateListener {
+ method public void onAnimationUpdate(android.view.View!);
+ }
+
+ public final class WindowCompat {
+ method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+ method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+ field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+ field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ }
+
+ public final class WindowInsetsAnimationCompat {
+ ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+ method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+ method public long getDurationMillis();
+ method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+ method public float getInterpolatedFraction();
+ method public android.view.animation.Interpolator? getInterpolator();
+ method public int getTypeMask();
+ method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+ method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+ }
+
+ public static final class WindowInsetsAnimationCompat.BoundsCompat {
+ ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public androidx.core.graphics.Insets getLowerBound();
+ method public androidx.core.graphics.Insets getUpperBound();
+ method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+ method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+ method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+ }
+
+ public abstract static class WindowInsetsAnimationCompat.Callback {
+ ctor public WindowInsetsAnimationCompat.Callback(int);
+ method public final int getDispatchMode();
+ method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+ method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+ method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+ method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+ field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+ field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+ }
+
+ public interface WindowInsetsAnimationControlListenerCompat {
+ method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+ method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+ method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+ }
+
+ public final class WindowInsetsAnimationControllerCompat {
+ method public void finish(boolean);
+ method public float getCurrentAlpha();
+ method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+ method public androidx.core.graphics.Insets getCurrentInsets();
+ method public androidx.core.graphics.Insets getHiddenStateInsets();
+ method public androidx.core.graphics.Insets getShownStateInsets();
+ method public int getTypes();
+ method public boolean isCancelled();
+ method public boolean isFinished();
+ method public boolean isReady();
+ method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+ }
+
+ public class WindowInsetsCompat {
+ ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+ method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+ method public androidx.core.graphics.Insets getInsets(int);
+ method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+ method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+ method @Deprecated public int getStableInsetBottom();
+ method @Deprecated public int getStableInsetLeft();
+ method @Deprecated public int getStableInsetRight();
+ method @Deprecated public int getStableInsetTop();
+ method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+ method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+ method @Deprecated public int getSystemWindowInsetBottom();
+ method @Deprecated public int getSystemWindowInsetLeft();
+ method @Deprecated public int getSystemWindowInsetRight();
+ method @Deprecated public int getSystemWindowInsetTop();
+ method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+ method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+ method public boolean hasInsets();
+ method @Deprecated public boolean hasStableInsets();
+ method @Deprecated public boolean hasSystemWindowInsets();
+ method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+ method public boolean isConsumed();
+ method public boolean isRound();
+ method public boolean isVisible(int);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+ method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+ method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+ method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+ field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+ }
+
+ public static final class WindowInsetsCompat.Builder {
+ ctor public WindowInsetsCompat.Builder();
+ ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+ method public androidx.core.view.WindowInsetsCompat build();
+ method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+ method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+ }
+
+ public static final class WindowInsetsCompat.Type {
+ method public static int captionBar();
+ method public static int displayCutout();
+ method public static int ime();
+ method public static int mandatorySystemGestures();
+ method public static int navigationBars();
+ method public static int statusBars();
+ method public static int systemBars();
+ method public static int systemGestures();
+ method public static int tappableElement();
+ }
+
+ public final class WindowInsetsControllerCompat {
+ ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+ method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+ method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+ method public int getSystemBarsBehavior();
+ method public void hide(int);
+ method public boolean isAppearanceLightNavigationBars();
+ method public boolean isAppearanceLightStatusBars();
+ method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+ method public void setAppearanceLightNavigationBars(boolean);
+ method public void setAppearanceLightStatusBars(boolean);
+ method public void setSystemBarsBehavior(int);
+ method public void show(int);
+ method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+ field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+ field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+ field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+ }
+
+ public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+ method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+ }
+
+}
+
+package androidx.core.view.accessibility {
+
+ public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+ method public void onClick(android.view.View);
+ }
+
+ public final class AccessibilityEventCompat {
+ method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+ method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+ method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+ method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+ method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+ method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+ field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+ field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+ field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+ field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+ field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+ field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+ field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+ field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+ field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+ field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+ field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+ field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+ field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+ field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+ field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+ field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+ field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+ field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+ field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+ field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+ field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+ field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+ field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+ }
+
+ public final class AccessibilityManagerCompat {
+ method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ }
+
+ @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ method @Deprecated public void onAccessibilityStateChanged(boolean);
+ }
+
+ @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+ }
+
+ public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+ method public void onTouchExplorationStateChanged(boolean);
+ }
+
+ public class AccessibilityNodeInfoCompat {
+ ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+ method public void addAction(int);
+ method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public void addChild(android.view.View!);
+ method public void addChild(android.view.View!, int);
+ method public boolean canOpenPopup();
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+ method public int getActions();
+ method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public CharSequence! getClassName();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+ method public CharSequence! getContentDescription();
+ method public int getDrawingOrder();
+ method public CharSequence! getError();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence? getHintText();
+ method @Deprecated public Object! getInfo();
+ method public int getInputType();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+ method public int getLiveRegion();
+ method public int getMaxTextLength();
+ method public int getMovementGranularities();
+ method public CharSequence! getPackageName();
+ method public CharSequence? getPaneTitle();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+ method public CharSequence? getRoleDescription();
+ method public CharSequence? getStateDescription();
+ method public CharSequence! getText();
+ method public int getTextSelectionEnd();
+ method public int getTextSelectionStart();
+ method public CharSequence? getTooltipText();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+ method public String! getViewIdResourceName();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+ method public int getWindowId();
+ method public boolean isAccessibilityFocused();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isClickable();
+ method public boolean isContentInvalid();
+ method public boolean isContextClickable();
+ method public boolean isDismissable();
+ method public boolean isEditable();
+ method public boolean isEnabled();
+ method public boolean isFocusable();
+ method public boolean isFocused();
+ method public boolean isHeading();
+ method public boolean isImportantForAccessibility();
+ method public boolean isLongClickable();
+ method public boolean isMultiLine();
+ method public boolean isPassword();
+ method public boolean isScreenReaderFocusable();
+ method public boolean isScrollable();
+ method public boolean isSelected();
+ method public boolean isShowingHintText();
+ method public boolean isTextEntryKey();
+ method public boolean isVisibleToUser();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public boolean performAction(int);
+ method public boolean performAction(int, android.os.Bundle!);
+ method public void recycle();
+ method public boolean refresh();
+ method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public boolean removeChild(android.view.View!);
+ method public boolean removeChild(android.view.View!, int);
+ method public void setAccessibilityFocused(boolean);
+ method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+ method public void setBoundsInScreen(android.graphics.Rect!);
+ method public void setCanOpenPopup(boolean);
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setClassName(CharSequence!);
+ method public void setClickable(boolean);
+ method public void setCollectionInfo(Object!);
+ method public void setCollectionItemInfo(Object!);
+ method public void setContentDescription(CharSequence!);
+ method public void setContentInvalid(boolean);
+ method public void setContextClickable(boolean);
+ method public void setDismissable(boolean);
+ method public void setDrawingOrder(int);
+ method public void setEditable(boolean);
+ method public void setEnabled(boolean);
+ method public void setError(CharSequence!);
+ method public void setFocusable(boolean);
+ method public void setFocused(boolean);
+ method public void setHeading(boolean);
+ method public void setHintText(CharSequence?);
+ method public void setImportantForAccessibility(boolean);
+ method public void setInputType(int);
+ method public void setLabelFor(android.view.View!);
+ method public void setLabelFor(android.view.View!, int);
+ method public void setLabeledBy(android.view.View!);
+ method public void setLabeledBy(android.view.View!, int);
+ method public void setLiveRegion(int);
+ method public void setLongClickable(boolean);
+ method public void setMaxTextLength(int);
+ method public void setMovementGranularities(int);
+ method public void setMultiLine(boolean);
+ method public void setPackageName(CharSequence!);
+ method public void setPaneTitle(CharSequence?);
+ method public void setParent(android.view.View!);
+ method public void setParent(android.view.View!, int);
+ method public void setPassword(boolean);
+ method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+ method public void setRoleDescription(CharSequence?);
+ method public void setScreenReaderFocusable(boolean);
+ method public void setScrollable(boolean);
+ method public void setSelected(boolean);
+ method public void setShowingHintText(boolean);
+ method public void setSource(android.view.View!);
+ method public void setSource(android.view.View!, int);
+ method public void setStateDescription(CharSequence?);
+ method public void setText(CharSequence!);
+ method public void setTextEntryKey(boolean);
+ method public void setTextSelection(int, int);
+ method public void setTooltipText(CharSequence?);
+ method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+ method public void setTraversalAfter(android.view.View!);
+ method public void setTraversalAfter(android.view.View!, int);
+ method public void setTraversalBefore(android.view.View!);
+ method public void setTraversalBefore(android.view.View!, int);
+ method public void setViewIdResourceName(String!);
+ method public void setVisibleToUser(boolean);
+ method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+ field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+ field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+ field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+ field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+ field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+ field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+ field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+ field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+ field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+ field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+ field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+ field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+ field public static final int ACTION_CLICK = 16; // 0x10
+ field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+ field public static final int ACTION_COPY = 16384; // 0x4000
+ field public static final int ACTION_CUT = 65536; // 0x10000
+ field public static final int ACTION_DISMISS = 1048576; // 0x100000
+ field public static final int ACTION_EXPAND = 262144; // 0x40000
+ field public static final int ACTION_FOCUS = 1; // 0x1
+ field public static final int ACTION_LONG_CLICK = 32; // 0x20
+ field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+ field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+ field public static final int ACTION_PASTE = 32768; // 0x8000
+ field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+ field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+ field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+ field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+ field public static final int ACTION_SELECT = 4; // 0x4
+ field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+ field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+ field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+ field public static final int FOCUS_INPUT = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+ field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+ field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+ field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+ }
+
+ public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+ ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+ method public int getId();
+ method public CharSequence! getLabel();
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+ method public int getColumnCount();
+ method public int getRowCount();
+ method public int getSelectionMode();
+ method public boolean isHierarchical();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+ field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+ field public static final int SELECTION_MODE_NONE = 0; // 0x0
+ field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+ method public int getColumnIndex();
+ method public int getColumnSpan();
+ method public int getRowIndex();
+ method public int getRowSpan();
+ method @Deprecated public boolean isHeading();
+ method public boolean isSelected();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+ }
+
+ public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+ method public float getCurrent();
+ method public float getMax();
+ method public float getMin();
+ method public int getType();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+ field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+ field public static final int RANGE_TYPE_INT = 0; // 0x0
+ field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+ }
+
+ public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+ ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+ method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getRegionCount();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+ }
+
+ public class AccessibilityNodeProviderCompat {
+ ctor public AccessibilityNodeProviderCompat();
+ ctor public AccessibilityNodeProviderCompat(Object!);
+ method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+ method public Object! getProvider();
+ method public boolean performAction(int, int, android.os.Bundle!);
+ field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+ }
+
+ public class AccessibilityRecordCompat {
+ ctor @Deprecated public AccessibilityRecordCompat(Object!);
+ method @Deprecated public boolean equals(Object?);
+ method @Deprecated public int getAddedCount();
+ method @Deprecated public CharSequence! getBeforeText();
+ method @Deprecated public CharSequence! getClassName();
+ method @Deprecated public CharSequence! getContentDescription();
+ method @Deprecated public int getCurrentItemIndex();
+ method @Deprecated public int getFromIndex();
+ method @Deprecated public Object! getImpl();
+ method @Deprecated public int getItemCount();
+ method @Deprecated public int getMaxScrollX();
+ method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public int getMaxScrollY();
+ method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public android.os.Parcelable! getParcelableData();
+ method @Deprecated public int getRemovedCount();
+ method @Deprecated public int getScrollX();
+ method @Deprecated public int getScrollY();
+ method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+ method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+ method @Deprecated public int getToIndex();
+ method @Deprecated public int getWindowId();
+ method @Deprecated public int hashCode();
+ method @Deprecated public boolean isChecked();
+ method @Deprecated public boolean isEnabled();
+ method @Deprecated public boolean isFullScreen();
+ method @Deprecated public boolean isPassword();
+ method @Deprecated public boolean isScrollable();
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+ method @Deprecated public void recycle();
+ method @Deprecated public void setAddedCount(int);
+ method @Deprecated public void setBeforeText(CharSequence!);
+ method @Deprecated public void setChecked(boolean);
+ method @Deprecated public void setClassName(CharSequence!);
+ method @Deprecated public void setContentDescription(CharSequence!);
+ method @Deprecated public void setCurrentItemIndex(int);
+ method @Deprecated public void setEnabled(boolean);
+ method @Deprecated public void setFromIndex(int);
+ method @Deprecated public void setFullScreen(boolean);
+ method @Deprecated public void setItemCount(int);
+ method @Deprecated public void setMaxScrollX(int);
+ method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setMaxScrollY(int);
+ method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setParcelableData(android.os.Parcelable!);
+ method @Deprecated public void setPassword(boolean);
+ method @Deprecated public void setRemovedCount(int);
+ method @Deprecated public void setScrollX(int);
+ method @Deprecated public void setScrollY(int);
+ method @Deprecated public void setScrollable(boolean);
+ method @Deprecated public void setSource(android.view.View!);
+ method @Deprecated public void setSource(android.view.View!, int);
+ method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+ method @Deprecated public void setToIndex(int);
+ }
+
+ public interface AccessibilityViewCommand {
+ method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+ }
+
+ public abstract static class AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.CommandArguments();
+ }
+
+ public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+ method public boolean getExtendSelection();
+ method public int getGranularity();
+ }
+
+ public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveHtmlArguments();
+ method public String! getHTMLElement();
+ }
+
+ public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveWindowArguments();
+ method public int getX();
+ method public int getY();
+ }
+
+ public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+ method public int getColumn();
+ method public int getRow();
+ }
+
+ public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetProgressArguments();
+ method public float getProgress();
+ }
+
+ public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetSelectionArguments();
+ method public int getEnd();
+ method public int getStart();
+ }
+
+ public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetTextArguments();
+ method public CharSequence! getText();
+ }
+
+ public class AccessibilityWindowInfoCompat {
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public int getId();
+ method public int getLayer();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+ method public CharSequence! getTitle();
+ method public int getType();
+ method public boolean isAccessibilityFocused();
+ method public boolean isActive();
+ method public boolean isFocused();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+ method public void recycle();
+ field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+ field public static final int TYPE_APPLICATION = 1; // 0x1
+ field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+ field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+ field public static final int TYPE_SYSTEM = 3; // 0x3
+ }
+
+}
+
+package androidx.core.view.animation {
+
+ public final class PathInterpolatorCompat {
+ method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+ method public static android.view.animation.Interpolator! create(float, float);
+ method public static android.view.animation.Interpolator! create(float, float, float, float);
+ }
+
+}
+
+package androidx.core.view.inputmethod {
+
+ public final class EditorInfoCompat {
+ ctor @Deprecated public EditorInfoCompat();
+ method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+ method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+ method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+ method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+ method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+ method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+ method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+ field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+ field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+ }
+
+ public final class InputConnectionCompat {
+ ctor @Deprecated public InputConnectionCompat();
+ method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+ method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+ }
+
+ public static interface InputConnectionCompat.OnCommitContentListener {
+ method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ }
+
+ public final class InputContentInfoCompat {
+ ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+ method public android.net.Uri getContentUri();
+ method public android.content.ClipDescription getDescription();
+ method public android.net.Uri? getLinkUri();
+ method public void releasePermission();
+ method public void requestPermission();
+ method public Object? unwrap();
+ method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+ ctor public AutoScrollHelper(android.view.View);
+ method public abstract boolean canTargetScrollHorizontally(int);
+ method public abstract boolean canTargetScrollVertically(int);
+ method public boolean isEnabled();
+ method public boolean isExclusive();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public abstract void scrollTargetBy(int, int);
+ method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+ method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+ method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+ method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+ method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+ field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+ field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+ field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+ field public static final float NO_MAX = 3.4028235E38f;
+ field public static final float NO_MIN = 0.0f;
+ field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+ }
+
+ public final class CheckedTextViewCompat {
+ method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+ method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+ method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+ method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+ method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class CompoundButtonCompat {
+ method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+ method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+ method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+ method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+ method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+ }
+
+ public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+ ctor public ContentLoadingProgressBar(android.content.Context);
+ ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+ method public void hide();
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void show();
+ }
+
+ public final class EdgeEffectCompat {
+ ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+ method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+ method @Deprecated public boolean draw(android.graphics.Canvas!);
+ method @Deprecated public void finish();
+ method public static float getDistance(android.widget.EdgeEffect);
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean onAbsorb(int);
+ method @Deprecated public boolean onPull(float);
+ method @Deprecated public boolean onPull(float, float);
+ method public static void onPull(android.widget.EdgeEffect, float, float);
+ method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+ method @Deprecated public boolean onRelease();
+ method @Deprecated public void setSize(int, int);
+ }
+
+ public class ImageViewCompat {
+ method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+ method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+ method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+ method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class ListPopupWindowCompat {
+ method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+ method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+ }
+
+ public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+ ctor public ListViewAutoScrollHelper(android.widget.ListView);
+ method public boolean canTargetScrollHorizontally(int);
+ method public boolean canTargetScrollVertically(int);
+ method public void scrollTargetBy(int, int);
+ }
+
+ public final class ListViewCompat {
+ method public static boolean canScrollList(android.widget.ListView, int);
+ method public static void scrollListBy(android.widget.ListView, int);
+ }
+
+ public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+ ctor public NestedScrollView(android.content.Context);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean arrowScroll(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+ method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+ method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+ method public boolean executeKeyEvent(android.view.KeyEvent);
+ method public void fling(int);
+ method public boolean fullScroll(int);
+ method public int getMaxScrollAmount();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isFillViewport();
+ method public boolean isSmoothScrollingEnabled();
+ method public void onAttachedToWindow();
+ method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, int);
+ method public boolean pageScroll(int);
+ method public void setFillViewport(boolean);
+ method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+ method public void setSmoothScrollingEnabled(boolean);
+ method public final void smoothScrollBy(int, int);
+ method public final void smoothScrollBy(int, int, int);
+ method public final void smoothScrollTo(int, int);
+ method public final void smoothScrollTo(int, int, int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public static interface NestedScrollView.OnScrollChangeListener {
+ method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+ }
+
+ public final class PopupMenuCompat {
+ method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+ }
+
+ public final class PopupWindowCompat {
+ method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+ method public static int getWindowLayoutType(android.widget.PopupWindow);
+ method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+ method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+ method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+ }
+
+ @Deprecated public final class ScrollerCompat {
+ method @Deprecated public void abortAnimation();
+ method @Deprecated public boolean computeScrollOffset();
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+ method @Deprecated public float getCurrVelocity();
+ method @Deprecated public int getCurrX();
+ method @Deprecated public int getCurrY();
+ method @Deprecated public int getFinalX();
+ method @Deprecated public int getFinalY();
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean isOverScrolled();
+ method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+ method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+ method @Deprecated public boolean springBack(int, int, int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int, int);
+ }
+
+ public final class TextViewCompat {
+ method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+ method public static int getAutoSizeMinTextSize(android.widget.TextView);
+ method public static int getAutoSizeStepGranularity(android.widget.TextView);
+ method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+ method public static int getAutoSizeTextType(android.widget.TextView);
+ method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+ method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+ method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+ method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+ method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+ method public static int getMaxLines(android.widget.TextView);
+ method public static int getMinLines(android.widget.TextView);
+ method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+ method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+ method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+ method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+ method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+ method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+ method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+ method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+ method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+ field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+ field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+ }
+
+ public interface TintableCompoundButton {
+ method public android.content.res.ColorStateList? getSupportButtonTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface TintableCompoundDrawablesView {
+ method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+}
+
diff --git a/core/core/api/public_plus_experimental_1.7.0-beta03.txt b/core/core/api/public_plus_experimental_1.7.0-beta03.txt
new file mode 100644
index 0000000..4afa0aa
--- /dev/null
+++ b/core/core/api/public_plus_experimental_1.7.0-beta03.txt
@@ -0,0 +1,3700 @@
+// Signature format: 4.0
+package androidx.core.accessibilityservice {
+
+ public final class AccessibilityServiceInfoCompat {
+ method public static String capabilityToString(int);
+ method public static String feedbackTypeToString(int);
+ method public static String? flagToString(int);
+ method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+ method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+ field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+ field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+ field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+ field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+ field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+ field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+ field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+ }
+
+}
+
+package androidx.core.app {
+
+ public class ActivityCompat extends androidx.core.content.ContextCompat {
+ ctor protected ActivityCompat();
+ method public static void finishAffinity(android.app.Activity);
+ method public static void finishAfterTransition(android.app.Activity);
+ method public static android.net.Uri? getReferrer(android.app.Activity);
+ method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+ method public static boolean isLaunchedFromBubble(android.app.Activity);
+ method public static void postponeEnterTransition(android.app.Activity);
+ method public static void recreate(android.app.Activity);
+ method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+ method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+ method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+ method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+ method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+ method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+ method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+ method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public static void startPostponedEnterTransition(android.app.Activity);
+ }
+
+ public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+ method public void onRequestPermissionsResult(int, String![], int[]);
+ }
+
+ public static interface ActivityCompat.PermissionCompatDelegate {
+ method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+ method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+ }
+
+ public final class ActivityManagerCompat {
+ method public static boolean isLowRamDevice(android.app.ActivityManager);
+ }
+
+ public class ActivityOptionsCompat {
+ ctor protected ActivityOptionsCompat();
+ method public android.graphics.Rect? getLaunchBounds();
+ method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+ method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+ method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+ method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+ method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+ method public android.os.Bundle? toBundle();
+ method public void update(androidx.core.app.ActivityOptionsCompat);
+ field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+ field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+ }
+
+ public final class AlarmManagerCompat {
+ method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+ method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ }
+
+ @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+ ctor public AppComponentFactory();
+ method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public class AppLaunchChecker {
+ ctor @Deprecated public AppLaunchChecker();
+ method public static boolean hasStartedFromLauncher(android.content.Context);
+ method public static void onActivityCreate(android.app.Activity);
+ }
+
+ public final class AppOpsManagerCompat {
+ method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+ method public static int noteOp(android.content.Context, String, int, String);
+ method public static int noteOpNoThrow(android.content.Context, String, int, String);
+ method public static int noteProxyOp(android.content.Context, String, String);
+ method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+ method public static String? permissionToOp(String);
+ field public static final int MODE_ALLOWED = 0; // 0x0
+ field public static final int MODE_DEFAULT = 3; // 0x3
+ field public static final int MODE_ERRORED = 2; // 0x2
+ field public static final int MODE_IGNORED = 1; // 0x1
+ }
+
+ public final class BundleCompat {
+ method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+ method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+ }
+
+ public class DialogCompat {
+ method public static android.view.View requireViewById(android.app.Dialog, int);
+ }
+
+ public class FrameMetricsAggregator {
+ ctor public FrameMetricsAggregator();
+ ctor public FrameMetricsAggregator(int);
+ method public void add(android.app.Activity);
+ method public android.util.SparseIntArray![]? getMetrics();
+ method public android.util.SparseIntArray![]? remove(android.app.Activity);
+ method public android.util.SparseIntArray![]? reset();
+ method public android.util.SparseIntArray![]? stop();
+ field public static final int ANIMATION_DURATION = 256; // 0x100
+ field public static final int ANIMATION_INDEX = 8; // 0x8
+ field public static final int COMMAND_DURATION = 32; // 0x20
+ field public static final int COMMAND_INDEX = 5; // 0x5
+ field public static final int DELAY_DURATION = 128; // 0x80
+ field public static final int DELAY_INDEX = 7; // 0x7
+ field public static final int DRAW_DURATION = 8; // 0x8
+ field public static final int DRAW_INDEX = 3; // 0x3
+ field public static final int EVERY_DURATION = 511; // 0x1ff
+ field public static final int INPUT_DURATION = 2; // 0x2
+ field public static final int INPUT_INDEX = 1; // 0x1
+ field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+ field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+ field public static final int SWAP_DURATION = 64; // 0x40
+ field public static final int SWAP_INDEX = 6; // 0x6
+ field public static final int SYNC_DURATION = 16; // 0x10
+ field public static final int SYNC_INDEX = 4; // 0x4
+ field public static final int TOTAL_DURATION = 1; // 0x1
+ field public static final int TOTAL_INDEX = 0; // 0x0
+ }
+
+ @Deprecated public abstract class JobIntentService extends android.app.Service {
+ ctor @Deprecated public JobIntentService();
+ method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+ method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+ method @Deprecated public boolean isStopped();
+ method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+ method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+ method @Deprecated public boolean onStopCurrentWork();
+ method @Deprecated public void setInterruptIfStopped(boolean);
+ }
+
+ public final class NavUtils {
+ method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static String? getParentActivityName(android.app.Activity);
+ method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void navigateUpFromSameTask(android.app.Activity);
+ method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+ method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+ field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+ }
+
+ public class NotificationChannelCompat {
+ method public boolean canBubble();
+ method public boolean canBypassDnd();
+ method public boolean canShowBadge();
+ method public android.media.AudioAttributes? getAudioAttributes();
+ method public String? getConversationId();
+ method public String? getDescription();
+ method public String? getGroup();
+ method public String getId();
+ method public int getImportance();
+ method public int getLightColor();
+ method public int getLockscreenVisibility();
+ method public CharSequence? getName();
+ method public String? getParentChannelId();
+ method public android.net.Uri? getSound();
+ method public long[]? getVibrationPattern();
+ method public boolean isImportantConversation();
+ method public boolean shouldShowLights();
+ method public boolean shouldVibrate();
+ method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+ field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+ }
+
+ public static class NotificationChannelCompat.Builder {
+ ctor public NotificationChannelCompat.Builder(String, int);
+ method public androidx.core.app.NotificationChannelCompat build();
+ method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+ method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+ method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+ method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+ }
+
+ public class NotificationChannelGroupCompat {
+ method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+ method public String? getDescription();
+ method public String getId();
+ method public CharSequence? getName();
+ method public boolean isBlocked();
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+ }
+
+ public static class NotificationChannelGroupCompat.Builder {
+ ctor public NotificationChannelGroupCompat.Builder(String);
+ method public androidx.core.app.NotificationChannelGroupCompat build();
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+ }
+
+ public class NotificationCompat {
+ ctor @Deprecated public NotificationCompat();
+ method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+ method public static int getActionCount(android.app.Notification);
+ method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+ method public static boolean getAutoCancel(android.app.Notification);
+ method public static int getBadgeIconType(android.app.Notification);
+ method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+ method public static String? getCategory(android.app.Notification);
+ method public static String? getChannelId(android.app.Notification);
+ method public static int getColor(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+ method public static android.os.Bundle? getExtras(android.app.Notification);
+ method public static String? getGroup(android.app.Notification);
+ method public static int getGroupAlertBehavior(android.app.Notification);
+ method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+ method public static boolean getLocalOnly(android.app.Notification);
+ method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+ method public static boolean getOngoing(android.app.Notification);
+ method public static boolean getOnlyAlertOnce(android.app.Notification);
+ method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+ method public static android.app.Notification? getPublicVersion(android.app.Notification);
+ method public static CharSequence? getSettingsText(android.app.Notification);
+ method public static String? getShortcutId(android.app.Notification);
+ method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+ method public static String? getSortKey(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+ method public static long getTimeoutAfter(android.app.Notification);
+ method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+ method public static int getVisibility(android.app.Notification);
+ method public static boolean isGroupSummary(android.app.Notification);
+ field public static final int BADGE_ICON_LARGE = 2; // 0x2
+ field public static final int BADGE_ICON_NONE = 0; // 0x0
+ field public static final int BADGE_ICON_SMALL = 1; // 0x1
+ field public static final String CATEGORY_ALARM = "alarm";
+ field public static final String CATEGORY_CALL = "call";
+ field public static final String CATEGORY_EMAIL = "email";
+ field public static final String CATEGORY_ERROR = "err";
+ field public static final String CATEGORY_EVENT = "event";
+ field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+ field public static final String CATEGORY_MESSAGE = "msg";
+ field public static final String CATEGORY_MISSED_CALL = "missed_call";
+ field public static final String CATEGORY_NAVIGATION = "navigation";
+ field public static final String CATEGORY_PROGRESS = "progress";
+ field public static final String CATEGORY_PROMO = "promo";
+ field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+ field public static final String CATEGORY_REMINDER = "reminder";
+ field public static final String CATEGORY_SERVICE = "service";
+ field public static final String CATEGORY_SOCIAL = "social";
+ field public static final String CATEGORY_STATUS = "status";
+ field public static final String CATEGORY_STOPWATCH = "stopwatch";
+ field public static final String CATEGORY_SYSTEM = "sys";
+ field public static final String CATEGORY_TRANSPORT = "transport";
+ field public static final String CATEGORY_WORKOUT = "workout";
+ field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+ field public static final int DEFAULT_ALL = -1; // 0xffffffff
+ field public static final int DEFAULT_LIGHTS = 4; // 0x4
+ field public static final int DEFAULT_SOUND = 1; // 0x1
+ field public static final int DEFAULT_VIBRATE = 2; // 0x2
+ field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+ field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+ field public static final String EXTRA_BIG_TEXT = "android.bigText";
+ field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+ field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+ field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+ field public static final String EXTRA_COLORIZED = "android.colorized";
+ field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+ field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+ field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+ field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+ field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+ field public static final String EXTRA_INFO_TEXT = "android.infoText";
+ field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+ field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+ field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+ field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+ field public static final String EXTRA_MESSAGES = "android.messages";
+ field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+ field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+ field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+ field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+ field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+ field public static final String EXTRA_PICTURE = "android.picture";
+ field public static final String EXTRA_PROGRESS = "android.progress";
+ field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+ field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+ field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+ field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+ field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+ field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+ field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+ field public static final String EXTRA_SMALL_ICON = "android.icon";
+ field public static final String EXTRA_SUB_TEXT = "android.subText";
+ field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+ field public static final String EXTRA_TEMPLATE = "android.template";
+ field public static final String EXTRA_TEXT = "android.text";
+ field public static final String EXTRA_TEXT_LINES = "android.textLines";
+ field public static final String EXTRA_TITLE = "android.title";
+ field public static final String EXTRA_TITLE_BIG = "android.title.big";
+ field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+ field public static final int FLAG_BUBBLE = 4096; // 0x1000
+ field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+ field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+ field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+ field public static final int FLAG_INSISTENT = 4; // 0x4
+ field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+ field public static final int FLAG_NO_CLEAR = 32; // 0x20
+ field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+ field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+ field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+ field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+ field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+ field public static final String GROUP_KEY_SILENT = "silent";
+ field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+ field public static final int PRIORITY_DEFAULT = 0; // 0x0
+ field public static final int PRIORITY_HIGH = 1; // 0x1
+ field public static final int PRIORITY_LOW = -1; // 0xffffffff
+ field public static final int PRIORITY_MAX = 2; // 0x2
+ field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+ field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+ field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+ field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+ field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+ }
+
+ public static class NotificationCompat.Action {
+ ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+ method public android.app.PendingIntent? getActionIntent();
+ method public boolean getAllowGeneratedReplies();
+ method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+ method public android.os.Bundle getExtras();
+ method @Deprecated public int getIcon();
+ method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+ method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+ method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+ method public boolean getShowsUserInterface();
+ method public CharSequence? getTitle();
+ method public boolean isContextual();
+ field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+ field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+ field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+ field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+ field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+ field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+ field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+ field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+ field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+ field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+ field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+ field public android.app.PendingIntent! actionIntent;
+ field @Deprecated public int icon;
+ field public CharSequence! title;
+ }
+
+ public static final class NotificationCompat.Action.Builder {
+ ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+ method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+ method public androidx.core.app.NotificationCompat.Action build();
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+ method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+ }
+
+ public static interface NotificationCompat.Action.Extender {
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+ }
+
+ public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+ ctor public NotificationCompat.Action.WearableExtender();
+ ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+ method @Deprecated public CharSequence? getCancelLabel();
+ method @Deprecated public CharSequence? getConfirmLabel();
+ method public boolean getHintDisplayActionInline();
+ method public boolean getHintLaunchesActivity();
+ method @Deprecated public CharSequence? getInProgressLabel();
+ method public boolean isAvailableOffline();
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+ }
+
+ public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigPictureStyle();
+ ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+ method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+ }
+
+ public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigTextStyle();
+ ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+ }
+
+ public static final class NotificationCompat.BubbleMetadata {
+ method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+ method public boolean getAutoExpandBubble();
+ method public android.app.PendingIntent? getDeleteIntent();
+ method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+ method @DimenRes public int getDesiredHeightResId();
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public android.app.PendingIntent? getIntent();
+ method public String? getShortcutId();
+ method public boolean isNotificationSuppressed();
+ method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+ }
+
+ public static final class NotificationCompat.BubbleMetadata.Builder {
+ ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+ ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+ ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+ }
+
+ public static class NotificationCompat.Builder {
+ ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+ ctor public NotificationCompat.Builder(android.content.Context, String);
+ ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+ method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+ method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+ method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+ method public android.app.Notification build();
+ method public androidx.core.app.NotificationCompat.Builder clearActions();
+ method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+ method public androidx.core.app.NotificationCompat.Builder clearPeople();
+ method public android.widget.RemoteViews? createBigContentView();
+ method public android.widget.RemoteViews? createContentView();
+ method public android.widget.RemoteViews? createHeadsUpContentView();
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+ method public android.os.Bundle getExtras();
+ method @Deprecated public android.app.Notification getNotification();
+ method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(int);
+ method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+ method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+ method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+ method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+ method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+ method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(int);
+ method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+ method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+ method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(int);
+ method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+ method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+ method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+ method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+ method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+ method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+ method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+ method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+ method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+ method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+ method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+ method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+ method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+ method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+ method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, int);
+ method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+ method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+ method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+ method public androidx.core.app.NotificationCompat.Builder setVisibility(int);
+ method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+ field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+ }
+
+ public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.CarExtender();
+ ctor public NotificationCompat.CarExtender(android.app.Notification);
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ method @ColorInt public int getColor();
+ method public android.graphics.Bitmap? getLargeIcon();
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+ method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+ }
+
+ @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+ method @Deprecated public long getLatestTimestamp();
+ method @Deprecated public String![]? getMessages();
+ method @Deprecated public String? getParticipant();
+ method @Deprecated public String![]? getParticipants();
+ method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+ method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+ method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+ }
+
+ @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+ ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+ }
+
+ public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.DecoratedCustomViewStyle();
+ }
+
+ public static interface NotificationCompat.Extender {
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ }
+
+ public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.InboxStyle();
+ ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+ method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+ }
+
+ public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+ ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+ method public void addCompatExtras(android.os.Bundle);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+ method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+ method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+ method public CharSequence? getConversationTitle();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+ method public androidx.core.app.Person getUser();
+ method @Deprecated public CharSequence? getUserDisplayName();
+ method public boolean isGroupConversation();
+ method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+ field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+ }
+
+ public static final class NotificationCompat.MessagingStyle.Message {
+ ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+ ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+ method public String? getDataMimeType();
+ method public android.net.Uri? getDataUri();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.Person? getPerson();
+ method @Deprecated public CharSequence? getSender();
+ method public CharSequence? getText();
+ method public long getTimestamp();
+ method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+ }
+
+ public abstract static class NotificationCompat.Style {
+ ctor public NotificationCompat.Style();
+ method public android.app.Notification? build();
+ method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+ }
+
+ public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.WearableExtender();
+ ctor public NotificationCompat.WearableExtender(android.app.Notification);
+ method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+ method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+ method public androidx.core.app.NotificationCompat.WearableExtender clone();
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+ method @Deprecated public android.graphics.Bitmap? getBackground();
+ method public String? getBridgeTag();
+ method public int getContentAction();
+ method @Deprecated public int getContentIcon();
+ method @Deprecated public int getContentIconGravity();
+ method public boolean getContentIntentAvailableOffline();
+ method @Deprecated public int getCustomContentHeight();
+ method @Deprecated public int getCustomSizePreset();
+ method public String? getDismissalId();
+ method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+ method @Deprecated public int getGravity();
+ method @Deprecated public boolean getHintAmbientBigPicture();
+ method @Deprecated public boolean getHintAvoidBackgroundClipping();
+ method public boolean getHintContentIntentLaunchesActivity();
+ method @Deprecated public boolean getHintHideIcon();
+ method @Deprecated public int getHintScreenTimeout();
+ method @Deprecated public boolean getHintShowBackgroundOnly();
+ method @Deprecated public java.util.List<android.app.Notification!> getPages();
+ method public boolean getStartScrollBottom();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+ method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+ field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+ field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+ field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+ field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+ field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+ field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+ field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+ field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+ }
+
+ public final class NotificationCompatExtras {
+ field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+ field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+ field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+ field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+ field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+ field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+ }
+
+ public abstract class NotificationCompatSideChannelService extends android.app.Service {
+ ctor public NotificationCompatSideChannelService();
+ method public abstract void cancel(String!, int, String!);
+ method public abstract void cancelAll(String!);
+ method public abstract void notify(String!, int, String!, android.app.Notification!);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ }
+
+ public final class NotificationManagerCompat {
+ method public boolean areNotificationsEnabled();
+ method public void cancel(int);
+ method public void cancel(String?, int);
+ method public void cancelAll();
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+ method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+ method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+ method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+ method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+ method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+ method public void deleteNotificationChannel(String);
+ method public void deleteNotificationChannelGroup(String);
+ method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+ method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+ method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+ method public int getImportance();
+ method public android.app.NotificationChannel? getNotificationChannel(String);
+ method public android.app.NotificationChannel? getNotificationChannel(String, String);
+ method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+ method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+ method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+ method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+ method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+ method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+ method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+ method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+ method public void notify(int, android.app.Notification);
+ method public void notify(String?, int, android.app.Notification);
+ field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+ field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+ field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+ field public static final int IMPORTANCE_HIGH = 4; // 0x4
+ field public static final int IMPORTANCE_LOW = 2; // 0x2
+ field public static final int IMPORTANCE_MAX = 5; // 0x5
+ field public static final int IMPORTANCE_MIN = 1; // 0x1
+ field public static final int IMPORTANCE_NONE = 0; // 0x0
+ field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+ }
+
+ public class Person {
+ method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public String? getKey();
+ method public CharSequence? getName();
+ method public String? getUri();
+ method public boolean isBot();
+ method public boolean isImportant();
+ method public androidx.core.app.Person.Builder toBuilder();
+ method public android.os.Bundle toBundle();
+ }
+
+ public static class Person.Builder {
+ ctor public Person.Builder();
+ method public androidx.core.app.Person build();
+ method public androidx.core.app.Person.Builder setBot(boolean);
+ method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+ method public androidx.core.app.Person.Builder setImportant(boolean);
+ method public androidx.core.app.Person.Builder setKey(String?);
+ method public androidx.core.app.Person.Builder setName(CharSequence?);
+ method public androidx.core.app.Person.Builder setUri(String?);
+ }
+
+ public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+ ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+ ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+ method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+ method public android.app.PendingIntent getActionIntent();
+ method public CharSequence getContentDescription();
+ method public androidx.core.graphics.drawable.IconCompat getIcon();
+ method public CharSequence getTitle();
+ method public boolean isEnabled();
+ method public void setEnabled(boolean);
+ method public void setShouldShowIcon(boolean);
+ method public boolean shouldShowIcon();
+ method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+ }
+
+ public final class RemoteInput {
+ method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+ method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+ method public boolean getAllowFreeFormInput();
+ method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+ method public CharSequence![]! getChoices();
+ method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+ method public int getEditChoicesBeforeSending();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence! getLabel();
+ method public String! getResultKey();
+ method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+ method public static int getResultsSource(android.content.Intent);
+ method public boolean isDataOnly();
+ method public static void setResultsSource(android.content.Intent, int);
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+ field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+ field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+ field public static final int SOURCE_CHOICE = 1; // 0x1
+ field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+ }
+
+ public static final class RemoteInput.Builder {
+ ctor public RemoteInput.Builder(String);
+ method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+ method public androidx.core.app.RemoteInput build();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+ method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+ method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+ method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(int);
+ method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+ }
+
+ public final class ServiceCompat {
+ method public static void stopForeground(android.app.Service, int);
+ field public static final int START_STICKY = 1; // 0x1
+ field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+ field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+ }
+
+ public final class ShareCompat {
+ method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+ method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+ method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+ method public static String? getCallingPackage(android.app.Activity);
+ field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+ field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+ }
+
+ public static class ShareCompat.IntentBuilder {
+ ctor public ShareCompat.IntentBuilder(android.content.Context);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+ method public android.content.Intent createChooserIntent();
+ method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+ method public android.content.Intent getIntent();
+ method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+ method public void startChooser();
+ }
+
+ public static class ShareCompat.IntentReader {
+ ctor public ShareCompat.IntentReader(android.app.Activity);
+ ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+ method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+ method public android.content.ComponentName? getCallingActivity();
+ method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+ method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+ method public CharSequence? getCallingApplicationLabel();
+ method public String? getCallingPackage();
+ method public String![]? getEmailBcc();
+ method public String![]? getEmailCc();
+ method public String![]? getEmailTo();
+ method public String? getHtmlText();
+ method public android.net.Uri? getStream();
+ method public android.net.Uri? getStream(int);
+ method public int getStreamCount();
+ method public String? getSubject();
+ method public CharSequence? getText();
+ method public String? getType();
+ method public boolean isMultipleShare();
+ method public boolean isShareIntent();
+ method public boolean isSingleShare();
+ }
+
+ public abstract class SharedElementCallback {
+ ctor public SharedElementCallback();
+ method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+ method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+ method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+ method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+ method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+ method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+ method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+ }
+
+ public static interface SharedElementCallback.OnSharedElementsReadyListener {
+ method public void onSharedElementsReady();
+ }
+
+ public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+ method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+ method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+ method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+ method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+ method public android.content.Intent? editIntentAt(int);
+ method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+ method @Deprecated public android.content.Intent! getIntent(int);
+ method public int getIntentCount();
+ method public android.content.Intent![] getIntents();
+ method public android.app.PendingIntent? getPendingIntent(int, int);
+ method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+ method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+ method public void startActivities();
+ method public void startActivities(android.os.Bundle?);
+ }
+
+ public static interface TaskStackBuilder.SupportParentable {
+ method public android.content.Intent? getSupportParentActivityIntent();
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentProviderCompat {
+ method public static android.content.Context requireContext(android.content.ContentProvider);
+ }
+
+ public final class ContentResolverCompat {
+ method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+ }
+
+ public class ContextCompat {
+ ctor protected ContextCompat();
+ method public static int checkSelfPermission(android.content.Context, String);
+ method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+ method public static String? getAttributionTag(android.content.Context);
+ method public static java.io.File getCodeCacheDir(android.content.Context);
+ method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+ method public static java.io.File? getDataDir(android.content.Context);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+ method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+ method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+ method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+ method public static java.io.File![] getObbDirs(android.content.Context);
+ method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+ method public static String? getSystemServiceName(android.content.Context, Class<?>);
+ method public static boolean isDeviceProtectedStorage(android.content.Context);
+ method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+ method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+ method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+ method public static void startForegroundService(android.content.Context, android.content.Intent);
+ }
+
+ public class FileProvider extends android.content.ContentProvider {
+ ctor public FileProvider();
+ method public int delete(android.net.Uri, String?, String![]?);
+ method public String! getType(android.net.Uri);
+ method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+ method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+ method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+ method public boolean onCreate();
+ method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+ method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+ }
+
+ public final class IntentCompat {
+ method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+ method public static android.content.Intent makeMainSelectorActivity(String, String);
+ field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+ field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+ field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+ field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+ field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+ }
+
+ public final class LocusIdCompat {
+ ctor public LocusIdCompat(String);
+ method public String getId();
+ method @RequiresApi(29) public android.content.LocusId toLocusId();
+ method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+ }
+
+ public final class MimeTypeFilter {
+ method public static boolean matches(String?, String);
+ method public static String? matches(String?, String![]);
+ method public static String? matches(String![]?, String);
+ method public static String![] matchesMany(String![]?, String);
+ }
+
+ public final class PackageManagerCompat {
+ method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+ field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+ }
+
+ public final class PermissionChecker {
+ method public static int checkCallingOrSelfPermission(android.content.Context, String);
+ method public static int checkCallingPermission(android.content.Context, String, String?);
+ method public static int checkPermission(android.content.Context, String, int, int, String?);
+ method public static int checkSelfPermission(android.content.Context, String);
+ field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+ field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+ field public static final int PERMISSION_GRANTED = 0; // 0x0
+ }
+
+ @Deprecated public final class SharedPreferencesCompat {
+ }
+
+ @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+ method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+ method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+ }
+
+ public class UnusedAppRestrictionsBackportCallback {
+ method public void onResult(boolean, boolean) throws android.os.RemoteException;
+ }
+
+ public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+ ctor public UnusedAppRestrictionsBackportService();
+ method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+ method public android.os.IBinder? onBind(android.content.Intent?);
+ field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+ }
+
+ public final class UnusedAppRestrictionsConstants {
+ field public static final int API_30 = 4; // 0x4
+ field public static final int API_30_BACKPORT = 3; // 0x3
+ field public static final int API_31 = 5; // 0x5
+ field public static final int DISABLED = 2; // 0x2
+ field public static final int ERROR = 0; // 0x0
+ field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+ }
+
+}
+
+package androidx.core.content.pm {
+
+ @Deprecated public final class ActivityInfoCompat {
+ field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+ }
+
+ public final class PackageInfoCompat {
+ method public static long getLongVersionCode(android.content.pm.PackageInfo);
+ method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+ }
+
+ public final class PermissionInfoCompat {
+ method public static int getProtection(android.content.pm.PermissionInfo);
+ method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+ }
+
+ public class ShortcutInfoCompat {
+ method public android.content.ComponentName? getActivity();
+ method public java.util.Set<java.lang.String!>? getCategories();
+ method public CharSequence? getDisabledMessage();
+ method public int getDisabledReason();
+ method public android.os.PersistableBundle? getExtras();
+ method public String getId();
+ method public android.content.Intent getIntent();
+ method public android.content.Intent![] getIntents();
+ method public long getLastChangedTimestamp();
+ method public androidx.core.content.LocusIdCompat? getLocusId();
+ method public CharSequence? getLongLabel();
+ method public String getPackage();
+ method public int getRank();
+ method public CharSequence getShortLabel();
+ method public android.os.UserHandle? getUserHandle();
+ method public boolean hasKeyFieldsOnly();
+ method public boolean isCached();
+ method public boolean isDeclaredInManifest();
+ method public boolean isDynamic();
+ method public boolean isEnabled();
+ method public boolean isImmutable();
+ method public boolean isPinned();
+ method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+ }
+
+ public static class ShortcutInfoCompat.Builder {
+ ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+ method public androidx.core.content.pm.ShortcutInfoCompat build();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+ 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);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+ }
+
+ public class ShortcutManagerCompat {
+ method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+ method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+ method public static int getIconMaxHeight(android.content.Context);
+ method public static int getIconMaxWidth(android.content.Context);
+ method public static int getMaxShortcutCountPerActivity(android.content.Context);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, int);
+ method public static boolean isRateLimitingActive(android.content.Context);
+ method public static boolean isRequestPinShortcutSupported(android.content.Context);
+ method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static void removeAllDynamicShortcuts(android.content.Context);
+ method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+ method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+ method public static void reportShortcutUsed(android.content.Context, String);
+ method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+ method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+ field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+ field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+ field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+ field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+ }
+
+}
+
+package androidx.core.content.res {
+
+ public final class ConfigurationHelper {
+ method public static int getDensityDpi(android.content.res.Resources);
+ }
+
+ public final class ResourcesCompat {
+ method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static float getFloat(android.content.res.Resources, @DimenRes int);
+ method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+ field @AnyRes public static final int ID_NULL = 0; // 0x0
+ }
+
+ public abstract static class ResourcesCompat.FontCallback {
+ ctor public ResourcesCompat.FontCallback();
+ method public abstract void onFontRetrievalFailed(int);
+ method public abstract void onFontRetrieved(android.graphics.Typeface);
+ }
+
+ public static final class ResourcesCompat.ThemeCompat {
+ method public static void rebase(android.content.res.Resources.Theme);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorWindowCompat {
+ method public static android.database.CursorWindow create(String?, long);
+ }
+
+ @Deprecated public final class DatabaseUtilsCompat {
+ method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+ method @Deprecated public static String! concatenateWhere(String!, String!);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteCursorCompat {
+ method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapCompat {
+ method public static int getAllocationByteCount(android.graphics.Bitmap);
+ method public static boolean hasMipMap(android.graphics.Bitmap);
+ method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+ }
+
+ public class BlendModeColorFilterCompat {
+ method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+ }
+
+ public enum BlendModeCompat {
+ enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+ }
+
+ public final class ColorUtils {
+ method @ColorInt public static int HSLToColor(float[]);
+ method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+ method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+ method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+ method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+ method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+ method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+ method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+ method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+ method public static double calculateContrast(@ColorInt int, @ColorInt int);
+ method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+ method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+ method public static void colorToHSL(@ColorInt int, float[]);
+ method public static void colorToLAB(@ColorInt int, double[]);
+ method public static void colorToXYZ(@ColorInt int, double[]);
+ method public static int compositeColors(@ColorInt int, @ColorInt int);
+ method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+ method public static double distanceEuclidean(double[], double[]);
+ method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+ }
+
+ public final class Insets {
+ method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets of(int, int, int, int);
+ method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+ method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+ method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+ field public static final androidx.core.graphics.Insets NONE;
+ field public final int bottom;
+ field public final int left;
+ field public final int right;
+ field public final int top;
+ }
+
+ public final class PaintCompat {
+ method public static boolean hasGlyph(android.graphics.Paint, String);
+ method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+ }
+
+ public final class PathSegment {
+ ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+ method public android.graphics.PointF getEnd();
+ method public float getEndFraction();
+ method public android.graphics.PointF getStart();
+ method public float getStartFraction();
+ }
+
+ public final class PathUtils {
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+ }
+
+ public class TypefaceCompat {
+ method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class DrawableCompat {
+ method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+ method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+ method public static void clearColorFilter(android.graphics.drawable.Drawable);
+ method public static int getAlpha(android.graphics.drawable.Drawable);
+ method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+ method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+ method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+ method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+ method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+ method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+ method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+ method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+ method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+ method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+ method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+ method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+ method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+ }
+
+ public class IconCompat implements androidx.versionedparcelable.VersionedParcelable {
+ method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+ method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+ method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+ method @IdRes public int getResId();
+ method public String getResPackage();
+ method public int getType();
+ method public android.net.Uri getUri();
+ method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+ method public void onPostParceling();
+ method public void onPreParceling(boolean);
+ method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+ method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+ method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+ method public android.os.Bundle toBundle();
+ method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+ method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+ field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+ field public static final int TYPE_BITMAP = 1; // 0x1
+ field public static final int TYPE_DATA = 3; // 0x3
+ field public static final int TYPE_RESOURCE = 2; // 0x2
+ field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+ field public static final int TYPE_URI = 4; // 0x4
+ field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+ }
+
+ public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.Bitmap? getBitmap();
+ method public float getCornerRadius();
+ method public int getGravity();
+ method public int getOpacity();
+ method public final android.graphics.Paint getPaint();
+ method public boolean hasAntiAlias();
+ method public boolean hasMipMap();
+ method public boolean isCircular();
+ method public void setAlpha(int);
+ method public void setAntiAlias(boolean);
+ method public void setCircular(boolean);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setCornerRadius(float);
+ method public void setDither(boolean);
+ method public void setGravity(int);
+ method public void setMipMap(boolean);
+ method public void setTargetDensity(android.graphics.Canvas);
+ method public void setTargetDensity(android.util.DisplayMetrics);
+ method public void setTargetDensity(int);
+ }
+
+ public final class RoundedBitmapDrawableFactory {
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+ }
+
+}
+
+package androidx.core.hardware.display {
+
+ public final class DisplayManagerCompat {
+ method public android.view.Display? getDisplay(int);
+ method public android.view.Display![] getDisplays();
+ method public android.view.Display![] getDisplays(String?);
+ method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+ field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+ }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+ @Deprecated public class FingerprintManagerCompat {
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+ method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+ }
+
+ @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+ method @Deprecated public void onAuthenticationError(int, CharSequence!);
+ method @Deprecated public void onAuthenticationFailed();
+ method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+ method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+ }
+
+ @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+ method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+ }
+
+ @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+ method @Deprecated public javax.crypto.Cipher? getCipher();
+ method @Deprecated public javax.crypto.Mac? getMac();
+ method @Deprecated public java.security.Signature? getSignature();
+ }
+
+}
+
+package androidx.core.location {
+
+ public abstract class GnssStatusCompat {
+ method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+ method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+ method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+ method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+ method public abstract int getConstellationType(@IntRange(from=0) int);
+ method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+ method @IntRange(from=0) public abstract int getSatelliteCount();
+ method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+ method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+ method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+ method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+ method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+ method public abstract boolean usedInFix(@IntRange(from=0) int);
+ method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+ method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+ field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+ field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+ field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+ field public static final int CONSTELLATION_GPS = 1; // 0x1
+ field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+ field public static final int CONSTELLATION_QZSS = 4; // 0x4
+ field public static final int CONSTELLATION_SBAS = 2; // 0x2
+ field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+ }
+
+ public abstract static class GnssStatusCompat.Callback {
+ ctor public GnssStatusCompat.Callback();
+ method public void onFirstFix(@IntRange(from=0) int);
+ method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+ method public void onStarted();
+ method public void onStopped();
+ }
+
+ public final class LocationCompat {
+ method public static float getBearingAccuracyDegrees(android.location.Location);
+ method public static long getElapsedRealtimeMillis(android.location.Location);
+ method public static long getElapsedRealtimeNanos(android.location.Location);
+ method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+ method public static float getVerticalAccuracyMeters(android.location.Location);
+ method public static boolean hasBearingAccuracy(android.location.Location);
+ method public static boolean hasSpeedAccuracy(android.location.Location);
+ method public static boolean hasVerticalAccuracy(android.location.Location);
+ method public static boolean isMock(android.location.Location);
+ method public static void setBearingAccuracyDegrees(android.location.Location, float);
+ method public static void setMock(android.location.Location, boolean);
+ method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+ method public static void setVerticalAccuracyMeters(android.location.Location, float);
+ field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+ field public static final String EXTRA_IS_MOCK = "mockLocation";
+ field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+ field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+ }
+
+ public interface LocationListenerCompat extends android.location.LocationListener {
+ method public default void onStatusChanged(String, int, android.os.Bundle?);
+ }
+
+ public final class LocationManagerCompat {
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+ method public static String? getGnssHardwareModelName(android.location.LocationManager);
+ method public static int getGnssYearOfHardware(android.location.LocationManager);
+ method public static boolean hasProvider(android.location.LocationManager, String);
+ method public static boolean isLocationEnabled(android.location.LocationManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+ method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+ }
+
+ public final class LocationRequestCompat {
+ method @IntRange(from=1) public long getDurationMillis();
+ method @IntRange(from=0) public long getIntervalMillis();
+ method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+ method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+ method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+ method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+ method public int getQuality();
+ method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+ method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+ field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+ field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+ field public static final int QUALITY_LOW_POWER = 104; // 0x68
+ }
+
+ public static final class LocationRequestCompat.Builder {
+ ctor public LocationRequestCompat.Builder(long);
+ ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+ method public androidx.core.location.LocationRequestCompat build();
+ method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+ method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+ method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+ method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+ }
+
+}
+
+package androidx.core.math {
+
+ public class MathUtils {
+ method public static int addExact(int, int);
+ method public static long addExact(long, long);
+ method public static float clamp(float, float, float);
+ method public static double clamp(double, double, double);
+ method public static int clamp(int, int, int);
+ method public static long clamp(long, long, long);
+ method public static int decrementExact(int);
+ method public static long decrementExact(long);
+ method public static int incrementExact(int);
+ method public static long incrementExact(long);
+ method public static int multiplyExact(int, int);
+ method public static long multiplyExact(long, long);
+ method public static int negateExact(int);
+ method public static long negateExact(long);
+ method public static int subtractExact(int, int);
+ method public static long subtractExact(long, long);
+ method public static int toIntExact(long);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class ConnectivityManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+ method public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+ }
+
+ public final class MailTo {
+ method public String? getBcc();
+ method public String? getBody();
+ method public String? getCc();
+ method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+ method public String? getSubject();
+ method public String? getTo();
+ method public static boolean isMailTo(String?);
+ method public static boolean isMailTo(android.net.Uri?);
+ method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+ method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+ field public static final String MAILTO_SCHEME = "mailto:";
+ }
+
+ public class ParseException extends java.lang.RuntimeException {
+ field public final String response;
+ }
+
+ public final class TrafficStatsCompat {
+ method @Deprecated public static void clearThreadStatsTag();
+ method @Deprecated public static int getThreadStatsTag();
+ method @Deprecated public static void incrementOperationCount(int);
+ method @Deprecated public static void incrementOperationCount(int, int);
+ method @Deprecated public static void setThreadStatsTag(int);
+ method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+ method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+ }
+
+ public final class UriCompat {
+ method public static String toSafeString(android.net.Uri);
+ }
+
+}
+
+package androidx.core.os {
+
+ public class BuildCompat {
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+ method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+ method @ChecksSdkIntAtLeast(codename="T") @androidx.core.os.BuildCompat.PrereleaseSdkCheck public static boolean isAtLeastT();
+ }
+
+ @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public static @interface BuildCompat.PrereleaseSdkCheck {
+ }
+
+ public final class CancellationSignal {
+ ctor public CancellationSignal();
+ method public void cancel();
+ method public Object? getCancellationSignalObject();
+ method public boolean isCanceled();
+ method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+ method public void throwIfCanceled();
+ }
+
+ public static interface CancellationSignal.OnCancelListener {
+ method public void onCancel();
+ }
+
+ public final class ConfigurationCompat {
+ method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+ }
+
+ public final class EnvironmentCompat {
+ method public static String getStorageState(java.io.File);
+ field public static final String MEDIA_UNKNOWN = "unknown";
+ }
+
+ public final class ExecutorCompat {
+ method public static java.util.concurrent.Executor create(android.os.Handler);
+ }
+
+ public final class HandlerCompat {
+ method public static android.os.Handler createAsync(android.os.Looper);
+ method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+ method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+ method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+ }
+
+ public final class LocaleListCompat {
+ method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+ method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+ method public java.util.Locale! get(int);
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+ method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+ method public java.util.Locale? getFirstMatch(String![]);
+ method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+ method public boolean isEmpty();
+ method @IntRange(from=0) public int size();
+ method public String toLanguageTags();
+ method public Object? unwrap();
+ method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+ method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+ }
+
+ public final class MessageCompat {
+ method public static boolean isAsynchronous(android.os.Message);
+ method public static void setAsynchronous(android.os.Message, boolean);
+ }
+
+ public class OperationCanceledException extends java.lang.RuntimeException {
+ ctor public OperationCanceledException();
+ ctor public OperationCanceledException(String?);
+ }
+
+ public final class ParcelCompat {
+ method public static boolean readBoolean(android.os.Parcel);
+ method public static void writeBoolean(android.os.Parcel, boolean);
+ }
+
+ @Deprecated public final class ParcelableCompat {
+ method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+ }
+
+ @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+ method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+ method @Deprecated public T![]! newArray(int);
+ }
+
+ public final class ProcessCompat {
+ method public static boolean isApplicationUid(int);
+ }
+
+ @Deprecated public final class TraceCompat {
+ method @Deprecated public static void beginAsyncSection(String, int);
+ method @Deprecated public static void beginSection(String);
+ method @Deprecated public static void endAsyncSection(String, int);
+ method @Deprecated public static void endSection();
+ method @Deprecated public static boolean isEnabled();
+ method @Deprecated public static void setCounter(String, int);
+ }
+
+ @RequiresApi(17) public class UserHandleCompat {
+ method public static android.os.UserHandle getUserHandleForUid(int);
+ }
+
+ public class UserManagerCompat {
+ method public static boolean isUserUnlocked(android.content.Context);
+ }
+
+}
+
+package androidx.core.provider {
+
+ public final class DocumentsContractCompat {
+ method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+ method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri? buildDocumentUri(String, String);
+ method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri? buildTreeDocumentUri(String, String);
+ method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+ method public static String? getDocumentId(android.net.Uri);
+ method public static String? getTreeDocumentId(android.net.Uri);
+ method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+ method public static boolean isTreeUri(android.net.Uri);
+ method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+ }
+
+ public static final class DocumentsContractCompat.DocumentCompat {
+ field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+ }
+
+ public final class FontRequest {
+ ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+ ctor public FontRequest(String, String, String, @ArrayRes int);
+ method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+ method @ArrayRes public int getCertificatesArrayResId();
+ method public String getProviderAuthority();
+ method public String getProviderPackage();
+ method public String getQuery();
+ }
+
+ public class FontsContractCompat {
+ method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+ method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+ }
+
+ public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+ ctor public FontsContractCompat.Columns();
+ field public static final String FILE_ID = "file_id";
+ field public static final String ITALIC = "font_italic";
+ field public static final String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
+ field public static final String TTC_INDEX = "font_ttc_index";
+ field public static final String VARIATION_SETTINGS = "font_variation_settings";
+ field public static final String WEIGHT = "font_weight";
+ }
+
+ public static class FontsContractCompat.FontFamilyResult {
+ method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+ method public int getStatusCode();
+ field public static final int STATUS_OK = 0; // 0x0
+ field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+ field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+ }
+
+ public static class FontsContractCompat.FontInfo {
+ method public int getResultCode();
+ method @IntRange(from=0) public int getTtcIndex();
+ method public android.net.Uri getUri();
+ method @IntRange(from=1, to=1000) public int getWeight();
+ method public boolean isItalic();
+ }
+
+ public static class FontsContractCompat.FontRequestCallback {
+ ctor public FontsContractCompat.FontRequestCallback();
+ method public void onTypefaceRequestFailed(int);
+ method public void onTypefaceRetrieved(android.graphics.Typeface!);
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+ }
+
+}
+
+package androidx.core.telephony {
+
+ @RequiresApi(22) public class SubscriptionManagerCompat {
+ method public static int getSlotIndex(int);
+ }
+
+ public class TelephonyManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+ method public static int getSubscriptionId(android.telephony.TelephonyManager);
+ }
+
+}
+
+package androidx.core.telephony.mbms {
+
+ public final class MbmsHelper {
+ method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class BidiFormatter {
+ method public static androidx.core.text.BidiFormatter! getInstance();
+ method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+ method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+ method public boolean getStereoReset();
+ method public boolean isRtl(String!);
+ method public boolean isRtl(CharSequence!);
+ method public boolean isRtlContext();
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public String! unicodeWrap(String!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, boolean);
+ method public String! unicodeWrap(String!);
+ method public CharSequence! unicodeWrap(CharSequence!);
+ }
+
+ public static final class BidiFormatter.Builder {
+ ctor public BidiFormatter.Builder();
+ ctor public BidiFormatter.Builder(boolean);
+ ctor public BidiFormatter.Builder(java.util.Locale!);
+ method public androidx.core.text.BidiFormatter! build();
+ method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+ method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+ }
+
+ public final class HtmlCompat {
+ method public static android.text.Spanned fromHtml(String, int);
+ method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+ method public static String toHtml(android.text.Spanned, int);
+ field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+ field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+ field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+ field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+ field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+ }
+
+ public final class ICUCompat {
+ method public static String? maximizeAndGetScript(java.util.Locale!);
+ }
+
+ public class PrecomputedTextCompat implements android.text.Spannable {
+ method public char charAt(int);
+ method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+ method @IntRange(from=0) public int getParagraphCount();
+ method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+ method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+ method public int getSpanEnd(Object!);
+ method public int getSpanFlags(Object!);
+ method public int getSpanStart(Object!);
+ method public <T> T![]! getSpans(int, int, Class<T!>!);
+ method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+ method public int length();
+ method public int nextSpanTransition(int, int, Class!);
+ method public void removeSpan(Object!);
+ method public void setSpan(Object!, int, int, int);
+ method public CharSequence! subSequence(int, int);
+ }
+
+ public static final class PrecomputedTextCompat.Params {
+ ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+ method @RequiresApi(23) public int getBreakStrategy();
+ method @RequiresApi(23) public int getHyphenationFrequency();
+ method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+ method public android.text.TextPaint getTextPaint();
+ }
+
+ public static class PrecomputedTextCompat.Params.Builder {
+ ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+ method public androidx.core.text.PrecomputedTextCompat.Params build();
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+ method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+ }
+
+ public interface TextDirectionHeuristicCompat {
+ method public boolean isRtl(char[]!, int, int);
+ method public boolean isRtl(CharSequence!, int, int);
+ }
+
+ public final class TextDirectionHeuristicsCompat {
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+ }
+
+ public final class TextUtilsCompat {
+ method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+ method public static String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.text.util {
+
+ public final class LinkifyCompat {
+ method public static boolean addLinks(android.text.Spannable, int);
+ method public static boolean addLinks(android.widget.TextView, int);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ }
+
+}
+
+package androidx.core.util {
+
+ public class AtomicFile {
+ ctor public AtomicFile(java.io.File);
+ method public void delete();
+ method public void failWrite(java.io.FileOutputStream?);
+ method public void finishWrite(java.io.FileOutputStream?);
+ method public java.io.File getBaseFile();
+ method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+ method public byte[] readFully() throws java.io.IOException;
+ method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+ }
+
+ public interface Consumer<T> {
+ method public void accept(T!);
+ }
+
+ public class ObjectsCompat {
+ method public static boolean equals(Object?, Object?);
+ method public static int hash(java.lang.Object!...);
+ method public static int hashCode(Object?);
+ method public static <T> T requireNonNull(T?);
+ method public static <T> T requireNonNull(T?, String);
+ method public static String? toString(Object?, String?);
+ }
+
+ public class Pair<F, S> {
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
+ }
+
+ public final class PatternsCompat {
+ field public static final java.util.regex.Pattern DOMAIN_NAME;
+ field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+ field public static final java.util.regex.Pattern IP_ADDRESS;
+ field public static final java.util.regex.Pattern WEB_URL;
+ }
+
+ public final class Pools {
+ }
+
+ public static interface Pools.Pool<T> {
+ method public T? acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+ ctor public Pools.SimplePool(int);
+ method public T! acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+ ctor public Pools.SynchronizedPool(int);
+ }
+
+ public interface Predicate<T> {
+ method public boolean test(T!);
+ }
+
+ public interface Supplier<T> {
+ method public T! get();
+ }
+
+}
+
+package androidx.core.view {
+
+ public class AccessibilityDelegateCompat {
+ ctor public AccessibilityDelegateCompat();
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+ method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+ method public void sendAccessibilityEvent(android.view.View!, int);
+ method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public abstract class ActionProvider {
+ ctor public ActionProvider(android.content.Context!);
+ method public android.content.Context! getContext();
+ method public boolean hasSubMenu();
+ method public boolean isVisible();
+ method public abstract android.view.View! onCreateActionView();
+ method public android.view.View! onCreateActionView(android.view.MenuItem!);
+ method public boolean onPerformDefaultAction();
+ method public void onPrepareSubMenu(android.view.SubMenu!);
+ method public boolean overridesItemVisibility();
+ method public void refreshVisibility();
+ method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+ }
+
+ public static interface ActionProvider.VisibilityListener {
+ method public void onActionProviderVisibilityChanged(boolean);
+ }
+
+ public final class ContentInfoCompat {
+ method public android.content.ClipData getClip();
+ method public android.os.Bundle? getExtras();
+ method public int getFlags();
+ method public android.net.Uri? getLinkUri();
+ method public int getSource();
+ method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+ method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+ method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+ method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+ field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+ field public static final int SOURCE_APP = 0; // 0x0
+ field public static final int SOURCE_AUTOFILL = 4; // 0x4
+ field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+ field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+ field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+ field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+ }
+
+ public static final class ContentInfoCompat.Builder {
+ ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+ ctor public ContentInfoCompat.Builder(android.content.ClipData, int);
+ method public androidx.core.view.ContentInfoCompat build();
+ method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+ method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+ method public androidx.core.view.ContentInfoCompat.Builder setFlags(int);
+ method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+ method public androidx.core.view.ContentInfoCompat.Builder setSource(int);
+ }
+
+ public final class DisplayCompat {
+ method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+ method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+ }
+
+ public static final class DisplayCompat.ModeCompat {
+ method public int getPhysicalHeight();
+ method public int getPhysicalWidth();
+ method @Deprecated public boolean isNative();
+ method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+ }
+
+ public final class DisplayCutoutCompat {
+ ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+ ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+ method public java.util.List<android.graphics.Rect!> getBoundingRects();
+ method public int getSafeInsetBottom();
+ method public int getSafeInsetLeft();
+ method public int getSafeInsetRight();
+ method public int getSafeInsetTop();
+ method public androidx.core.graphics.Insets getWaterfallInsets();
+ }
+
+ public final class DragAndDropPermissionsCompat {
+ method public void release();
+ }
+
+ public class DragStartHelper {
+ ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+ method public void attach();
+ method public void detach();
+ method public void getTouchPosition(android.graphics.Point!);
+ method public boolean onLongClick(android.view.View!);
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ }
+
+ public static interface DragStartHelper.OnDragStartListener {
+ method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+ }
+
+ public final class GestureDetectorCompat {
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+ method public boolean isLongpressEnabled();
+ method public boolean onTouchEvent(android.view.MotionEvent!);
+ method public void setIsLongpressEnabled(boolean);
+ method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+ }
+
+ public final class GravityCompat {
+ method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+ method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static int getAbsoluteGravity(int, int);
+ field public static final int END = 8388613; // 0x800005
+ field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+ field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+ field public static final int START = 8388611; // 0x800003
+ }
+
+ public final class InputDeviceCompat {
+ field public static final int SOURCE_ANY = -256; // 0xffffff00
+ field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+ field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+ field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+ field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+ field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+ field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+ field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+ field public static final int SOURCE_DPAD = 513; // 0x201
+ field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+ field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+ field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+ field public static final int SOURCE_KEYBOARD = 257; // 0x101
+ field public static final int SOURCE_MOUSE = 8194; // 0x2002
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+ field public static final int SOURCE_STYLUS = 16386; // 0x4002
+ field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+ field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+ field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+ field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+ field public static final int SOURCE_UNKNOWN = 0; // 0x0
+ }
+
+ public final class LayoutInflaterCompat {
+ method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+ method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+ method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+ }
+
+ @Deprecated public interface LayoutInflaterFactory {
+ method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+ }
+
+ public final class MarginLayoutParamsCompat {
+ method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+ method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+ method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+ }
+
+ public final class MenuCompat {
+ method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ }
+
+ public interface MenuHost {
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void invalidateMenu();
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ }
+
+ public class MenuHostHelper {
+ ctor public MenuHostHelper(Runnable);
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+ method public boolean onMenuItemSelected(android.view.MenuItem);
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ }
+
+ public final class MenuItemCompat {
+ method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+ method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+ method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+ method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+ method public static int getAlphabeticModifiers(android.view.MenuItem!);
+ method public static CharSequence! getContentDescription(android.view.MenuItem!);
+ method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+ method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+ method public static int getNumericModifiers(android.view.MenuItem!);
+ method public static CharSequence! getTooltipText(android.view.MenuItem!);
+ method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+ method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+ method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+ method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+ method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+ method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+ method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+ method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+ method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+ field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+ field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+ field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+ field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+ field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+ }
+
+ @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+ method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+ method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+ }
+
+ public interface MenuProvider {
+ method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+ method public boolean onMenuItemSelected(android.view.MenuItem);
+ }
+
+ public final class MotionEventCompat {
+ method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+ method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+ method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+ method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+ method @Deprecated public static int getSource(android.view.MotionEvent!);
+ method @Deprecated public static float getX(android.view.MotionEvent!, int);
+ method @Deprecated public static float getY(android.view.MotionEvent!, int);
+ method public static boolean isFromSource(android.view.MotionEvent!, int);
+ field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+ field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+ field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+ field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+ field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+ field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+ field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+ field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+ field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+ field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+ field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+ field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+ field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+ field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+ field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+ field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+ field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+ field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+ field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+ field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+ field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+ field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+ field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+ field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+ field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+ field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+ field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+ field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+ field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+ field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+ field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+ field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+ field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+ field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+ field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+ field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+ field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+ field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+ field @Deprecated public static final int AXIS_RX = 12; // 0xc
+ field @Deprecated public static final int AXIS_RY = 13; // 0xd
+ field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
+ field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+ field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+ field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+ field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+ field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+ field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+ field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+ field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+ field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+ field @Deprecated public static final int AXIS_X = 0; // 0x0
+ field @Deprecated public static final int AXIS_Y = 1; // 0x1
+ field @Deprecated public static final int AXIS_Z = 11; // 0xb
+ field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+ }
+
+ public interface NestedScrollingChild {
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean isNestedScrollingEnabled();
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(int);
+ method public void stopNestedScroll();
+ }
+
+ public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+ }
+
+ public class NestedScrollingChildHelper {
+ ctor public NestedScrollingChildHelper(android.view.View);
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, int);
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isNestedScrollingEnabled();
+ method public void onDetachedFromWindow();
+ method public void onStopNestedScroll(android.view.View);
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll();
+ method public void stopNestedScroll(int);
+ }
+
+ public interface NestedScrollingParent {
+ method public int getNestedScrollAxes();
+ method public boolean onNestedFling(android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(android.view.View, float, float);
+ method public void onNestedPreScroll(android.view.View, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int);
+ method public void onStopNestedScroll(android.view.View);
+ }
+
+ public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+ method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, int);
+ }
+
+ public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+ method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+ }
+
+ public class NestedScrollingParentHelper {
+ ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+ method public int getNestedScrollAxes();
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View);
+ method public void onStopNestedScroll(android.view.View, int);
+ }
+
+ public interface OnApplyWindowInsetsListener {
+ method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+ }
+
+ public interface OnReceiveContentListener {
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ }
+
+ public interface OnReceiveContentViewBehavior {
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ }
+
+ public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+ method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+ method public boolean onPreDraw();
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ method public void removeListener();
+ }
+
+ public final class PointerIconCompat {
+ method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+ method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+ method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+ field public static final int TYPE_ALIAS = 1010; // 0x3f2
+ field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+ field public static final int TYPE_ARROW = 1000; // 0x3e8
+ field public static final int TYPE_CELL = 1006; // 0x3ee
+ field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+ field public static final int TYPE_COPY = 1011; // 0x3f3
+ field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+ field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+ field public static final int TYPE_GRAB = 1020; // 0x3fc
+ field public static final int TYPE_GRABBING = 1021; // 0x3fd
+ field public static final int TYPE_HAND = 1002; // 0x3ea
+ field public static final int TYPE_HELP = 1003; // 0x3eb
+ field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+ field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+ field public static final int TYPE_NULL = 0; // 0x0
+ field public static final int TYPE_TEXT = 1008; // 0x3f0
+ field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+ field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+ field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+ field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+ field public static final int TYPE_WAIT = 1004; // 0x3ec
+ field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+ field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+ }
+
+ public final class ScaleGestureDetectorCompat {
+ method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+ method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+ method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+ method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+ }
+
+ public interface ScrollingView {
+ method public int computeHorizontalScrollExtent();
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ }
+
+ public interface TintableBackgroundView {
+ method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @Deprecated public final class VelocityTrackerCompat {
+ method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+ method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+ }
+
+ public class ViewCompat {
+ ctor @Deprecated protected ViewCompat();
+ method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+ method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+ method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+ method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+ method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+ method public static void cancelDragAndDrop(android.view.View);
+ method @Deprecated public static int combineMeasuredStates(int, int);
+ method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+ method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+ method public static void dispatchFinishTemporaryDetach(android.view.View);
+ method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+ method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, int);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+ method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int, int[]);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, int);
+ method public static void dispatchStartTemporaryDetach(android.view.View);
+ method public static void enableAccessibleClickableSpanSupport(android.view.View);
+ method public static int generateViewId();
+ method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+ method public static int getAccessibilityLiveRegion(android.view.View);
+ method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+ method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+ method @Deprecated public static float getAlpha(android.view.View!);
+ method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+ method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+ method public static android.graphics.Rect? getClipBounds(android.view.View);
+ method public static android.view.Display? getDisplay(android.view.View);
+ method public static float getElevation(android.view.View);
+ method public static boolean getFitsSystemWindows(android.view.View);
+ method public static int getImportantForAccessibility(android.view.View);
+ method public static int getImportantForAutofill(android.view.View);
+ method public static int getLabelFor(android.view.View);
+ method @Deprecated public static int getLayerType(android.view.View!);
+ method public static int getLayoutDirection(android.view.View);
+ method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+ method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+ method @Deprecated public static int getMeasuredState(android.view.View!);
+ method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+ method public static int getMinimumHeight(android.view.View);
+ method public static int getMinimumWidth(android.view.View);
+ method public static int getNextClusterForwardId(android.view.View);
+ method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+ method @Deprecated public static int getOverScrollMode(android.view.View!);
+ method @Px public static int getPaddingEnd(android.view.View);
+ method @Px public static int getPaddingStart(android.view.View);
+ method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+ method @Deprecated public static float getPivotX(android.view.View!);
+ method @Deprecated public static float getPivotY(android.view.View!);
+ method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+ method @Deprecated public static float getRotation(android.view.View!);
+ method @Deprecated public static float getRotationX(android.view.View!);
+ method @Deprecated public static float getRotationY(android.view.View!);
+ method @Deprecated public static float getScaleX(android.view.View!);
+ method @Deprecated public static float getScaleY(android.view.View!);
+ method public static int getScrollIndicators(android.view.View);
+ method @UiThread public static CharSequence? getStateDescription(android.view.View);
+ method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+ method public static String? getTransitionName(android.view.View);
+ method @Deprecated public static float getTranslationX(android.view.View!);
+ method @Deprecated public static float getTranslationY(android.view.View!);
+ method public static float getTranslationZ(android.view.View);
+ method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+ method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+ method @Deprecated public static float getX(android.view.View!);
+ method @Deprecated public static float getY(android.view.View!);
+ method public static float getZ(android.view.View);
+ method public static boolean hasAccessibilityDelegate(android.view.View);
+ method public static boolean hasExplicitFocusable(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View, int);
+ method public static boolean hasOnClickListeners(android.view.View);
+ method public static boolean hasOverlappingRendering(android.view.View);
+ method public static boolean hasTransientState(android.view.View);
+ method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+ method public static boolean isAttachedToWindow(android.view.View);
+ method public static boolean isFocusedByDefault(android.view.View);
+ method public static boolean isImportantForAccessibility(android.view.View);
+ method public static boolean isImportantForAutofill(android.view.View);
+ method public static boolean isInLayout(android.view.View);
+ method public static boolean isKeyboardNavigationCluster(android.view.View);
+ method public static boolean isLaidOut(android.view.View);
+ method public static boolean isLayoutDirectionResolved(android.view.View);
+ method public static boolean isNestedScrollingEnabled(android.view.View);
+ method @Deprecated public static boolean isOpaque(android.view.View!);
+ method public static boolean isPaddingRelative(android.view.View);
+ method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+ method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+ method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, int);
+ method public static void offsetLeftAndRight(android.view.View, int);
+ method public static void offsetTopAndBottom(android.view.View, int);
+ method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+ method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+ method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+ method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ method public static void postInvalidateOnAnimation(android.view.View);
+ method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+ method public static void postOnAnimation(android.view.View, Runnable);
+ method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+ method public static void removeAccessibilityAction(android.view.View, int);
+ method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+ method public static void requestApplyInsets(android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+ method @Deprecated public static int resolveSizeAndState(int, int, int);
+ method public static boolean restoreDefaultFocus(android.view.View);
+ method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+ method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+ method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+ method public static void setAccessibilityLiveRegion(android.view.View, int);
+ method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+ method @Deprecated public static void setActivated(android.view.View!, boolean);
+ method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+ method public static void setAutofillHints(android.view.View, java.lang.String!...);
+ method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+ method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+ method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+ method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+ method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+ method public static void setElevation(android.view.View, float);
+ method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+ method public static void setFocusedByDefault(android.view.View, boolean);
+ method public static void setHasTransientState(android.view.View, boolean);
+ method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+ method public static void setImportantForAutofill(android.view.View, int);
+ method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+ method public static void setLabelFor(android.view.View, @IdRes int);
+ method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+ method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+ method public static void setLayoutDirection(android.view.View, int);
+ method public static void setNestedScrollingEnabled(android.view.View, boolean);
+ method public static void setNextClusterForwardId(android.view.View, int);
+ method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+ method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+ method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+ method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+ method @Deprecated public static void setPivotX(android.view.View!, float);
+ method @Deprecated public static void setPivotY(android.view.View!, float);
+ method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+ method @Deprecated public static void setRotation(android.view.View!, float);
+ method @Deprecated public static void setRotationX(android.view.View!, float);
+ method @Deprecated public static void setRotationY(android.view.View!, float);
+ method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+ method @Deprecated public static void setScaleX(android.view.View!, float);
+ method @Deprecated public static void setScaleY(android.view.View!, float);
+ method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+ method public static void setScrollIndicators(android.view.View, int);
+ method public static void setScrollIndicators(android.view.View, int, int);
+ method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+ method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ method public static void setTransitionName(android.view.View, String?);
+ method @Deprecated public static void setTranslationX(android.view.View!, float);
+ method @Deprecated public static void setTranslationY(android.view.View!, float);
+ method public static void setTranslationZ(android.view.View, float);
+ method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+ method @Deprecated public static void setX(android.view.View!, float);
+ method @Deprecated public static void setY(android.view.View!, float);
+ method public static void setZ(android.view.View, float);
+ method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+ method public static boolean startNestedScroll(android.view.View, int);
+ method public static boolean startNestedScroll(android.view.View, int, int);
+ method public static void stopNestedScroll(android.view.View);
+ method public static void stopNestedScroll(android.view.View, int);
+ method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+ field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+ field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+ field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+ field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+ field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+ field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+ field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+ field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+ field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+ field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+ field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+ field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+ field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+ field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+ field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+ field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+ field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+ field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+ field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+ field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+ field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+ field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+ field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+ field public static final int TYPE_NON_TOUCH = 1; // 0x1
+ field public static final int TYPE_TOUCH = 0; // 0x0
+ }
+
+ public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+ method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+ }
+
+ public final class ViewConfigurationCompat {
+ method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+ method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+ method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+ method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+ }
+
+ public final class ViewGroupCompat {
+ method public static int getLayoutMode(android.view.ViewGroup);
+ method public static int getNestedScrollAxes(android.view.ViewGroup);
+ method public static boolean isTransitionGroup(android.view.ViewGroup);
+ method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void setLayoutMode(android.view.ViewGroup, int);
+ method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+ method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+ field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+ field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+ }
+
+ public final class ViewParentCompat {
+ method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+ method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+ method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public final class ViewPropertyAnimatorCompat {
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+ method public void cancel();
+ method public long getDuration();
+ method public android.view.animation.Interpolator! getInterpolator();
+ method public long getStartDelay();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+ method public void start();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+ }
+
+ public interface ViewPropertyAnimatorListener {
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+ ctor public ViewPropertyAnimatorListenerAdapter();
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public interface ViewPropertyAnimatorUpdateListener {
+ method public void onAnimationUpdate(android.view.View!);
+ }
+
+ public final class WindowCompat {
+ method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+ method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+ field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+ field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ }
+
+ public final class WindowInsetsAnimationCompat {
+ ctor public WindowInsetsAnimationCompat(int, android.view.animation.Interpolator?, long);
+ method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+ method public long getDurationMillis();
+ method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+ method public float getInterpolatedFraction();
+ method public android.view.animation.Interpolator? getInterpolator();
+ method public int getTypeMask();
+ method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+ method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+ }
+
+ public static final class WindowInsetsAnimationCompat.BoundsCompat {
+ ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public androidx.core.graphics.Insets getLowerBound();
+ method public androidx.core.graphics.Insets getUpperBound();
+ method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+ method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+ method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+ }
+
+ public abstract static class WindowInsetsAnimationCompat.Callback {
+ ctor public WindowInsetsAnimationCompat.Callback(int);
+ method public final int getDispatchMode();
+ method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+ method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+ method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+ method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+ field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+ field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+ }
+
+ public interface WindowInsetsAnimationControlListenerCompat {
+ method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+ method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+ method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, int);
+ }
+
+ public final class WindowInsetsAnimationControllerCompat {
+ method public void finish(boolean);
+ method public float getCurrentAlpha();
+ method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+ method public androidx.core.graphics.Insets getCurrentInsets();
+ method public androidx.core.graphics.Insets getHiddenStateInsets();
+ method public androidx.core.graphics.Insets getShownStateInsets();
+ method public int getTypes();
+ method public boolean isCancelled();
+ method public boolean isFinished();
+ method public boolean isReady();
+ method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+ }
+
+ public class WindowInsetsCompat {
+ ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+ method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+ method public androidx.core.graphics.Insets getInsets(int);
+ method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(int);
+ method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+ method @Deprecated public int getStableInsetBottom();
+ method @Deprecated public int getStableInsetLeft();
+ method @Deprecated public int getStableInsetRight();
+ method @Deprecated public int getStableInsetTop();
+ method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+ method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+ method @Deprecated public int getSystemWindowInsetBottom();
+ method @Deprecated public int getSystemWindowInsetLeft();
+ method @Deprecated public int getSystemWindowInsetRight();
+ method @Deprecated public int getSystemWindowInsetTop();
+ method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+ method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+ method public boolean hasInsets();
+ method @Deprecated public boolean hasStableInsets();
+ method @Deprecated public boolean hasSystemWindowInsets();
+ method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+ method public boolean isConsumed();
+ method public boolean isRound();
+ method public boolean isVisible(int);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+ method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+ method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+ method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+ field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+ }
+
+ public static final class WindowInsetsCompat.Builder {
+ ctor public WindowInsetsCompat.Builder();
+ ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+ method public androidx.core.view.WindowInsetsCompat build();
+ method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+ method public androidx.core.view.WindowInsetsCompat.Builder setInsets(int, androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(int, androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat.Builder setVisible(int, boolean);
+ }
+
+ public static final class WindowInsetsCompat.Type {
+ method public static int captionBar();
+ method public static int displayCutout();
+ method public static int ime();
+ method public static int mandatorySystemGestures();
+ method public static int navigationBars();
+ method public static int statusBars();
+ method public static int systemBars();
+ method public static int systemGestures();
+ method public static int tappableElement();
+ }
+
+ public final class WindowInsetsControllerCompat {
+ ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+ method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+ method public void controlWindowInsetsAnimation(int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+ method public int getSystemBarsBehavior();
+ method public void hide(int);
+ method public boolean isAppearanceLightNavigationBars();
+ method public boolean isAppearanceLightStatusBars();
+ method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+ method public void setAppearanceLightNavigationBars(boolean);
+ method public void setAppearanceLightStatusBars(boolean);
+ method public void setSystemBarsBehavior(int);
+ method public void show(int);
+ method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+ field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+ field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+ field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+ }
+
+ public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+ method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, int);
+ }
+
+}
+
+package androidx.core.view.accessibility {
+
+ public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+ method public void onClick(android.view.View);
+ }
+
+ public final class AccessibilityEventCompat {
+ method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+ method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+ method public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+ method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+ method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+ method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+ field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+ field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+ field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+ field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+ field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+ field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+ field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+ field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+ field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+ field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+ field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+ field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+ field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+ field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+ field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+ field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+ field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+ field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+ field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+ field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+ field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+ field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+ field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+ }
+
+ public final class AccessibilityManagerCompat {
+ method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ }
+
+ @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ method @Deprecated public void onAccessibilityStateChanged(boolean);
+ }
+
+ @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+ }
+
+ public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+ method public void onTouchExplorationStateChanged(boolean);
+ }
+
+ public class AccessibilityNodeInfoCompat {
+ ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+ method public void addAction(int);
+ method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public void addChild(android.view.View!);
+ method public void addChild(android.view.View!, int);
+ method public boolean canOpenPopup();
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+ method public int getActions();
+ method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public CharSequence! getClassName();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+ method public CharSequence! getContentDescription();
+ method public int getDrawingOrder();
+ method public CharSequence! getError();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence? getHintText();
+ method @Deprecated public Object! getInfo();
+ method public int getInputType();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+ method public int getLiveRegion();
+ method public int getMaxTextLength();
+ method public int getMovementGranularities();
+ method public CharSequence! getPackageName();
+ method public CharSequence? getPaneTitle();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+ method public CharSequence? getRoleDescription();
+ method public CharSequence? getStateDescription();
+ method public CharSequence! getText();
+ method public int getTextSelectionEnd();
+ method public int getTextSelectionStart();
+ method public CharSequence? getTooltipText();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+ method public String! getViewIdResourceName();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+ method public int getWindowId();
+ method public boolean isAccessibilityFocused();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isClickable();
+ method public boolean isContentInvalid();
+ method public boolean isContextClickable();
+ method public boolean isDismissable();
+ method public boolean isEditable();
+ method public boolean isEnabled();
+ method public boolean isFocusable();
+ method public boolean isFocused();
+ method public boolean isHeading();
+ method public boolean isImportantForAccessibility();
+ method public boolean isLongClickable();
+ method public boolean isMultiLine();
+ method public boolean isPassword();
+ method public boolean isScreenReaderFocusable();
+ method public boolean isScrollable();
+ method public boolean isSelected();
+ method public boolean isShowingHintText();
+ method public boolean isTextEntryKey();
+ method public boolean isVisibleToUser();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public boolean performAction(int);
+ method public boolean performAction(int, android.os.Bundle!);
+ method public void recycle();
+ method public boolean refresh();
+ method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public boolean removeChild(android.view.View!);
+ method public boolean removeChild(android.view.View!, int);
+ method public void setAccessibilityFocused(boolean);
+ method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+ method public void setBoundsInScreen(android.graphics.Rect!);
+ method public void setCanOpenPopup(boolean);
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setClassName(CharSequence!);
+ method public void setClickable(boolean);
+ method public void setCollectionInfo(Object!);
+ method public void setCollectionItemInfo(Object!);
+ method public void setContentDescription(CharSequence!);
+ method public void setContentInvalid(boolean);
+ method public void setContextClickable(boolean);
+ method public void setDismissable(boolean);
+ method public void setDrawingOrder(int);
+ method public void setEditable(boolean);
+ method public void setEnabled(boolean);
+ method public void setError(CharSequence!);
+ method public void setFocusable(boolean);
+ method public void setFocused(boolean);
+ method public void setHeading(boolean);
+ method public void setHintText(CharSequence?);
+ method public void setImportantForAccessibility(boolean);
+ method public void setInputType(int);
+ method public void setLabelFor(android.view.View!);
+ method public void setLabelFor(android.view.View!, int);
+ method public void setLabeledBy(android.view.View!);
+ method public void setLabeledBy(android.view.View!, int);
+ method public void setLiveRegion(int);
+ method public void setLongClickable(boolean);
+ method public void setMaxTextLength(int);
+ method public void setMovementGranularities(int);
+ method public void setMultiLine(boolean);
+ method public void setPackageName(CharSequence!);
+ method public void setPaneTitle(CharSequence?);
+ method public void setParent(android.view.View!);
+ method public void setParent(android.view.View!, int);
+ method public void setPassword(boolean);
+ method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+ method public void setRoleDescription(CharSequence?);
+ method public void setScreenReaderFocusable(boolean);
+ method public void setScrollable(boolean);
+ method public void setSelected(boolean);
+ method public void setShowingHintText(boolean);
+ method public void setSource(android.view.View!);
+ method public void setSource(android.view.View!, int);
+ method public void setStateDescription(CharSequence?);
+ method public void setText(CharSequence!);
+ method public void setTextEntryKey(boolean);
+ method public void setTextSelection(int, int);
+ method public void setTooltipText(CharSequence?);
+ method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+ method public void setTraversalAfter(android.view.View!);
+ method public void setTraversalAfter(android.view.View!, int);
+ method public void setTraversalBefore(android.view.View!);
+ method public void setTraversalBefore(android.view.View!, int);
+ method public void setViewIdResourceName(String!);
+ method public void setVisibleToUser(boolean);
+ method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+ field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+ field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+ field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+ field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+ field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+ field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+ field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+ field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+ field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+ field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+ field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+ field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+ field public static final int ACTION_CLICK = 16; // 0x10
+ field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+ field public static final int ACTION_COPY = 16384; // 0x4000
+ field public static final int ACTION_CUT = 65536; // 0x10000
+ field public static final int ACTION_DISMISS = 1048576; // 0x100000
+ field public static final int ACTION_EXPAND = 262144; // 0x40000
+ field public static final int ACTION_FOCUS = 1; // 0x1
+ field public static final int ACTION_LONG_CLICK = 32; // 0x20
+ field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+ field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+ field public static final int ACTION_PASTE = 32768; // 0x8000
+ field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+ field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+ field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+ field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+ field public static final int ACTION_SELECT = 4; // 0x4
+ field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+ field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+ field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+ field public static final int FOCUS_INPUT = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+ field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+ field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+ field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+ }
+
+ public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+ ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+ method public int getId();
+ method public CharSequence! getLabel();
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+ method public int getColumnCount();
+ method public int getRowCount();
+ method public int getSelectionMode();
+ method public boolean isHierarchical();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+ field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+ field public static final int SELECTION_MODE_NONE = 0; // 0x0
+ field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+ method public int getColumnIndex();
+ method public int getColumnSpan();
+ method public int getRowIndex();
+ method public int getRowSpan();
+ method @Deprecated public boolean isHeading();
+ method public boolean isSelected();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+ }
+
+ public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+ method public float getCurrent();
+ method public float getMax();
+ method public float getMin();
+ method public int getType();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+ field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+ field public static final int RANGE_TYPE_INT = 0; // 0x0
+ field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+ }
+
+ public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+ ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+ method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getRegionCount();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+ }
+
+ public class AccessibilityNodeProviderCompat {
+ ctor public AccessibilityNodeProviderCompat();
+ ctor public AccessibilityNodeProviderCompat(Object!);
+ method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+ method public Object! getProvider();
+ method public boolean performAction(int, int, android.os.Bundle!);
+ field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+ }
+
+ public class AccessibilityRecordCompat {
+ ctor @Deprecated public AccessibilityRecordCompat(Object!);
+ method @Deprecated public boolean equals(Object?);
+ method @Deprecated public int getAddedCount();
+ method @Deprecated public CharSequence! getBeforeText();
+ method @Deprecated public CharSequence! getClassName();
+ method @Deprecated public CharSequence! getContentDescription();
+ method @Deprecated public int getCurrentItemIndex();
+ method @Deprecated public int getFromIndex();
+ method @Deprecated public Object! getImpl();
+ method @Deprecated public int getItemCount();
+ method @Deprecated public int getMaxScrollX();
+ method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public int getMaxScrollY();
+ method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public android.os.Parcelable! getParcelableData();
+ method @Deprecated public int getRemovedCount();
+ method @Deprecated public int getScrollX();
+ method @Deprecated public int getScrollY();
+ method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+ method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+ method @Deprecated public int getToIndex();
+ method @Deprecated public int getWindowId();
+ method @Deprecated public int hashCode();
+ method @Deprecated public boolean isChecked();
+ method @Deprecated public boolean isEnabled();
+ method @Deprecated public boolean isFullScreen();
+ method @Deprecated public boolean isPassword();
+ method @Deprecated public boolean isScrollable();
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+ method @Deprecated public void recycle();
+ method @Deprecated public void setAddedCount(int);
+ method @Deprecated public void setBeforeText(CharSequence!);
+ method @Deprecated public void setChecked(boolean);
+ method @Deprecated public void setClassName(CharSequence!);
+ method @Deprecated public void setContentDescription(CharSequence!);
+ method @Deprecated public void setCurrentItemIndex(int);
+ method @Deprecated public void setEnabled(boolean);
+ method @Deprecated public void setFromIndex(int);
+ method @Deprecated public void setFullScreen(boolean);
+ method @Deprecated public void setItemCount(int);
+ method @Deprecated public void setMaxScrollX(int);
+ method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setMaxScrollY(int);
+ method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setParcelableData(android.os.Parcelable!);
+ method @Deprecated public void setPassword(boolean);
+ method @Deprecated public void setRemovedCount(int);
+ method @Deprecated public void setScrollX(int);
+ method @Deprecated public void setScrollY(int);
+ method @Deprecated public void setScrollable(boolean);
+ method @Deprecated public void setSource(android.view.View!);
+ method @Deprecated public void setSource(android.view.View!, int);
+ method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+ method @Deprecated public void setToIndex(int);
+ }
+
+ public interface AccessibilityViewCommand {
+ method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+ }
+
+ public abstract static class AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.CommandArguments();
+ }
+
+ public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+ method public boolean getExtendSelection();
+ method public int getGranularity();
+ }
+
+ public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveHtmlArguments();
+ method public String! getHTMLElement();
+ }
+
+ public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveWindowArguments();
+ method public int getX();
+ method public int getY();
+ }
+
+ public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+ method public int getColumn();
+ method public int getRow();
+ }
+
+ public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetProgressArguments();
+ method public float getProgress();
+ }
+
+ public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetSelectionArguments();
+ method public int getEnd();
+ method public int getStart();
+ }
+
+ public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetTextArguments();
+ method public CharSequence! getText();
+ }
+
+ public class AccessibilityWindowInfoCompat {
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public int getId();
+ method public int getLayer();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+ method public CharSequence! getTitle();
+ method public int getType();
+ method public boolean isAccessibilityFocused();
+ method public boolean isActive();
+ method public boolean isFocused();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+ method public void recycle();
+ field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+ field public static final int TYPE_APPLICATION = 1; // 0x1
+ field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+ field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+ field public static final int TYPE_SYSTEM = 3; // 0x3
+ }
+
+}
+
+package androidx.core.view.animation {
+
+ public final class PathInterpolatorCompat {
+ method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+ method public static android.view.animation.Interpolator! create(float, float);
+ method public static android.view.animation.Interpolator! create(float, float, float, float);
+ }
+
+}
+
+package androidx.core.view.inputmethod {
+
+ public final class EditorInfoCompat {
+ ctor @Deprecated public EditorInfoCompat();
+ method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+ method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+ method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+ method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+ method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+ method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+ method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+ field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+ field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+ }
+
+ public final class InputConnectionCompat {
+ ctor @Deprecated public InputConnectionCompat();
+ method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+ method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+ }
+
+ public static interface InputConnectionCompat.OnCommitContentListener {
+ method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ }
+
+ public final class InputContentInfoCompat {
+ ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+ method public android.net.Uri getContentUri();
+ method public android.content.ClipDescription getDescription();
+ method public android.net.Uri? getLinkUri();
+ method public void releasePermission();
+ method public void requestPermission();
+ method public Object? unwrap();
+ method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+ ctor public AutoScrollHelper(android.view.View);
+ method public abstract boolean canTargetScrollHorizontally(int);
+ method public abstract boolean canTargetScrollVertically(int);
+ method public boolean isEnabled();
+ method public boolean isExclusive();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public abstract void scrollTargetBy(int, int);
+ method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+ method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+ method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+ method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+ method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+ field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+ field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+ field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+ field public static final float NO_MAX = 3.4028235E38f;
+ field public static final float NO_MIN = 0.0f;
+ field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+ }
+
+ public final class CheckedTextViewCompat {
+ method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+ method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+ method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+ method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+ method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class CompoundButtonCompat {
+ method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+ method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+ method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+ method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+ method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+ }
+
+ public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+ ctor public ContentLoadingProgressBar(android.content.Context);
+ ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+ method public void hide();
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void show();
+ }
+
+ public final class EdgeEffectCompat {
+ ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+ method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+ method @Deprecated public boolean draw(android.graphics.Canvas!);
+ method @Deprecated public void finish();
+ method public static float getDistance(android.widget.EdgeEffect);
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean onAbsorb(int);
+ method @Deprecated public boolean onPull(float);
+ method @Deprecated public boolean onPull(float, float);
+ method public static void onPull(android.widget.EdgeEffect, float, float);
+ method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+ method @Deprecated public boolean onRelease();
+ method @Deprecated public void setSize(int, int);
+ }
+
+ public class ImageViewCompat {
+ method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+ method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+ method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+ method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class ListPopupWindowCompat {
+ method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+ method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+ }
+
+ public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+ ctor public ListViewAutoScrollHelper(android.widget.ListView);
+ method public boolean canTargetScrollHorizontally(int);
+ method public boolean canTargetScrollVertically(int);
+ method public void scrollTargetBy(int, int);
+ }
+
+ public final class ListViewCompat {
+ method public static boolean canScrollList(android.widget.ListView, int);
+ method public static void scrollListBy(android.widget.ListView, int);
+ }
+
+ public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+ ctor public NestedScrollView(android.content.Context);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean arrowScroll(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+ method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+ method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+ method public boolean executeKeyEvent(android.view.KeyEvent);
+ method public void fling(int);
+ method public boolean fullScroll(int);
+ method public int getMaxScrollAmount();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isFillViewport();
+ method public boolean isSmoothScrollingEnabled();
+ method public void onAttachedToWindow();
+ method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, int);
+ method public boolean pageScroll(int);
+ method public void setFillViewport(boolean);
+ method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+ method public void setSmoothScrollingEnabled(boolean);
+ method public final void smoothScrollBy(int, int);
+ method public final void smoothScrollBy(int, int, int);
+ method public final void smoothScrollTo(int, int);
+ method public final void smoothScrollTo(int, int, int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public static interface NestedScrollView.OnScrollChangeListener {
+ method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+ }
+
+ public final class PopupMenuCompat {
+ method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+ }
+
+ public final class PopupWindowCompat {
+ method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+ method public static int getWindowLayoutType(android.widget.PopupWindow);
+ method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+ method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+ method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+ }
+
+ @Deprecated public final class ScrollerCompat {
+ method @Deprecated public void abortAnimation();
+ method @Deprecated public boolean computeScrollOffset();
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+ method @Deprecated public float getCurrVelocity();
+ method @Deprecated public int getCurrX();
+ method @Deprecated public int getCurrY();
+ method @Deprecated public int getFinalX();
+ method @Deprecated public int getFinalY();
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean isOverScrolled();
+ method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+ method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+ method @Deprecated public boolean springBack(int, int, int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int, int);
+ }
+
+ public final class TextViewCompat {
+ method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+ method public static int getAutoSizeMinTextSize(android.widget.TextView);
+ method public static int getAutoSizeStepGranularity(android.widget.TextView);
+ method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+ method public static int getAutoSizeTextType(android.widget.TextView);
+ method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+ method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+ method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+ method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+ method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+ method public static int getMaxLines(android.widget.TextView);
+ method public static int getMinLines(android.widget.TextView);
+ method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+ method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+ method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+ method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+ method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+ method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+ method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+ method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+ method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+ field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+ field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+ }
+
+ public interface TintableCompoundButton {
+ method public android.content.res.ColorStateList? getSupportButtonTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface TintableCompoundDrawablesView {
+ method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+}
+
diff --git a/core/core/api/res-1.7.0-beta03.txt b/core/core/api/res-1.7.0-beta03.txt
new file mode 100644
index 0000000..dd913d3
--- /dev/null
+++ b/core/core/api/res-1.7.0-beta03.txt
@@ -0,0 +1,21 @@
+attr alpha
+attr font
+attr fontProviderAuthority
+attr fontProviderCerts
+attr fontProviderFetchStrategy
+attr fontProviderFetchTimeout
+attr fontProviderPackage
+attr fontProviderQuery
+attr fontProviderSystemFontFamily
+attr fontStyle
+attr fontVariationSettings
+attr fontWeight
+attr lStar
+attr queryPatterns
+attr shortcutMatchRequired
+attr ttcIndex
+style TextAppearance_Compat_Notification
+style TextAppearance_Compat_Notification_Info
+style TextAppearance_Compat_Notification_Line2
+style TextAppearance_Compat_Notification_Time
+style TextAppearance_Compat_Notification_Title
diff --git a/core/core/api/restricted_1.7.0-beta03.txt b/core/core/api/restricted_1.7.0-beta03.txt
new file mode 100644
index 0000000..c28a0bf
--- /dev/null
+++ b/core/core/api/restricted_1.7.0-beta03.txt
@@ -0,0 +1,4192 @@
+// Signature format: 4.0
+package android.support.v4.os {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ResultReceiver implements android.os.Parcelable {
+ ctor public ResultReceiver(android.os.Handler!);
+ method public int describeContents();
+ method protected void onReceiveResult(int, android.os.Bundle!);
+ method public void send(int, android.os.Bundle!);
+ method public void writeToParcel(android.os.Parcel!, int);
+ field public static final android.os.Parcelable.Creator<android.support.v4.os.ResultReceiver!>! CREATOR;
+ }
+
+}
+
+package androidx.core.accessibilityservice {
+
+ public final class AccessibilityServiceInfoCompat {
+ method public static String capabilityToString(int);
+ method public static String feedbackTypeToString(int);
+ method public static String? flagToString(int);
+ method public static int getCapabilities(android.accessibilityservice.AccessibilityServiceInfo);
+ method public static String? loadDescription(android.accessibilityservice.AccessibilityServiceInfo, android.content.pm.PackageManager);
+ field public static final int CAPABILITY_CAN_FILTER_KEY_EVENTS = 8; // 0x8
+ field public static final int CAPABILITY_CAN_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 4; // 0x4
+ field public static final int CAPABILITY_CAN_REQUEST_TOUCH_EXPLORATION = 2; // 0x2
+ field public static final int CAPABILITY_CAN_RETRIEVE_WINDOW_CONTENT = 1; // 0x1
+ field public static final int FEEDBACK_ALL_MASK = -1; // 0xffffffff
+ field public static final int FEEDBACK_BRAILLE = 32; // 0x20
+ field public static final int FLAG_INCLUDE_NOT_IMPORTANT_VIEWS = 2; // 0x2
+ field public static final int FLAG_REPORT_VIEW_IDS = 16; // 0x10
+ field public static final int FLAG_REQUEST_ENHANCED_WEB_ACCESSIBILITY = 8; // 0x8
+ field public static final int FLAG_REQUEST_FILTER_KEY_EVENTS = 32; // 0x20
+ field public static final int FLAG_REQUEST_TOUCH_EXPLORATION_MODE = 4; // 0x4
+ }
+
+}
+
+package androidx.core.app {
+
+ public class ActivityCompat extends androidx.core.content.ContextCompat {
+ ctor protected ActivityCompat();
+ method public static void finishAffinity(android.app.Activity);
+ method public static void finishAfterTransition(android.app.Activity);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.ActivityCompat.PermissionCompatDelegate! getPermissionCompatDelegate();
+ method public static android.net.Uri? getReferrer(android.app.Activity);
+ method @Deprecated public static boolean invalidateOptionsMenu(android.app.Activity!);
+ method public static boolean isLaunchedFromBubble(android.app.Activity);
+ method public static void postponeEnterTransition(android.app.Activity);
+ method public static void recreate(android.app.Activity);
+ method public static androidx.core.view.DragAndDropPermissionsCompat? requestDragAndDropPermissions(android.app.Activity!, android.view.DragEvent!);
+ method public static void requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+ method public static <T extends android.view.View> T requireViewById(android.app.Activity, @IdRes int);
+ method public static void setEnterSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setExitSharedElementCallback(android.app.Activity, androidx.core.app.SharedElementCallback?);
+ method public static void setLocusContext(android.app.Activity, androidx.core.content.LocusIdCompat?, android.os.Bundle?);
+ method public static void setPermissionCompatDelegate(androidx.core.app.ActivityCompat.PermissionCompatDelegate?);
+ method public static boolean shouldShowRequestPermissionRationale(android.app.Activity, String);
+ method public static void startActivityForResult(android.app.Activity, android.content.Intent, int, android.os.Bundle?);
+ method public static void startIntentSenderForResult(android.app.Activity, android.content.IntentSender, int, android.content.Intent?, int, int, int, android.os.Bundle?) throws android.content.IntentSender.SendIntentException;
+ method public static void startPostponedEnterTransition(android.app.Activity);
+ }
+
+ public static interface ActivityCompat.OnRequestPermissionsResultCallback {
+ method public void onRequestPermissionsResult(int, String![], int[]);
+ }
+
+ public static interface ActivityCompat.PermissionCompatDelegate {
+ method public boolean onActivityResult(android.app.Activity, @IntRange(from=0) int, int, android.content.Intent?);
+ method public boolean requestPermissions(android.app.Activity, String![], @IntRange(from=0) int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActivityCompat.RequestPermissionsRequestCodeValidator {
+ method public void validateRequestPermissionsRequestCode(int);
+ }
+
+ public final class ActivityManagerCompat {
+ method public static boolean isLowRamDevice(android.app.ActivityManager);
+ }
+
+ public class ActivityOptionsCompat {
+ ctor protected ActivityOptionsCompat();
+ method public android.graphics.Rect? getLaunchBounds();
+ method public static androidx.core.app.ActivityOptionsCompat makeBasic();
+ method public static androidx.core.app.ActivityOptionsCompat makeClipRevealAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeCustomAnimation(android.content.Context, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeScaleUpAnimation(android.view.View, int, int, int, int);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, android.view.View, String);
+ method public static androidx.core.app.ActivityOptionsCompat makeSceneTransitionAnimation(android.app.Activity, androidx.core.util.Pair<android.view.View!,java.lang.String!>!...);
+ method public static androidx.core.app.ActivityOptionsCompat makeTaskLaunchBehind();
+ method public static androidx.core.app.ActivityOptionsCompat makeThumbnailScaleUpAnimation(android.view.View, android.graphics.Bitmap, int, int);
+ method public void requestUsageTimeReport(android.app.PendingIntent);
+ method public androidx.core.app.ActivityOptionsCompat setLaunchBounds(android.graphics.Rect?);
+ method public android.os.Bundle? toBundle();
+ method public void update(androidx.core.app.ActivityOptionsCompat);
+ field public static final String EXTRA_USAGE_TIME_REPORT = "android.activity.usage_time";
+ field public static final String EXTRA_USAGE_TIME_REPORT_PACKAGES = "android.usage_time_packages";
+ }
+
+ public final class AlarmManagerCompat {
+ method public static void setAlarmClock(android.app.AlarmManager, long, android.app.PendingIntent, android.app.PendingIntent);
+ method public static void setAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExact(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ method public static void setExactAndAllowWhileIdle(android.app.AlarmManager, int, long, android.app.PendingIntent);
+ }
+
+ @RequiresApi(28) public class AppComponentFactory extends android.app.AppComponentFactory {
+ ctor public AppComponentFactory();
+ method public final android.app.Activity instantiateActivity(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Activity instantiateActivityCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Application instantiateApplication(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Application instantiateApplicationCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.ContentProvider instantiateProvider(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.ContentProvider instantiateProviderCompat(ClassLoader, String) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.content.BroadcastReceiver instantiateReceiver(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.content.BroadcastReceiver instantiateReceiverCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public final android.app.Service instantiateService(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ method public android.app.Service instantiateServiceCompat(ClassLoader, String, android.content.Intent?) throws java.lang.ClassNotFoundException, java.lang.IllegalAccessException, java.lang.InstantiationException;
+ }
+
+ public class AppLaunchChecker {
+ ctor @Deprecated public AppLaunchChecker();
+ method public static boolean hasStartedFromLauncher(android.content.Context);
+ method public static void onActivityCreate(android.app.Activity);
+ }
+
+ public final class AppOpsManagerCompat {
+ method public static int checkOrNoteProxyOp(android.content.Context, int, String, String);
+ method public static int noteOp(android.content.Context, String, int, String);
+ method public static int noteOpNoThrow(android.content.Context, String, int, String);
+ method public static int noteProxyOp(android.content.Context, String, String);
+ method public static int noteProxyOpNoThrow(android.content.Context, String, String);
+ method public static String? permissionToOp(String);
+ field public static final int MODE_ALLOWED = 0; // 0x0
+ field public static final int MODE_DEFAULT = 3; // 0x3
+ field public static final int MODE_ERRORED = 2; // 0x2
+ field public static final int MODE_IGNORED = 1; // 0x1
+ }
+
+ public final class BundleCompat {
+ method public static android.os.IBinder? getBinder(android.os.Bundle, String?);
+ method public static void putBinder(android.os.Bundle, String?, android.os.IBinder?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ComponentActivity extends android.app.Activity implements androidx.core.view.KeyEventDispatcher.Component androidx.lifecycle.LifecycleOwner {
+ ctor public ComponentActivity();
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T extends androidx.core.app.ComponentActivity.ExtraData> T! getExtraData(Class<T!>!);
+ method public androidx.lifecycle.Lifecycle getLifecycle();
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void putExtraData(androidx.core.app.ComponentActivity.ExtraData!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+ }
+
+ @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class ComponentActivity.ExtraData {
+ ctor @Deprecated public ComponentActivity.ExtraData();
+ }
+
+ @RequiresApi(api=28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class CoreComponentFactory extends android.app.AppComponentFactory {
+ ctor public CoreComponentFactory();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface CoreComponentFactory.CompatWrapped {
+ method public Object! getWrapper();
+ }
+
+ public class DialogCompat {
+ method public static android.view.View requireViewById(android.app.Dialog, int);
+ }
+
+ public class FrameMetricsAggregator {
+ ctor public FrameMetricsAggregator();
+ ctor public FrameMetricsAggregator(@androidx.core.app.FrameMetricsAggregator.MetricType int);
+ method public void add(android.app.Activity);
+ method public android.util.SparseIntArray![]? getMetrics();
+ method public android.util.SparseIntArray![]? remove(android.app.Activity);
+ method public android.util.SparseIntArray![]? reset();
+ method public android.util.SparseIntArray![]? stop();
+ field public static final int ANIMATION_DURATION = 256; // 0x100
+ field public static final int ANIMATION_INDEX = 8; // 0x8
+ field public static final int COMMAND_DURATION = 32; // 0x20
+ field public static final int COMMAND_INDEX = 5; // 0x5
+ field public static final int DELAY_DURATION = 128; // 0x80
+ field public static final int DELAY_INDEX = 7; // 0x7
+ field public static final int DRAW_DURATION = 8; // 0x8
+ field public static final int DRAW_INDEX = 3; // 0x3
+ field public static final int EVERY_DURATION = 511; // 0x1ff
+ field public static final int INPUT_DURATION = 2; // 0x2
+ field public static final int INPUT_INDEX = 1; // 0x1
+ field public static final int LAYOUT_MEASURE_DURATION = 4; // 0x4
+ field public static final int LAYOUT_MEASURE_INDEX = 2; // 0x2
+ field public static final int SWAP_DURATION = 64; // 0x40
+ field public static final int SWAP_INDEX = 6; // 0x6
+ field public static final int SYNC_DURATION = 16; // 0x10
+ field public static final int SYNC_INDEX = 4; // 0x4
+ field public static final int TOTAL_DURATION = 1; // 0x1
+ field public static final int TOTAL_INDEX = 0; // 0x0
+ }
+
+ @IntDef(flag=true, value={androidx.core.app.FrameMetricsAggregator.TOTAL_DURATION, androidx.core.app.FrameMetricsAggregator.INPUT_DURATION, androidx.core.app.FrameMetricsAggregator.LAYOUT_MEASURE_DURATION, androidx.core.app.FrameMetricsAggregator.DRAW_DURATION, androidx.core.app.FrameMetricsAggregator.SYNC_DURATION, androidx.core.app.FrameMetricsAggregator.COMMAND_DURATION, androidx.core.app.FrameMetricsAggregator.SWAP_DURATION, androidx.core.app.FrameMetricsAggregator.DELAY_DURATION, androidx.core.app.FrameMetricsAggregator.ANIMATION_DURATION, androidx.core.app.FrameMetricsAggregator.EVERY_DURATION}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FrameMetricsAggregator.MetricType {
+ }
+
+ @Deprecated public abstract class JobIntentService extends android.app.Service {
+ ctor @Deprecated public JobIntentService();
+ method @Deprecated public static void enqueueWork(android.content.Context, Class<?>, int, android.content.Intent);
+ method @Deprecated public static void enqueueWork(android.content.Context, android.content.ComponentName, int, android.content.Intent);
+ method @Deprecated public boolean isStopped();
+ method @Deprecated public android.os.IBinder! onBind(android.content.Intent);
+ method @Deprecated protected abstract void onHandleWork(android.content.Intent);
+ method @Deprecated public boolean onStopCurrentWork();
+ method @Deprecated public void setInterruptIfStopped(boolean);
+ }
+
+ public final class NavUtils {
+ method public static android.content.Intent? getParentActivityIntent(android.app.Activity);
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, Class<?>) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static android.content.Intent? getParentActivityIntent(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static String? getParentActivityName(android.app.Activity);
+ method public static String? getParentActivityName(android.content.Context, android.content.ComponentName) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static void navigateUpFromSameTask(android.app.Activity);
+ method public static void navigateUpTo(android.app.Activity, android.content.Intent);
+ method public static boolean shouldUpRecreateTask(android.app.Activity, android.content.Intent);
+ field public static final String PARENT_ACTIVITY = "android.support.PARENT_ACTIVITY";
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface NotificationBuilderWithBuilderAccessor {
+ method public android.app.Notification.Builder! getBuilder();
+ }
+
+ public class NotificationChannelCompat {
+ method public boolean canBubble();
+ method public boolean canBypassDnd();
+ method public boolean canShowBadge();
+ method public android.media.AudioAttributes? getAudioAttributes();
+ method public String? getConversationId();
+ method public String? getDescription();
+ method public String? getGroup();
+ method public String getId();
+ method public int getImportance();
+ method public int getLightColor();
+ method @androidx.core.app.NotificationCompat.NotificationVisibility public int getLockscreenVisibility();
+ method public CharSequence? getName();
+ method public String? getParentChannelId();
+ method public android.net.Uri? getSound();
+ method public long[]? getVibrationPattern();
+ method public boolean isImportantConversation();
+ method public boolean shouldShowLights();
+ method public boolean shouldVibrate();
+ method public androidx.core.app.NotificationChannelCompat.Builder toBuilder();
+ field public static final String DEFAULT_CHANNEL_ID = "miscellaneous";
+ }
+
+ public static class NotificationChannelCompat.Builder {
+ ctor public NotificationChannelCompat.Builder(String, int);
+ method public androidx.core.app.NotificationChannelCompat build();
+ method public androidx.core.app.NotificationChannelCompat.Builder setConversationId(String, String);
+ method public androidx.core.app.NotificationChannelCompat.Builder setDescription(String?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setGroup(String?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setImportance(int);
+ method public androidx.core.app.NotificationChannelCompat.Builder setLightColor(int);
+ method public androidx.core.app.NotificationChannelCompat.Builder setLightsEnabled(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setName(CharSequence?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setShowBadge(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setSound(android.net.Uri?, android.media.AudioAttributes?);
+ method public androidx.core.app.NotificationChannelCompat.Builder setVibrationEnabled(boolean);
+ method public androidx.core.app.NotificationChannelCompat.Builder setVibrationPattern(long[]?);
+ }
+
+ public class NotificationChannelGroupCompat {
+ method public java.util.List<androidx.core.app.NotificationChannelCompat!> getChannels();
+ method public String? getDescription();
+ method public String getId();
+ method public CharSequence? getName();
+ method public boolean isBlocked();
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder toBuilder();
+ }
+
+ public static class NotificationChannelGroupCompat.Builder {
+ ctor public NotificationChannelGroupCompat.Builder(String);
+ method public androidx.core.app.NotificationChannelGroupCompat build();
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder setDescription(String?);
+ method public androidx.core.app.NotificationChannelGroupCompat.Builder setName(CharSequence?);
+ }
+
+ public class NotificationCompat {
+ ctor @Deprecated public NotificationCompat();
+ method public static androidx.core.app.NotificationCompat.Action? getAction(android.app.Notification, int);
+ method public static int getActionCount(android.app.Notification);
+ method public static boolean getAllowSystemGeneratedContextualActions(android.app.Notification);
+ method public static boolean getAutoCancel(android.app.Notification);
+ method public static int getBadgeIconType(android.app.Notification);
+ method public static androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata(android.app.Notification);
+ method public static String? getCategory(android.app.Notification);
+ method public static String? getChannelId(android.app.Notification);
+ method public static int getColor(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentInfo(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentText(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getContentTitle(android.app.Notification);
+ method public static android.os.Bundle? getExtras(android.app.Notification);
+ method public static String? getGroup(android.app.Notification);
+ method @androidx.core.app.NotificationCompat.GroupAlertBehavior public static int getGroupAlertBehavior(android.app.Notification);
+ method @RequiresApi(21) public static java.util.List<androidx.core.app.NotificationCompat.Action!> getInvisibleActions(android.app.Notification);
+ method public static boolean getLocalOnly(android.app.Notification);
+ method public static androidx.core.content.LocusIdCompat? getLocusId(android.app.Notification);
+ method public static boolean getOngoing(android.app.Notification);
+ method public static boolean getOnlyAlertOnce(android.app.Notification);
+ method public static java.util.List<androidx.core.app.Person!> getPeople(android.app.Notification);
+ method public static android.app.Notification? getPublicVersion(android.app.Notification);
+ method public static CharSequence? getSettingsText(android.app.Notification);
+ method public static String? getShortcutId(android.app.Notification);
+ method @RequiresApi(19) public static boolean getShowWhen(android.app.Notification);
+ method public static String? getSortKey(android.app.Notification);
+ method @RequiresApi(19) public static CharSequence? getSubText(android.app.Notification);
+ method public static long getTimeoutAfter(android.app.Notification);
+ method @RequiresApi(19) public static boolean getUsesChronometer(android.app.Notification);
+ method @androidx.core.app.NotificationCompat.NotificationVisibility public static int getVisibility(android.app.Notification);
+ method public static boolean isGroupSummary(android.app.Notification);
+ field public static final int BADGE_ICON_LARGE = 2; // 0x2
+ field public static final int BADGE_ICON_NONE = 0; // 0x0
+ field public static final int BADGE_ICON_SMALL = 1; // 0x1
+ field public static final String CATEGORY_ALARM = "alarm";
+ field public static final String CATEGORY_CALL = "call";
+ field public static final String CATEGORY_EMAIL = "email";
+ field public static final String CATEGORY_ERROR = "err";
+ field public static final String CATEGORY_EVENT = "event";
+ field public static final String CATEGORY_LOCATION_SHARING = "location_sharing";
+ field public static final String CATEGORY_MESSAGE = "msg";
+ field public static final String CATEGORY_MISSED_CALL = "missed_call";
+ field public static final String CATEGORY_NAVIGATION = "navigation";
+ field public static final String CATEGORY_PROGRESS = "progress";
+ field public static final String CATEGORY_PROMO = "promo";
+ field public static final String CATEGORY_RECOMMENDATION = "recommendation";
+ field public static final String CATEGORY_REMINDER = "reminder";
+ field public static final String CATEGORY_SERVICE = "service";
+ field public static final String CATEGORY_SOCIAL = "social";
+ field public static final String CATEGORY_STATUS = "status";
+ field public static final String CATEGORY_STOPWATCH = "stopwatch";
+ field public static final String CATEGORY_SYSTEM = "sys";
+ field public static final String CATEGORY_TRANSPORT = "transport";
+ field public static final String CATEGORY_WORKOUT = "workout";
+ field @ColorInt public static final int COLOR_DEFAULT = 0; // 0x0
+ field public static final int DEFAULT_ALL = -1; // 0xffffffff
+ field public static final int DEFAULT_LIGHTS = 4; // 0x4
+ field public static final int DEFAULT_SOUND = 1; // 0x1
+ field public static final int DEFAULT_VIBRATE = 2; // 0x2
+ field public static final String EXTRA_AUDIO_CONTENTS_URI = "android.audioContents";
+ field public static final String EXTRA_BACKGROUND_IMAGE_URI = "android.backgroundImageUri";
+ field public static final String EXTRA_BIG_TEXT = "android.bigText";
+ field public static final String EXTRA_CHANNEL_GROUP_ID = "android.intent.extra.CHANNEL_GROUP_ID";
+ field public static final String EXTRA_CHANNEL_ID = "android.intent.extra.CHANNEL_ID";
+ field public static final String EXTRA_CHRONOMETER_COUNT_DOWN = "android.chronometerCountDown";
+ field public static final String EXTRA_COLORIZED = "android.colorized";
+ field public static final String EXTRA_COMPACT_ACTIONS = "android.compactActions";
+ field public static final String EXTRA_COMPAT_TEMPLATE = "androidx.core.app.extra.COMPAT_TEMPLATE";
+ field public static final String EXTRA_CONVERSATION_TITLE = "android.conversationTitle";
+ field public static final String EXTRA_HIDDEN_CONVERSATION_TITLE = "android.hiddenConversationTitle";
+ field public static final String EXTRA_HISTORIC_MESSAGES = "android.messages.historic";
+ field public static final String EXTRA_INFO_TEXT = "android.infoText";
+ field public static final String EXTRA_IS_GROUP_CONVERSATION = "android.isGroupConversation";
+ field public static final String EXTRA_LARGE_ICON = "android.largeIcon";
+ field public static final String EXTRA_LARGE_ICON_BIG = "android.largeIcon.big";
+ field public static final String EXTRA_MEDIA_SESSION = "android.mediaSession";
+ field public static final String EXTRA_MESSAGES = "android.messages";
+ field public static final String EXTRA_MESSAGING_STYLE_USER = "android.messagingStyleUser";
+ field public static final String EXTRA_NOTIFICATION_ID = "android.intent.extra.NOTIFICATION_ID";
+ field public static final String EXTRA_NOTIFICATION_TAG = "android.intent.extra.NOTIFICATION_TAG";
+ field @Deprecated public static final String EXTRA_PEOPLE = "android.people";
+ field public static final String EXTRA_PEOPLE_LIST = "android.people.list";
+ field public static final String EXTRA_PICTURE = "android.picture";
+ field public static final String EXTRA_PROGRESS = "android.progress";
+ field public static final String EXTRA_PROGRESS_INDETERMINATE = "android.progressIndeterminate";
+ field public static final String EXTRA_PROGRESS_MAX = "android.progressMax";
+ field public static final String EXTRA_REMOTE_INPUT_HISTORY = "android.remoteInputHistory";
+ field public static final String EXTRA_SELF_DISPLAY_NAME = "android.selfDisplayName";
+ field public static final String EXTRA_SHOW_BIG_PICTURE_WHEN_COLLAPSED = "android.showBigPictureWhenCollapsed";
+ field public static final String EXTRA_SHOW_CHRONOMETER = "android.showChronometer";
+ field public static final String EXTRA_SHOW_WHEN = "android.showWhen";
+ field public static final String EXTRA_SMALL_ICON = "android.icon";
+ field public static final String EXTRA_SUB_TEXT = "android.subText";
+ field public static final String EXTRA_SUMMARY_TEXT = "android.summaryText";
+ field public static final String EXTRA_TEMPLATE = "android.template";
+ field public static final String EXTRA_TEXT = "android.text";
+ field public static final String EXTRA_TEXT_LINES = "android.textLines";
+ field public static final String EXTRA_TITLE = "android.title";
+ field public static final String EXTRA_TITLE_BIG = "android.title.big";
+ field public static final int FLAG_AUTO_CANCEL = 16; // 0x10
+ field public static final int FLAG_BUBBLE = 4096; // 0x1000
+ field public static final int FLAG_FOREGROUND_SERVICE = 64; // 0x40
+ field public static final int FLAG_GROUP_SUMMARY = 512; // 0x200
+ field @Deprecated public static final int FLAG_HIGH_PRIORITY = 128; // 0x80
+ field public static final int FLAG_INSISTENT = 4; // 0x4
+ field public static final int FLAG_LOCAL_ONLY = 256; // 0x100
+ field public static final int FLAG_NO_CLEAR = 32; // 0x20
+ field public static final int FLAG_ONGOING_EVENT = 2; // 0x2
+ field public static final int FLAG_ONLY_ALERT_ONCE = 8; // 0x8
+ field public static final int FLAG_SHOW_LIGHTS = 1; // 0x1
+ field public static final int FOREGROUND_SERVICE_DEFAULT = 0; // 0x0
+ field public static final int FOREGROUND_SERVICE_DEFERRED = 2; // 0x2
+ field public static final int FOREGROUND_SERVICE_IMMEDIATE = 1; // 0x1
+ field public static final int GROUP_ALERT_ALL = 0; // 0x0
+ field public static final int GROUP_ALERT_CHILDREN = 2; // 0x2
+ field public static final int GROUP_ALERT_SUMMARY = 1; // 0x1
+ field public static final String GROUP_KEY_SILENT = "silent";
+ field public static final String INTENT_CATEGORY_NOTIFICATION_PREFERENCES = "android.intent.category.NOTIFICATION_PREFERENCES";
+ field public static final int PRIORITY_DEFAULT = 0; // 0x0
+ field public static final int PRIORITY_HIGH = 1; // 0x1
+ field public static final int PRIORITY_LOW = -1; // 0xffffffff
+ field public static final int PRIORITY_MAX = 2; // 0x2
+ field public static final int PRIORITY_MIN = -2; // 0xfffffffe
+ field public static final int STREAM_DEFAULT = -1; // 0xffffffff
+ field public static final int VISIBILITY_PRIVATE = 0; // 0x0
+ field public static final int VISIBILITY_PUBLIC = 1; // 0x1
+ field public static final int VISIBILITY_SECRET = -1; // 0xffffffff
+ }
+
+ public static class NotificationCompat.Action {
+ ctor public NotificationCompat.Action(int, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+ method public android.app.PendingIntent? getActionIntent();
+ method public boolean getAllowGeneratedReplies();
+ method public androidx.core.app.RemoteInput![]? getDataOnlyRemoteInputs();
+ method public android.os.Bundle getExtras();
+ method @Deprecated public int getIcon();
+ method public androidx.core.graphics.drawable.IconCompat? getIconCompat();
+ method public androidx.core.app.RemoteInput![]? getRemoteInputs();
+ method @androidx.core.app.NotificationCompat.Action.SemanticAction public int getSemanticAction();
+ method public boolean getShowsUserInterface();
+ method public CharSequence? getTitle();
+ method public boolean isContextual();
+ field public static final int SEMANTIC_ACTION_ARCHIVE = 5; // 0x5
+ field public static final int SEMANTIC_ACTION_CALL = 10; // 0xa
+ field public static final int SEMANTIC_ACTION_DELETE = 4; // 0x4
+ field public static final int SEMANTIC_ACTION_MARK_AS_READ = 2; // 0x2
+ field public static final int SEMANTIC_ACTION_MARK_AS_UNREAD = 3; // 0x3
+ field public static final int SEMANTIC_ACTION_MUTE = 6; // 0x6
+ field public static final int SEMANTIC_ACTION_NONE = 0; // 0x0
+ field public static final int SEMANTIC_ACTION_REPLY = 1; // 0x1
+ field public static final int SEMANTIC_ACTION_THUMBS_DOWN = 9; // 0x9
+ field public static final int SEMANTIC_ACTION_THUMBS_UP = 8; // 0x8
+ field public static final int SEMANTIC_ACTION_UNMUTE = 7; // 0x7
+ field public android.app.PendingIntent! actionIntent;
+ field @Deprecated public int icon;
+ field public CharSequence! title;
+ }
+
+ public static final class NotificationCompat.Action.Builder {
+ ctor public NotificationCompat.Action.Builder(androidx.core.graphics.drawable.IconCompat?, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action.Builder(int, CharSequence?, android.app.PendingIntent?);
+ ctor public NotificationCompat.Action.Builder(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.Action.Builder addExtras(android.os.Bundle?);
+ method public androidx.core.app.NotificationCompat.Action.Builder addRemoteInput(androidx.core.app.RemoteInput?);
+ method public androidx.core.app.NotificationCompat.Action build();
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Extender);
+ method @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Action.Builder fromAndroidAction(android.app.Notification.Action);
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.NotificationCompat.Action.Builder setAllowGeneratedReplies(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder setContextual(boolean);
+ method public androidx.core.app.NotificationCompat.Action.Builder setSemanticAction(@androidx.core.app.NotificationCompat.Action.SemanticAction int);
+ method public androidx.core.app.NotificationCompat.Action.Builder setShowsUserInterface(boolean);
+ }
+
+ public static interface NotificationCompat.Action.Extender {
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_NONE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_REPLY, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_READ, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MARK_AS_UNREAD, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_DELETE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_ARCHIVE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_MUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_UNMUTE, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_UP, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_THUMBS_DOWN, androidx.core.app.NotificationCompat.Action.SEMANTIC_ACTION_CALL}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.Action.SemanticAction {
+ }
+
+ public static final class NotificationCompat.Action.WearableExtender implements androidx.core.app.NotificationCompat.Action.Extender {
+ ctor public NotificationCompat.Action.WearableExtender();
+ ctor public NotificationCompat.Action.WearableExtender(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender clone();
+ method public androidx.core.app.NotificationCompat.Action.Builder extend(androidx.core.app.NotificationCompat.Action.Builder);
+ method @Deprecated public CharSequence? getCancelLabel();
+ method @Deprecated public CharSequence? getConfirmLabel();
+ method public boolean getHintDisplayActionInline();
+ method public boolean getHintLaunchesActivity();
+ method @Deprecated public CharSequence? getInProgressLabel();
+ method public boolean isAvailableOffline();
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setCancelLabel(CharSequence?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setConfirmLabel(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintDisplayActionInline(boolean);
+ method public androidx.core.app.NotificationCompat.Action.WearableExtender setHintLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.Action.WearableExtender setInProgressLabel(CharSequence?);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.BADGE_ICON_NONE, androidx.core.app.NotificationCompat.BADGE_ICON_SMALL, androidx.core.app.NotificationCompat.BADGE_ICON_LARGE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.BadgeIconType {
+ }
+
+ public static class NotificationCompat.BigPictureStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigPictureStyle();
+ ctor public NotificationCompat.BigPictureStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle bigLargeIcon(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle bigPicture(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigPictureStyle setSummaryText(CharSequence?);
+ method @RequiresApi(31) public androidx.core.app.NotificationCompat.BigPictureStyle showBigPictureWhenCollapsed(boolean);
+ }
+
+ public static class NotificationCompat.BigTextStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.BigTextStyle();
+ ctor public NotificationCompat.BigTextStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle bigText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.BigTextStyle setSummaryText(CharSequence?);
+ }
+
+ public static final class NotificationCompat.BubbleMetadata {
+ method public static androidx.core.app.NotificationCompat.BubbleMetadata? fromPlatform(android.app.Notification.BubbleMetadata?);
+ method public boolean getAutoExpandBubble();
+ method public android.app.PendingIntent? getDeleteIntent();
+ method @Dimension(unit=androidx.annotation.Dimension.DP) public int getDesiredHeight();
+ method @DimenRes public int getDesiredHeightResId();
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public android.app.PendingIntent? getIntent();
+ method public String? getShortcutId();
+ method public boolean isNotificationSuppressed();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setFlags(int);
+ method public static android.app.Notification.BubbleMetadata? toPlatform(androidx.core.app.NotificationCompat.BubbleMetadata?);
+ }
+
+ public static final class NotificationCompat.BubbleMetadata.Builder {
+ ctor @Deprecated public NotificationCompat.BubbleMetadata.Builder();
+ ctor @RequiresApi(30) public NotificationCompat.BubbleMetadata.Builder(String);
+ ctor public NotificationCompat.BubbleMetadata.Builder(android.app.PendingIntent, androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata build();
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setAutoExpandBubble(boolean);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDeleteIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeight(@Dimension(unit=androidx.annotation.Dimension.DP) int);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setDesiredHeightResId(@DimenRes int);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIcon(androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setIntent(android.app.PendingIntent);
+ method public androidx.core.app.NotificationCompat.BubbleMetadata.Builder setSuppressNotification(boolean);
+ }
+
+ public static class NotificationCompat.Builder {
+ ctor @RequiresApi(19) public NotificationCompat.Builder(android.content.Context, android.app.Notification);
+ ctor public NotificationCompat.Builder(android.content.Context, String);
+ ctor @Deprecated public NotificationCompat.Builder(android.content.Context);
+ method public androidx.core.app.NotificationCompat.Builder addAction(int, CharSequence?, android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder addAction(androidx.core.app.NotificationCompat.Action?);
+ method public androidx.core.app.NotificationCompat.Builder addExtras(android.os.Bundle?);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(int, CharSequence?, android.app.PendingIntent?);
+ method @RequiresApi(21) public androidx.core.app.NotificationCompat.Builder addInvisibleAction(androidx.core.app.NotificationCompat.Action?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder addPerson(String?);
+ method public androidx.core.app.NotificationCompat.Builder addPerson(androidx.core.app.Person?);
+ method public android.app.Notification build();
+ method public androidx.core.app.NotificationCompat.Builder clearActions();
+ method public androidx.core.app.NotificationCompat.Builder clearInvisibleActions();
+ method public androidx.core.app.NotificationCompat.Builder clearPeople();
+ method public android.widget.RemoteViews? createBigContentView();
+ method public android.widget.RemoteViews? createContentView();
+ method public android.widget.RemoteViews? createHeadsUpContentView();
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Extender);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getBigContentView();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.app.NotificationCompat.BubbleMetadata? getBubbleMetadata();
+ method @ColorInt @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getColor();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getContentView();
+ method public android.os.Bundle getExtras();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getForegroundServiceBehavior();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! getHeadsUpContentView();
+ method @Deprecated public android.app.Notification getNotification();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int getPriority();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public long getWhenIfShowing();
+ method protected static CharSequence? limitCharSequenceLength(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setAllowSystemGeneratedContextualActions(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setAutoCancel(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setBadgeIconType(@androidx.core.app.NotificationCompat.BadgeIconType int);
+ method public androidx.core.app.NotificationCompat.Builder setBubbleMetadata(androidx.core.app.NotificationCompat.BubbleMetadata?);
+ method public androidx.core.app.NotificationCompat.Builder setCategory(String?);
+ method public androidx.core.app.NotificationCompat.Builder setChannelId(String);
+ method @RequiresApi(24) public androidx.core.app.NotificationCompat.Builder setChronometerCountDown(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.Builder setColorized(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setContent(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setContentInfo(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setContentIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder setContentText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomBigContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setCustomHeadsUpContentView(android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setDefaults(int);
+ method public androidx.core.app.NotificationCompat.Builder setDeleteIntent(android.app.PendingIntent?);
+ method public androidx.core.app.NotificationCompat.Builder setExtras(android.os.Bundle?);
+ method public androidx.core.app.NotificationCompat.Builder setForegroundServiceBehavior(@androidx.core.app.NotificationCompat.ServiceNotificationBehavior int);
+ method public androidx.core.app.NotificationCompat.Builder setFullScreenIntent(android.app.PendingIntent?, boolean);
+ method public androidx.core.app.NotificationCompat.Builder setGroup(String?);
+ method public androidx.core.app.NotificationCompat.Builder setGroupAlertBehavior(@androidx.core.app.NotificationCompat.GroupAlertBehavior int);
+ method public androidx.core.app.NotificationCompat.Builder setGroupSummary(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setLargeIcon(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.Builder setLights(@ColorInt int, int, int);
+ method public androidx.core.app.NotificationCompat.Builder setLocalOnly(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder setNotificationSilent();
+ method public androidx.core.app.NotificationCompat.Builder setNumber(int);
+ method public androidx.core.app.NotificationCompat.Builder setOngoing(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setOnlyAlertOnce(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setPriority(int);
+ method public androidx.core.app.NotificationCompat.Builder setProgress(int, int, boolean);
+ method public androidx.core.app.NotificationCompat.Builder setPublicVersion(android.app.Notification?);
+ method public androidx.core.app.NotificationCompat.Builder setRemoteInputHistory(CharSequence![]?);
+ method public androidx.core.app.NotificationCompat.Builder setSettingsText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setShortcutId(String?);
+ method public androidx.core.app.NotificationCompat.Builder setShortcutInfo(androidx.core.content.pm.ShortcutInfoCompat?);
+ method public androidx.core.app.NotificationCompat.Builder setShowWhen(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setSilent(boolean);
+ method @RequiresApi(23) public androidx.core.app.NotificationCompat.Builder setSmallIcon(androidx.core.graphics.drawable.IconCompat);
+ method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int);
+ method public androidx.core.app.NotificationCompat.Builder setSmallIcon(int, int);
+ method public androidx.core.app.NotificationCompat.Builder setSortKey(String?);
+ method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?);
+ method public androidx.core.app.NotificationCompat.Builder setSound(android.net.Uri?, @androidx.core.app.NotificationCompat.StreamType int);
+ method public androidx.core.app.NotificationCompat.Builder setStyle(androidx.core.app.NotificationCompat.Style?);
+ method public androidx.core.app.NotificationCompat.Builder setSubText(CharSequence?);
+ method public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?);
+ method @Deprecated public androidx.core.app.NotificationCompat.Builder setTicker(CharSequence?, android.widget.RemoteViews?);
+ method public androidx.core.app.NotificationCompat.Builder setTimeoutAfter(long);
+ method public androidx.core.app.NotificationCompat.Builder setUsesChronometer(boolean);
+ method public androidx.core.app.NotificationCompat.Builder setVibrate(long[]?);
+ method public androidx.core.app.NotificationCompat.Builder setVisibility(@androidx.core.app.NotificationCompat.NotificationVisibility int);
+ method public androidx.core.app.NotificationCompat.Builder setWhen(long);
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.NotificationCompat.Action!>! mActions;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.content.Context! mContext;
+ field @Deprecated public java.util.ArrayList<java.lang.String!>! mPeople;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public java.util.ArrayList<androidx.core.app.Person!> mPersonList;
+ }
+
+ public static final class NotificationCompat.CarExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.CarExtender();
+ ctor public NotificationCompat.CarExtender(android.app.Notification);
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ method @ColorInt public int getColor();
+ method public android.graphics.Bitmap? getLargeIcon();
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation? getUnreadConversation();
+ method public androidx.core.app.NotificationCompat.CarExtender setColor(@ColorInt int);
+ method public androidx.core.app.NotificationCompat.CarExtender setLargeIcon(android.graphics.Bitmap?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender setUnreadConversation(androidx.core.app.NotificationCompat.CarExtender.UnreadConversation?);
+ }
+
+ @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation {
+ method @Deprecated public long getLatestTimestamp();
+ method @Deprecated public String![]? getMessages();
+ method @Deprecated public String? getParticipant();
+ method @Deprecated public String![]? getParticipants();
+ method @Deprecated public android.app.PendingIntent? getReadPendingIntent();
+ method @Deprecated public androidx.core.app.RemoteInput? getRemoteInput();
+ method @Deprecated public android.app.PendingIntent? getReplyPendingIntent();
+ }
+
+ @Deprecated public static class NotificationCompat.CarExtender.UnreadConversation.Builder {
+ ctor @Deprecated public NotificationCompat.CarExtender.UnreadConversation.Builder(String);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder addMessage(String?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation build();
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setLatestTimestamp(long);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReadPendingIntent(android.app.PendingIntent?);
+ method @Deprecated public androidx.core.app.NotificationCompat.CarExtender.UnreadConversation.Builder setReplyAction(android.app.PendingIntent?, androidx.core.app.RemoteInput?);
+ }
+
+ public static class NotificationCompat.DecoratedCustomViewStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.DecoratedCustomViewStyle();
+ }
+
+ public static interface NotificationCompat.Extender {
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.GROUP_ALERT_ALL, androidx.core.app.NotificationCompat.GROUP_ALERT_SUMMARY, androidx.core.app.NotificationCompat.GROUP_ALERT_CHILDREN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.GroupAlertBehavior {
+ }
+
+ public static class NotificationCompat.InboxStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor public NotificationCompat.InboxStyle();
+ ctor public NotificationCompat.InboxStyle(androidx.core.app.NotificationCompat.Builder?);
+ method public androidx.core.app.NotificationCompat.InboxStyle addLine(CharSequence?);
+ method public androidx.core.app.NotificationCompat.InboxStyle setBigContentTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.InboxStyle setSummaryText(CharSequence?);
+ }
+
+ public static class NotificationCompat.MessagingStyle extends androidx.core.app.NotificationCompat.Style {
+ ctor @Deprecated public NotificationCompat.MessagingStyle(CharSequence);
+ ctor public NotificationCompat.MessagingStyle(androidx.core.app.Person);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addHistoricMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+ method @Deprecated public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(CharSequence?, long, androidx.core.app.Person?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle addMessage(androidx.core.app.NotificationCompat.MessagingStyle.Message?);
+ method public static androidx.core.app.NotificationCompat.MessagingStyle? extractMessagingStyleFromNotification(android.app.Notification);
+ method public CharSequence? getConversationTitle();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getHistoricMessages();
+ method public java.util.List<androidx.core.app.NotificationCompat.MessagingStyle.Message!> getMessages();
+ method public androidx.core.app.Person getUser();
+ method @Deprecated public CharSequence? getUserDisplayName();
+ method public boolean isGroupConversation();
+ method public androidx.core.app.NotificationCompat.MessagingStyle setConversationTitle(CharSequence?);
+ method public androidx.core.app.NotificationCompat.MessagingStyle setGroupConversation(boolean);
+ field public static final int MAXIMUM_RETAINED_MESSAGES = 25; // 0x19
+ }
+
+ public static final class NotificationCompat.MessagingStyle.Message {
+ ctor public NotificationCompat.MessagingStyle.Message(CharSequence?, long, androidx.core.app.Person?);
+ ctor @Deprecated public NotificationCompat.MessagingStyle.Message(CharSequence?, long, CharSequence?);
+ method public String? getDataMimeType();
+ method public android.net.Uri? getDataUri();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.Person? getPerson();
+ method @Deprecated public CharSequence? getSender();
+ method public CharSequence? getText();
+ method public long getTimestamp();
+ method public androidx.core.app.NotificationCompat.MessagingStyle.Message setData(String?, android.net.Uri?);
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.VISIBILITY_PUBLIC, androidx.core.app.NotificationCompat.VISIBILITY_PRIVATE, androidx.core.app.NotificationCompat.VISIBILITY_SECRET}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.NotificationVisibility {
+ }
+
+ @IntDef({androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFAULT, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE, androidx.core.app.NotificationCompat.FOREGROUND_SERVICE_DEFERRED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.ServiceNotificationBehavior {
+ }
+
+ @IntDef({android.media.AudioManager.STREAM_VOICE_CALL, android.media.AudioManager.STREAM_SYSTEM, android.media.AudioManager.STREAM_RING, android.media.AudioManager.STREAM_MUSIC, android.media.AudioManager.STREAM_ALARM, android.media.AudioManager.STREAM_NOTIFICATION, android.media.AudioManager.STREAM_DTMF, android.media.AudioManager.STREAM_ACCESSIBILITY}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface NotificationCompat.StreamType {
+ }
+
+ public abstract static class NotificationCompat.Style {
+ ctor public NotificationCompat.Style();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addCompatExtras(android.os.Bundle);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void apply(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews applyStandardTemplate(boolean, int, boolean);
+ method public android.app.Notification? build();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void buildIntoRemoteViews(android.widget.RemoteViews!, android.widget.RemoteViews!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void clearCompatExtraKeys(android.os.Bundle);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap! createColoredBitmap(int, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean displayCustomViewInline();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.NotificationCompat.Style? extractStyleFromNotification(android.app.Notification);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected String? getClassName();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeBigContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.widget.RemoteViews! makeHeadsUpContentView(androidx.core.app.NotificationBuilderWithBuilderAccessor!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected void restoreFromCompatExtras(android.os.Bundle);
+ method public void setBuilder(androidx.core.app.NotificationCompat.Builder?);
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected androidx.core.app.NotificationCompat.Builder! mBuilder;
+ }
+
+ public static final class NotificationCompat.WearableExtender implements androidx.core.app.NotificationCompat.Extender {
+ ctor public NotificationCompat.WearableExtender();
+ ctor public NotificationCompat.WearableExtender(android.app.Notification);
+ method public androidx.core.app.NotificationCompat.WearableExtender addAction(androidx.core.app.NotificationCompat.Action);
+ method public androidx.core.app.NotificationCompat.WearableExtender addActions(java.util.List<androidx.core.app.NotificationCompat.Action!>);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPage(android.app.Notification);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender addPages(java.util.List<android.app.Notification!>);
+ method public androidx.core.app.NotificationCompat.WearableExtender clearActions();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender clearPages();
+ method public androidx.core.app.NotificationCompat.WearableExtender clone();
+ method public androidx.core.app.NotificationCompat.Builder extend(androidx.core.app.NotificationCompat.Builder);
+ method public java.util.List<androidx.core.app.NotificationCompat.Action!> getActions();
+ method @Deprecated public android.graphics.Bitmap? getBackground();
+ method public String? getBridgeTag();
+ method public int getContentAction();
+ method @Deprecated public int getContentIcon();
+ method @Deprecated public int getContentIconGravity();
+ method public boolean getContentIntentAvailableOffline();
+ method @Deprecated public int getCustomContentHeight();
+ method @Deprecated public int getCustomSizePreset();
+ method public String? getDismissalId();
+ method @Deprecated public android.app.PendingIntent? getDisplayIntent();
+ method @Deprecated public int getGravity();
+ method @Deprecated public boolean getHintAmbientBigPicture();
+ method @Deprecated public boolean getHintAvoidBackgroundClipping();
+ method public boolean getHintContentIntentLaunchesActivity();
+ method @Deprecated public boolean getHintHideIcon();
+ method @Deprecated public int getHintScreenTimeout();
+ method @Deprecated public boolean getHintShowBackgroundOnly();
+ method @Deprecated public java.util.List<android.app.Notification!> getPages();
+ method public boolean getStartScrollBottom();
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setBackground(android.graphics.Bitmap?);
+ method public androidx.core.app.NotificationCompat.WearableExtender setBridgeTag(String?);
+ method public androidx.core.app.NotificationCompat.WearableExtender setContentAction(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIcon(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setContentIconGravity(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender setContentIntentAvailableOffline(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomContentHeight(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setCustomSizePreset(int);
+ method public androidx.core.app.NotificationCompat.WearableExtender setDismissalId(String?);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setDisplayIntent(android.app.PendingIntent?);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setGravity(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAmbientBigPicture(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintAvoidBackgroundClipping(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender setHintContentIntentLaunchesActivity(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintHideIcon(boolean);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintScreenTimeout(int);
+ method @Deprecated public androidx.core.app.NotificationCompat.WearableExtender setHintShowBackgroundOnly(boolean);
+ method public androidx.core.app.NotificationCompat.WearableExtender setStartScrollBottom(boolean);
+ field @Deprecated public static final int SCREEN_TIMEOUT_LONG = -1; // 0xffffffff
+ field @Deprecated public static final int SCREEN_TIMEOUT_SHORT = 0; // 0x0
+ field @Deprecated public static final int SIZE_DEFAULT = 0; // 0x0
+ field @Deprecated public static final int SIZE_FULL_SCREEN = 5; // 0x5
+ field @Deprecated public static final int SIZE_LARGE = 4; // 0x4
+ field @Deprecated public static final int SIZE_MEDIUM = 3; // 0x3
+ field @Deprecated public static final int SIZE_SMALL = 2; // 0x2
+ field @Deprecated public static final int SIZE_XSMALL = 1; // 0x1
+ field public static final int UNSET_ACTION_INDEX = -1; // 0xffffffff
+ }
+
+ public final class NotificationCompatExtras {
+ field public static final String EXTRA_ACTION_EXTRAS = "android.support.actionExtras";
+ field public static final String EXTRA_GROUP_KEY = "android.support.groupKey";
+ field public static final String EXTRA_GROUP_SUMMARY = "android.support.isGroupSummary";
+ field public static final String EXTRA_LOCAL_ONLY = "android.support.localOnly";
+ field public static final String EXTRA_REMOTE_INPUTS = "android.support.remoteInputs";
+ field public static final String EXTRA_SORT_KEY = "android.support.sortKey";
+ }
+
+ public abstract class NotificationCompatSideChannelService extends android.app.Service {
+ ctor public NotificationCompatSideChannelService();
+ method public abstract void cancel(String!, int, String!);
+ method public abstract void cancelAll(String!);
+ method public abstract void notify(String!, int, String!, android.app.Notification!);
+ method public android.os.IBinder! onBind(android.content.Intent!);
+ }
+
+ public final class NotificationManagerCompat {
+ method public boolean areNotificationsEnabled();
+ method public void cancel(int);
+ method public void cancel(String?, int);
+ method public void cancelAll();
+ method public void createNotificationChannel(android.app.NotificationChannel);
+ method public void createNotificationChannel(androidx.core.app.NotificationChannelCompat);
+ method public void createNotificationChannelGroup(android.app.NotificationChannelGroup);
+ method public void createNotificationChannelGroup(androidx.core.app.NotificationChannelGroupCompat);
+ method public void createNotificationChannelGroups(java.util.List<android.app.NotificationChannelGroup!>);
+ method public void createNotificationChannelGroupsCompat(java.util.List<androidx.core.app.NotificationChannelGroupCompat!>);
+ method public void createNotificationChannels(java.util.List<android.app.NotificationChannel!>);
+ method public void createNotificationChannelsCompat(java.util.List<androidx.core.app.NotificationChannelCompat!>);
+ method public void deleteNotificationChannel(String);
+ method public void deleteNotificationChannelGroup(String);
+ method public void deleteUnlistedNotificationChannels(java.util.Collection<java.lang.String!>);
+ method public static androidx.core.app.NotificationManagerCompat from(android.content.Context);
+ method public static java.util.Set<java.lang.String!> getEnabledListenerPackages(android.content.Context);
+ method public int getImportance();
+ method public android.app.NotificationChannel? getNotificationChannel(String);
+ method public android.app.NotificationChannel? getNotificationChannel(String, String);
+ method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String);
+ method public androidx.core.app.NotificationChannelCompat? getNotificationChannelCompat(String, String);
+ method public android.app.NotificationChannelGroup? getNotificationChannelGroup(String);
+ method public androidx.core.app.NotificationChannelGroupCompat? getNotificationChannelGroupCompat(String);
+ method public java.util.List<android.app.NotificationChannelGroup!> getNotificationChannelGroups();
+ method public java.util.List<androidx.core.app.NotificationChannelGroupCompat!> getNotificationChannelGroupsCompat();
+ method public java.util.List<android.app.NotificationChannel!> getNotificationChannels();
+ method public java.util.List<androidx.core.app.NotificationChannelCompat!> getNotificationChannelsCompat();
+ method public void notify(int, android.app.Notification);
+ method public void notify(String?, int, android.app.Notification);
+ field public static final String ACTION_BIND_SIDE_CHANNEL = "android.support.BIND_NOTIFICATION_SIDE_CHANNEL";
+ field public static final String EXTRA_USE_SIDE_CHANNEL = "android.support.useSideChannel";
+ field public static final int IMPORTANCE_DEFAULT = 3; // 0x3
+ field public static final int IMPORTANCE_HIGH = 4; // 0x4
+ field public static final int IMPORTANCE_LOW = 2; // 0x2
+ field public static final int IMPORTANCE_MAX = 5; // 0x5
+ field public static final int IMPORTANCE_MIN = 1; // 0x1
+ field public static final int IMPORTANCE_NONE = 0; // 0x0
+ field public static final int IMPORTANCE_UNSPECIFIED = -1000; // 0xfffffc18
+ }
+
+ public class Person {
+ method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromAndroidPerson(android.app.Person);
+ method public static androidx.core.app.Person fromBundle(android.os.Bundle);
+ method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.app.Person fromPersistableBundle(android.os.PersistableBundle);
+ method public androidx.core.graphics.drawable.IconCompat? getIcon();
+ method public String? getKey();
+ method public CharSequence? getName();
+ method public String? getUri();
+ method public boolean isBot();
+ method public boolean isImportant();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String resolveToLegacyUri();
+ method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.app.Person toAndroidPerson();
+ method public androidx.core.app.Person.Builder toBuilder();
+ method public android.os.Bundle toBundle();
+ method @RequiresApi(22) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.os.PersistableBundle toPersistableBundle();
+ }
+
+ public static class Person.Builder {
+ ctor public Person.Builder();
+ method public androidx.core.app.Person build();
+ method public androidx.core.app.Person.Builder setBot(boolean);
+ method public androidx.core.app.Person.Builder setIcon(androidx.core.graphics.drawable.IconCompat?);
+ method public androidx.core.app.Person.Builder setImportant(boolean);
+ method public androidx.core.app.Person.Builder setKey(String?);
+ method public androidx.core.app.Person.Builder setName(CharSequence?);
+ method public androidx.core.app.Person.Builder setUri(String?);
+ }
+
+ @androidx.versionedparcelable.VersionedParcelize(jetifyAs="android.support.v4.app.RemoteActionCompat") public final class RemoteActionCompat implements androidx.versionedparcelable.VersionedParcelable {
+ ctor public RemoteActionCompat(androidx.core.graphics.drawable.IconCompat, CharSequence, CharSequence, android.app.PendingIntent);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public RemoteActionCompat();
+ ctor public RemoteActionCompat(androidx.core.app.RemoteActionCompat);
+ method @RequiresApi(26) public static androidx.core.app.RemoteActionCompat createFromRemoteAction(android.app.RemoteAction);
+ method public android.app.PendingIntent getActionIntent();
+ method public CharSequence getContentDescription();
+ method public androidx.core.graphics.drawable.IconCompat getIcon();
+ method public CharSequence getTitle();
+ method public boolean isEnabled();
+ method public void setEnabled(boolean);
+ method public void setShouldShowIcon(boolean);
+ method public boolean shouldShowIcon();
+ method @RequiresApi(26) public android.app.RemoteAction toRemoteAction();
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(4) public android.app.PendingIntent! mActionIntent;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(3) public CharSequence! mContentDescription;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(5) public boolean mEnabled;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(1) public androidx.core.graphics.drawable.IconCompat! mIcon;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(6) public boolean mShouldShowIcon;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @androidx.versionedparcelable.ParcelField(2) public CharSequence! mTitle;
+ }
+
+ public final class RemoteInput {
+ method public static void addDataResultToIntent(androidx.core.app.RemoteInput!, android.content.Intent!, java.util.Map<java.lang.String!,android.net.Uri!>!);
+ method public static void addResultsToIntent(androidx.core.app.RemoteInput![]!, android.content.Intent!, android.os.Bundle!);
+ method public boolean getAllowFreeFormInput();
+ method public java.util.Set<java.lang.String!>! getAllowedDataTypes();
+ method public CharSequence![]! getChoices();
+ method public static java.util.Map<java.lang.String!,android.net.Uri!>! getDataResultsFromIntent(android.content.Intent!, String!);
+ method @androidx.core.app.RemoteInput.EditChoicesBeforeSending public int getEditChoicesBeforeSending();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence! getLabel();
+ method public String! getResultKey();
+ method public static android.os.Bundle! getResultsFromIntent(android.content.Intent!);
+ method @androidx.core.app.RemoteInput.Source public static int getResultsSource(android.content.Intent);
+ method public boolean isDataOnly();
+ method public static void setResultsSource(android.content.Intent, @androidx.core.app.RemoteInput.Source int);
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_AUTO = 0; // 0x0
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_DISABLED = 1; // 0x1
+ field public static final int EDIT_CHOICES_BEFORE_SENDING_ENABLED = 2; // 0x2
+ field public static final String EXTRA_RESULTS_DATA = "android.remoteinput.resultsData";
+ field public static final String RESULTS_CLIP_LABEL = "android.remoteinput.results";
+ field public static final int SOURCE_CHOICE = 1; // 0x1
+ field public static final int SOURCE_FREE_FORM_INPUT = 0; // 0x0
+ }
+
+ public static final class RemoteInput.Builder {
+ ctor public RemoteInput.Builder(String);
+ method public androidx.core.app.RemoteInput.Builder addExtras(android.os.Bundle);
+ method public androidx.core.app.RemoteInput build();
+ method public android.os.Bundle getExtras();
+ method public androidx.core.app.RemoteInput.Builder setAllowDataType(String, boolean);
+ method public androidx.core.app.RemoteInput.Builder setAllowFreeFormInput(boolean);
+ method public androidx.core.app.RemoteInput.Builder setChoices(CharSequence![]?);
+ method public androidx.core.app.RemoteInput.Builder setEditChoicesBeforeSending(@androidx.core.app.RemoteInput.EditChoicesBeforeSending int);
+ method public androidx.core.app.RemoteInput.Builder setLabel(CharSequence?);
+ }
+
+ @IntDef({androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, androidx.core.app.RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.EditChoicesBeforeSending {
+ }
+
+ @IntDef({androidx.core.app.RemoteInput.SOURCE_FREE_FORM_INPUT, androidx.core.app.RemoteInput.SOURCE_CHOICE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface RemoteInput.Source {
+ }
+
+ public final class ServiceCompat {
+ method public static void stopForeground(android.app.Service, @androidx.core.app.ServiceCompat.StopForegroundFlags int);
+ field public static final int START_STICKY = 1; // 0x1
+ field public static final int STOP_FOREGROUND_DETACH = 2; // 0x2
+ field public static final int STOP_FOREGROUND_REMOVE = 1; // 0x1
+ }
+
+ @IntDef(flag=true, value={androidx.core.app.ServiceCompat.STOP_FOREGROUND_REMOVE, androidx.core.app.ServiceCompat.STOP_FOREGROUND_DETACH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ServiceCompat.StopForegroundFlags {
+ }
+
+ public final class ShareCompat {
+ method @Deprecated public static void configureMenuItem(android.view.MenuItem, androidx.core.app.ShareCompat.IntentBuilder);
+ method @Deprecated public static void configureMenuItem(android.view.Menu, @IdRes int, androidx.core.app.ShareCompat.IntentBuilder);
+ method public static android.content.ComponentName? getCallingActivity(android.app.Activity);
+ method public static String? getCallingPackage(android.app.Activity);
+ field public static final String EXTRA_CALLING_ACTIVITY = "androidx.core.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_ACTIVITY_INTEROP = "android.support.v4.app.EXTRA_CALLING_ACTIVITY";
+ field public static final String EXTRA_CALLING_PACKAGE = "androidx.core.app.EXTRA_CALLING_PACKAGE";
+ field public static final String EXTRA_CALLING_PACKAGE_INTEROP = "android.support.v4.app.EXTRA_CALLING_PACKAGE";
+ }
+
+ public static class ShareCompat.IntentBuilder {
+ ctor public ShareCompat.IntentBuilder(android.content.Context);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailBcc(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailCc(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String);
+ method public androidx.core.app.ShareCompat.IntentBuilder addEmailTo(String![]);
+ method public androidx.core.app.ShareCompat.IntentBuilder addStream(android.net.Uri);
+ method public android.content.Intent createChooserIntent();
+ method @Deprecated public static androidx.core.app.ShareCompat.IntentBuilder from(android.app.Activity);
+ method public android.content.Intent getIntent();
+ method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(CharSequence?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setChooserTitle(@StringRes int);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailBcc(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailCc(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setEmailTo(String![]?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setHtmlText(String?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setStream(android.net.Uri?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setSubject(String?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setText(CharSequence?);
+ method public androidx.core.app.ShareCompat.IntentBuilder setType(String?);
+ method public void startChooser();
+ }
+
+ public static class ShareCompat.IntentReader {
+ ctor public ShareCompat.IntentReader(android.app.Activity);
+ ctor public ShareCompat.IntentReader(android.content.Context, android.content.Intent);
+ method @Deprecated public static androidx.core.app.ShareCompat.IntentReader from(android.app.Activity);
+ method public android.content.ComponentName? getCallingActivity();
+ method public android.graphics.drawable.Drawable? getCallingActivityIcon();
+ method public android.graphics.drawable.Drawable? getCallingApplicationIcon();
+ method public CharSequence? getCallingApplicationLabel();
+ method public String? getCallingPackage();
+ method public String![]? getEmailBcc();
+ method public String![]? getEmailCc();
+ method public String![]? getEmailTo();
+ method public String? getHtmlText();
+ method public android.net.Uri? getStream();
+ method public android.net.Uri? getStream(int);
+ method public int getStreamCount();
+ method public String? getSubject();
+ method public CharSequence? getText();
+ method public String? getType();
+ method public boolean isMultipleShare();
+ method public boolean isShareIntent();
+ method public boolean isSingleShare();
+ }
+
+ public abstract class SharedElementCallback {
+ ctor public SharedElementCallback();
+ method public android.os.Parcelable! onCaptureSharedElementSnapshot(android.view.View!, android.graphics.Matrix!, android.graphics.RectF!);
+ method public android.view.View! onCreateSnapshotView(android.content.Context!, android.os.Parcelable!);
+ method public void onMapSharedElements(java.util.List<java.lang.String!>!, java.util.Map<java.lang.String!,android.view.View!>!);
+ method public void onRejectSharedElements(java.util.List<android.view.View!>!);
+ method public void onSharedElementEnd(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+ method public void onSharedElementStart(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, java.util.List<android.view.View!>!);
+ method public void onSharedElementsArrived(java.util.List<java.lang.String!>!, java.util.List<android.view.View!>!, androidx.core.app.SharedElementCallback.OnSharedElementsReadyListener!);
+ }
+
+ public static interface SharedElementCallback.OnSharedElementsReadyListener {
+ method public void onSharedElementsReady();
+ }
+
+ public final class TaskStackBuilder implements java.lang.Iterable<android.content.Intent> {
+ method public androidx.core.app.TaskStackBuilder addNextIntent(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addNextIntentWithParentStack(android.content.Intent);
+ method public androidx.core.app.TaskStackBuilder addParentStack(android.app.Activity);
+ method public androidx.core.app.TaskStackBuilder addParentStack(Class<?>);
+ method public androidx.core.app.TaskStackBuilder! addParentStack(android.content.ComponentName!);
+ method public static androidx.core.app.TaskStackBuilder create(android.content.Context);
+ method public android.content.Intent? editIntentAt(int);
+ method @Deprecated public static androidx.core.app.TaskStackBuilder! from(android.content.Context!);
+ method @Deprecated public android.content.Intent! getIntent(int);
+ method public int getIntentCount();
+ method public android.content.Intent![] getIntents();
+ method public android.app.PendingIntent? getPendingIntent(int, int);
+ method public android.app.PendingIntent? getPendingIntent(int, int, android.os.Bundle?);
+ method @Deprecated public java.util.Iterator<android.content.Intent!>! iterator();
+ method public void startActivities();
+ method public void startActivities(android.os.Bundle?);
+ }
+
+ public static interface TaskStackBuilder.SupportParentable {
+ method public android.content.Intent? getSupportParentActivityIntent();
+ }
+
+}
+
+package androidx.core.content {
+
+ public final class ContentProviderCompat {
+ method public static android.content.Context requireContext(android.content.ContentProvider);
+ }
+
+ public final class ContentResolverCompat {
+ method public static android.database.Cursor! query(android.content.ContentResolver!, android.net.Uri!, String![]!, String!, String![]!, String!, androidx.core.os.CancellationSignal!);
+ }
+
+ public class ContextCompat {
+ ctor protected ContextCompat();
+ method public static int checkSelfPermission(android.content.Context, String);
+ method public static android.content.Context? createDeviceProtectedStorageContext(android.content.Context);
+ method public static String? getAttributionTag(android.content.Context);
+ method public static java.io.File getCodeCacheDir(android.content.Context);
+ method @ColorInt public static int getColor(android.content.Context, @ColorRes int);
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.Context, @ColorRes int);
+ method public static java.io.File? getDataDir(android.content.Context);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.Context, @DrawableRes int);
+ method public static java.io.File![] getExternalCacheDirs(android.content.Context);
+ method public static java.io.File![] getExternalFilesDirs(android.content.Context, String?);
+ method public static java.util.concurrent.Executor getMainExecutor(android.content.Context);
+ method public static java.io.File? getNoBackupFilesDir(android.content.Context);
+ method public static java.io.File![] getObbDirs(android.content.Context);
+ method public static <T> T? getSystemService(android.content.Context, Class<T!>);
+ method public static String? getSystemServiceName(android.content.Context, Class<?>);
+ method public static boolean isDeviceProtectedStorage(android.content.Context);
+ method public static boolean startActivities(android.content.Context, android.content.Intent![]);
+ method public static boolean startActivities(android.content.Context, android.content.Intent![], android.os.Bundle?);
+ method public static void startActivity(android.content.Context, android.content.Intent, android.os.Bundle?);
+ method public static void startForegroundService(android.content.Context, android.content.Intent);
+ }
+
+ public class FileProvider extends android.content.ContentProvider {
+ ctor public FileProvider();
+ method public int delete(android.net.Uri, String?, String![]?);
+ method public String! getType(android.net.Uri);
+ method public static android.net.Uri! getUriForFile(android.content.Context, String, java.io.File);
+ method public static android.net.Uri getUriForFile(android.content.Context, String, java.io.File, String);
+ method public android.net.Uri! insert(android.net.Uri, android.content.ContentValues!);
+ method public boolean onCreate();
+ method public android.database.Cursor! query(android.net.Uri, String![]?, String?, String![]?, String?);
+ method public int update(android.net.Uri, android.content.ContentValues!, String?, String![]?);
+ }
+
+ public final class IntentCompat {
+ method public static android.content.Intent createManageUnusedAppRestrictionsIntent(android.content.Context, String);
+ method public static android.content.Intent makeMainSelectorActivity(String, String);
+ field public static final String ACTION_CREATE_REMINDER = "android.intent.action.CREATE_REMINDER";
+ field public static final String CATEGORY_LEANBACK_LAUNCHER = "android.intent.category.LEANBACK_LAUNCHER";
+ field public static final String EXTRA_HTML_TEXT = "android.intent.extra.HTML_TEXT";
+ field public static final String EXTRA_START_PLAYBACK = "android.intent.extra.START_PLAYBACK";
+ field public static final String EXTRA_TIME = "android.intent.extra.TIME";
+ }
+
+ public final class LocusIdCompat {
+ ctor public LocusIdCompat(String);
+ method public String getId();
+ method @RequiresApi(29) public android.content.LocusId toLocusId();
+ method @RequiresApi(29) public static androidx.core.content.LocusIdCompat toLocusIdCompat(android.content.LocusId);
+ }
+
+ public final class MimeTypeFilter {
+ method public static boolean matches(String?, String);
+ method public static String? matches(String?, String![]);
+ method public static String? matches(String![]?, String);
+ method public static String![] matchesMany(String![]?, String);
+ }
+
+ public final class PackageManagerCompat {
+ method public static com.google.common.util.concurrent.ListenableFuture<java.lang.Integer!> getUnusedAppRestrictionsStatus(android.content.Context);
+ field public static final String ACTION_PERMISSION_REVOCATION_SETTINGS = "android.intent.action.AUTO_REVOKE_PERMISSIONS";
+ }
+
+ public final class PermissionChecker {
+ method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingOrSelfPermission(android.content.Context, String);
+ method @androidx.core.content.PermissionChecker.PermissionResult public static int checkCallingPermission(android.content.Context, String, String?);
+ method @androidx.core.content.PermissionChecker.PermissionResult public static int checkPermission(android.content.Context, String, int, int, String?);
+ method @androidx.core.content.PermissionChecker.PermissionResult public static int checkSelfPermission(android.content.Context, String);
+ field public static final int PERMISSION_DENIED = -1; // 0xffffffff
+ field public static final int PERMISSION_DENIED_APP_OP = -2; // 0xfffffffe
+ field public static final int PERMISSION_GRANTED = 0; // 0x0
+ }
+
+ @IntDef({androidx.core.content.PermissionChecker.PERMISSION_GRANTED, androidx.core.content.PermissionChecker.PERMISSION_DENIED, androidx.core.content.PermissionChecker.PERMISSION_DENIED_APP_OP}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface PermissionChecker.PermissionResult {
+ }
+
+ @Deprecated public final class SharedPreferencesCompat {
+ }
+
+ @Deprecated public static final class SharedPreferencesCompat.EditorCompat {
+ method @Deprecated public void apply(android.content.SharedPreferences.Editor);
+ method @Deprecated public static androidx.core.content.SharedPreferencesCompat.EditorCompat! getInstance();
+ }
+
+ public class UnusedAppRestrictionsBackportCallback {
+ method public void onResult(boolean, boolean) throws android.os.RemoteException;
+ }
+
+ public abstract class UnusedAppRestrictionsBackportService extends android.app.Service {
+ ctor public UnusedAppRestrictionsBackportService();
+ method protected abstract void isPermissionRevocationEnabled(androidx.core.content.UnusedAppRestrictionsBackportCallback);
+ method public android.os.IBinder? onBind(android.content.Intent?);
+ field public static final String ACTION_UNUSED_APP_RESTRICTIONS_BACKPORT_CONNECTION = "android.support.unusedapprestrictions.action.CustomUnusedAppRestrictionsBackportService";
+ }
+
+ public final class UnusedAppRestrictionsConstants {
+ field public static final int API_30 = 4; // 0x4
+ field public static final int API_30_BACKPORT = 3; // 0x3
+ field public static final int API_31 = 5; // 0x5
+ field public static final int DISABLED = 2; // 0x2
+ field public static final int ERROR = 0; // 0x0
+ field public static final int FEATURE_NOT_AVAILABLE = 1; // 0x1
+ }
+
+}
+
+package androidx.core.content.pm {
+
+ @Deprecated public final class ActivityInfoCompat {
+ field @Deprecated public static final int CONFIG_UI_MODE = 512; // 0x200
+ }
+
+ public final class PackageInfoCompat {
+ method public static long getLongVersionCode(android.content.pm.PackageInfo);
+ method public static java.util.List<android.content.pm.Signature!> getSignatures(android.content.pm.PackageManager, String) throws android.content.pm.PackageManager.NameNotFoundException;
+ method public static boolean hasSignatures(android.content.pm.PackageManager, String, @Size(min=1) java.util.Map<byte[]!,java.lang.Integer!>, boolean) throws android.content.pm.PackageManager.NameNotFoundException;
+ }
+
+ public final class PermissionInfoCompat {
+ method public static int getProtection(android.content.pm.PermissionInfo);
+ method public static int getProtectionFlags(android.content.pm.PermissionInfo);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoChangeListener {
+ ctor public ShortcutInfoChangeListener();
+ method @AnyThread public void onAllShortcutsRemoved();
+ method @AnyThread public void onShortcutAdded(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method @AnyThread public void onShortcutRemoved(java.util.List<java.lang.String!>);
+ method @AnyThread public void onShortcutUpdated(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method @AnyThread public void onShortcutUsageReported(java.util.List<java.lang.String!>);
+ }
+
+ public class ShortcutInfoCompat {
+ method public android.content.ComponentName? getActivity();
+ method public java.util.Set<java.lang.String!>? getCategories();
+ method public CharSequence? getDisabledMessage();
+ method public int getDisabledReason();
+ method public android.os.PersistableBundle? getExtras();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.graphics.drawable.IconCompat! getIcon();
+ method public String getId();
+ method public android.content.Intent getIntent();
+ method public android.content.Intent![] getIntents();
+ method public long getLastChangedTimestamp();
+ method public androidx.core.content.LocusIdCompat? getLocusId();
+ method public CharSequence? getLongLabel();
+ method public String getPackage();
+ method public int getRank();
+ method public CharSequence getShortLabel();
+ method public android.os.UserHandle? getUserHandle();
+ method public boolean hasKeyFieldsOnly();
+ method public boolean isCached();
+ method public boolean isDeclaredInManifest();
+ method public boolean isDynamic();
+ method public boolean isEnabled();
+ method public boolean isImmutable();
+ method public boolean isPinned();
+ method @RequiresApi(25) public android.content.pm.ShortcutInfo! toShortcutInfo();
+ }
+
+ public static class ShortcutInfoCompat.Builder {
+ ctor public ShortcutInfoCompat.Builder(android.content.Context, String);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(androidx.core.content.pm.ShortcutInfoCompat);
+ ctor @RequiresApi(25) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public ShortcutInfoCompat.Builder(android.content.Context, android.content.pm.ShortcutInfo);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder addCapabilityBinding(String, String, java.util.List<java.lang.String!>);
+ method public androidx.core.content.pm.ShortcutInfoCompat build();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setActivity(android.content.ComponentName);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setAlwaysBadged();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setCategories(java.util.Set<java.lang.String!>);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setDisabledMessage(CharSequence);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setExtras(android.os.PersistableBundle);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIcon(androidx.core.graphics.drawable.IconCompat!);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntent(android.content.Intent);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIntents(android.content.Intent![]);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setIsConversation();
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLocusId(androidx.core.content.LocusIdCompat?);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setLongLabel(CharSequence);
+ 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);
+ method public androidx.core.content.pm.ShortcutInfoCompat.Builder setSliceUri(android.net.Uri);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class ShortcutInfoCompatSaver<T> {
+ ctor public ShortcutInfoCompatSaver();
+ method @AnyThread public abstract T! addShortcuts(java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>!);
+ method @WorkerThread public java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>! getShortcuts() throws java.lang.Exception;
+ method @AnyThread public abstract T! removeAllShortcuts();
+ method @AnyThread public abstract T! removeShortcuts(java.util.List<java.lang.String!>!);
+ }
+
+ public class ShortcutManagerCompat {
+ method public static boolean addDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static android.content.Intent createShortcutResultIntent(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static void disableShortcuts(android.content.Context, java.util.List<java.lang.String!>, CharSequence?);
+ method public static void enableShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getDynamicShortcuts(android.content.Context);
+ method public static int getIconMaxHeight(android.content.Context);
+ method public static int getIconMaxWidth(android.content.Context);
+ method public static int getMaxShortcutCountPerActivity(android.content.Context);
+ method public static java.util.List<androidx.core.content.pm.ShortcutInfoCompat!> getShortcuts(android.content.Context, @androidx.core.content.pm.ShortcutManagerCompat.ShortcutMatchFlags int);
+ method public static boolean isRateLimitingActive(android.content.Context);
+ method public static boolean isRequestPinShortcutSupported(android.content.Context);
+ method public static boolean pushDynamicShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat);
+ method public static void removeAllDynamicShortcuts(android.content.Context);
+ method public static void removeDynamicShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+ method public static void removeLongLivedShortcuts(android.content.Context, java.util.List<java.lang.String!>);
+ method public static void reportShortcutUsed(android.content.Context, String);
+ method public static boolean requestPinShortcut(android.content.Context, androidx.core.content.pm.ShortcutInfoCompat, android.content.IntentSender?);
+ method public static boolean setDynamicShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ method public static boolean updateShortcuts(android.content.Context, java.util.List<androidx.core.content.pm.ShortcutInfoCompat!>);
+ field public static final String EXTRA_SHORTCUT_ID = "android.intent.extra.shortcut.ID";
+ field public static final int FLAG_MATCH_CACHED = 8; // 0x8
+ field public static final int FLAG_MATCH_DYNAMIC = 2; // 0x2
+ field public static final int FLAG_MATCH_MANIFEST = 1; // 0x1
+ field public static final int FLAG_MATCH_PINNED = 4; // 0x4
+ }
+
+ @IntDef(flag=true, value={androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_MANIFEST, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_DYNAMIC, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_PINNED, androidx.core.content.pm.ShortcutManagerCompat.FLAG_MATCH_CACHED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ShortcutManagerCompat.ShortcutMatchFlags {
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class ShortcutXmlParser {
+ method @WorkerThread public static java.util.List<java.lang.String!> getShortcutIds(android.content.Context);
+ method @VisibleForTesting public static java.util.List<java.lang.String!> parseShortcutIds(org.xmlpull.v1.XmlPullParser) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ }
+
+}
+
+package androidx.core.content.res {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ColorStateListInflaterCompat {
+ method public static android.content.res.ColorStateList createFromXml(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static android.content.res.ColorStateList createFromXmlInner(android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static android.content.res.ColorStateList? inflate(android.content.res.Resources, @XmlRes int, android.content.res.Resources.Theme?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ComplexColorCompat {
+ method @ColorInt public int getColor();
+ method public android.graphics.Shader? getShader();
+ method public static androidx.core.content.res.ComplexColorCompat? inflate(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?);
+ method public boolean isGradient();
+ method public boolean isStateful();
+ method public boolean onStateChanged(int[]!);
+ method public void setColor(@ColorInt int);
+ method public boolean willDraw();
+ }
+
+ public final class ConfigurationHelper {
+ method public static int getDensityDpi(android.content.res.Resources);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FontResourcesParserCompat {
+ method public static androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry? parse(org.xmlpull.v1.XmlPullParser!, android.content.res.Resources!) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static java.util.List<java.util.List<byte[]!>!>! readCerts(android.content.res.Resources!, @ArrayRes int);
+ field public static final int FETCH_STRATEGY_ASYNC = 1; // 0x1
+ field public static final int FETCH_STRATEGY_BLOCKING = 0; // 0x0
+ field public static final int INFINITE_TIMEOUT_VALUE = -1; // 0xffffffff
+ }
+
+ public static interface FontResourcesParserCompat.FamilyResourceEntry {
+ }
+
+ @IntDef({androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_BLOCKING, androidx.core.content.res.FontResourcesParserCompat.FETCH_STRATEGY_ASYNC}) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontResourcesParserCompat.FetchStrategy {
+ }
+
+ public static final class FontResourcesParserCompat.FontFamilyFilesResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+ ctor public FontResourcesParserCompat.FontFamilyFilesResourceEntry(androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![]);
+ method public androidx.core.content.res.FontResourcesParserCompat.FontFileResourceEntry![] getEntries();
+ }
+
+ public static final class FontResourcesParserCompat.FontFileResourceEntry {
+ ctor public FontResourcesParserCompat.FontFileResourceEntry(String, int, boolean, String?, int, int);
+ method public String getFileName();
+ method public int getResourceId();
+ method public int getTtcIndex();
+ method public String? getVariationSettings();
+ method public int getWeight();
+ method public boolean isItalic();
+ }
+
+ public static final class FontResourcesParserCompat.ProviderResourceEntry implements androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry {
+ ctor public FontResourcesParserCompat.ProviderResourceEntry(androidx.core.provider.FontRequest, @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy int, int);
+ method @androidx.core.content.res.FontResourcesParserCompat.FetchStrategy public int getFetchStrategy();
+ method public androidx.core.provider.FontRequest getRequest();
+ method public int getTimeout();
+ }
+
+ public final class ResourcesCompat {
+ method public static android.graphics.Typeface? getCachedFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method @ColorInt public static int getColor(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.content.res.ColorStateList? getColorStateList(android.content.res.Resources, @ColorRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.Resources, @DrawableRes int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static android.graphics.drawable.Drawable? getDrawableForDensity(android.content.res.Resources, @DrawableRes int, int, android.content.res.Resources.Theme?) throws android.content.res.Resources.NotFoundException;
+ method public static float getFloat(android.content.res.Resources, @DimenRes int);
+ method public static android.graphics.Typeface? getFont(android.content.Context, @FontRes int) throws android.content.res.Resources.NotFoundException;
+ method public static void getFont(android.content.Context, @FontRes int, androidx.core.content.res.ResourcesCompat.FontCallback, android.os.Handler?) throws android.content.res.Resources.NotFoundException;
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFont(android.content.Context, @FontRes int, android.util.TypedValue!, int, androidx.core.content.res.ResourcesCompat.FontCallback?) throws android.content.res.Resources.NotFoundException;
+ field @AnyRes public static final int ID_NULL = 0; // 0x0
+ }
+
+ public abstract static class ResourcesCompat.FontCallback {
+ ctor public ResourcesCompat.FontCallback();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackFailAsync(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int, android.os.Handler?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final void callbackSuccessAsync(android.graphics.Typeface!, android.os.Handler?);
+ method public abstract void onFontRetrievalFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+ method public abstract void onFontRetrieved(android.graphics.Typeface);
+ }
+
+ public static final class ResourcesCompat.ThemeCompat {
+ method public static void rebase(android.content.res.Resources.Theme);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypedArrayUtils {
+ method public static int getAttr(android.content.Context, int, int);
+ method public static boolean getBoolean(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, boolean);
+ method public static android.graphics.drawable.Drawable? getDrawable(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+ method public static int getInt(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, int);
+ method public static boolean getNamedBoolean(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, boolean);
+ method @ColorInt public static int getNamedColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @ColorInt int);
+ method public static android.content.res.ColorStateList? getNamedColorStateList(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int);
+ method public static androidx.core.content.res.ComplexColorCompat! getNamedComplexColor(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, android.content.res.Resources.Theme?, String, @StyleableRes int, @ColorInt int);
+ method public static float getNamedFloat(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, float);
+ method public static int getNamedInt(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, int);
+ method @AnyRes public static int getNamedResourceId(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int, @AnyRes int);
+ method public static String? getNamedString(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, @StyleableRes int);
+ method @AnyRes public static int getResourceId(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int, @AnyRes int);
+ method public static String? getString(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+ method public static CharSequence? getText(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+ method public static CharSequence![]? getTextArray(android.content.res.TypedArray, @StyleableRes int, @StyleableRes int);
+ method public static boolean hasAttribute(org.xmlpull.v1.XmlPullParser, String);
+ method public static android.content.res.TypedArray obtainAttributes(android.content.res.Resources, android.content.res.Resources.Theme?, android.util.AttributeSet, int[]);
+ method public static android.util.TypedValue? peekNamedValue(android.content.res.TypedArray, org.xmlpull.v1.XmlPullParser, String, int);
+ }
+
+}
+
+package androidx.core.database {
+
+ public final class CursorWindowCompat {
+ method public static android.database.CursorWindow create(String?, long);
+ }
+
+ @Deprecated public final class DatabaseUtilsCompat {
+ method @Deprecated public static String![]! appendSelectionArgs(String![]!, String![]!);
+ method @Deprecated public static String! concatenateWhere(String!, String!);
+ }
+
+}
+
+package androidx.core.database.sqlite {
+
+ public final class SQLiteCursorCompat {
+ method public static void setFillWindowForwardOnly(android.database.sqlite.SQLiteCursor, boolean);
+ }
+
+}
+
+package androidx.core.graphics {
+
+ public final class BitmapCompat {
+ method public static int getAllocationByteCount(android.graphics.Bitmap);
+ method public static boolean hasMipMap(android.graphics.Bitmap);
+ method public static void setHasMipMap(android.graphics.Bitmap, boolean);
+ }
+
+ public class BlendModeColorFilterCompat {
+ method public static android.graphics.ColorFilter? createBlendModeColorFilterCompat(int, androidx.core.graphics.BlendModeCompat);
+ }
+
+ public enum BlendModeCompat {
+ enum_constant public static final androidx.core.graphics.BlendModeCompat CLEAR;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_BURN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat COLOR_DODGE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DARKEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat DIFFERENCE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_ATOP;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_IN;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OUT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat DST_OVER;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat EXCLUSION;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HARD_LIGHT;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat HUE;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat LIGHTEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat LUMINOSITY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat MODULATE;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat MULTIPLY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat OVERLAY;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat PLUS;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SATURATION;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SCREEN;
+ enum_constant @RequiresApi(android.os.Build.VERSION_CODES.Q) public static final androidx.core.graphics.BlendModeCompat SOFT_LIGHT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_ATOP;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_IN;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OUT;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat SRC_OVER;
+ enum_constant public static final androidx.core.graphics.BlendModeCompat XOR;
+ }
+
+ public final class ColorUtils {
+ method @ColorInt public static int HSLToColor(float[]);
+ method @ColorInt public static int LABToColor(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double);
+ method public static void LABToXYZ(@FloatRange(from=0.0f, to=100) double, @FloatRange(from=0xffffff80, to=127) double, @FloatRange(from=0xffffff80, to=127) double, double[]);
+ method public static void RGBToHSL(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, float[]);
+ method public static void RGBToLAB(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method public static void RGBToXYZ(@IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, @IntRange(from=0, to=255) int, double[]);
+ method @ColorInt public static int XYZToColor(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double);
+ method public static void XYZToLAB(@FloatRange(from=0.0f, to=95.047) double, @FloatRange(from=0.0f, to=0x64) double, @FloatRange(from=0.0f, to=108.883) double, double[]);
+ method @ColorInt public static int blendARGB(@ColorInt int, @ColorInt int, @FloatRange(from=0.0, to=1.0) float);
+ method public static void blendHSL(float[], float[], @FloatRange(from=0.0, to=1.0) float, float[]);
+ method public static void blendLAB(double[], double[], @FloatRange(from=0.0, to=1.0) double, double[]);
+ method public static double calculateContrast(@ColorInt int, @ColorInt int);
+ method @FloatRange(from=0.0, to=1.0) public static double calculateLuminance(@ColorInt int);
+ method public static int calculateMinimumAlpha(@ColorInt int, @ColorInt int, float);
+ method public static void colorToHSL(@ColorInt int, float[]);
+ method public static void colorToLAB(@ColorInt int, double[]);
+ method public static void colorToXYZ(@ColorInt int, double[]);
+ method public static int compositeColors(@ColorInt int, @ColorInt int);
+ method @RequiresApi(26) public static android.graphics.Color compositeColors(android.graphics.Color, android.graphics.Color);
+ method public static double distanceEuclidean(double[], double[]);
+ method @ColorInt public static int setAlphaComponent(@ColorInt int, @IntRange(from=0, to=255) int);
+ }
+
+ public final class Insets {
+ method public static androidx.core.graphics.Insets add(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets max(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets min(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public static androidx.core.graphics.Insets of(int, int, int, int);
+ method public static androidx.core.graphics.Insets of(android.graphics.Rect);
+ method public static androidx.core.graphics.Insets subtract(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method @RequiresApi(api=29) public static androidx.core.graphics.Insets toCompatInsets(android.graphics.Insets);
+ method @RequiresApi(api=29) public android.graphics.Insets toPlatformInsets();
+ method @Deprecated @RequiresApi(api=29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.Insets wrap(android.graphics.Insets);
+ field public static final androidx.core.graphics.Insets NONE;
+ field public final int bottom;
+ field public final int left;
+ field public final int right;
+ field public final int top;
+ }
+
+ public final class PaintCompat {
+ method public static boolean hasGlyph(android.graphics.Paint, String);
+ method public static boolean setBlendMode(android.graphics.Paint, androidx.core.graphics.BlendModeCompat?);
+ }
+
+ public final class PathSegment {
+ ctor public PathSegment(android.graphics.PointF, float, android.graphics.PointF, float);
+ method public android.graphics.PointF getEnd();
+ method public float getEndFraction();
+ method public android.graphics.PointF getStart();
+ method public float getStartFraction();
+ }
+
+ public final class PathUtils {
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path);
+ method @RequiresApi(26) public static java.util.Collection<androidx.core.graphics.PathSegment!> flatten(android.graphics.Path, @FloatRange(from=0) float);
+ }
+
+ public class TypefaceCompat {
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static void clearCache();
+ method public static android.graphics.Typeface create(android.content.Context, android.graphics.Typeface?, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromFontInfo(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFamilyXml(android.content.Context, androidx.core.content.res.FontResourcesParserCompat.FamilyResourceEntry, android.content.res.Resources, int, int, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? createFromResourcesFontFile(android.content.Context, android.content.res.Resources, int, String!, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface? findFromCache(android.content.res.Resources, int, int);
+ }
+
+ @RequiresApi(26) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi26Impl {
+ ctor public TypefaceCompatApi26Impl();
+ method protected android.graphics.Typeface? createFromFamiliesWithDefault(Object!);
+ method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+ method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+ method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+ method protected java.lang.reflect.Method! obtainAbortCreationMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+ method protected java.lang.reflect.Method! obtainAddFontFromAssetManagerMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+ method protected java.lang.reflect.Method! obtainAddFontFromBufferMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+ method protected java.lang.reflect.Method! obtainCreateFromFamiliesWithDefaultMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+ method protected Class<?>! obtainFontFamily() throws java.lang.ClassNotFoundException;
+ method protected java.lang.reflect.Constructor<?>! obtainFontFamilyCtor(Class<?>!) throws java.lang.NoSuchMethodException;
+ method protected java.lang.reflect.Method! obtainFreezeMethod(Class<?>!) throws java.lang.NoSuchMethodException;
+ field protected final java.lang.reflect.Method! mAbortCreation;
+ field protected final java.lang.reflect.Method! mAddFontFromAssetManager;
+ field protected final java.lang.reflect.Method! mAddFontFromBuffer;
+ field protected final java.lang.reflect.Method! mCreateFromFamiliesWithDefault;
+ field protected final Class<?>! mFontFamily;
+ field protected final java.lang.reflect.Constructor<?>! mFontFamilyCtor;
+ field protected final java.lang.reflect.Method! mFreeze;
+ }
+
+ @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatApi28Impl extends androidx.core.graphics.TypefaceCompatApi26Impl {
+ ctor public TypefaceCompatApi28Impl();
+ }
+
+ @RequiresApi(29) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public class TypefaceCompatApi29Impl {
+ ctor public TypefaceCompatApi29Impl();
+ method public android.graphics.Typeface? createFromFontFamilyFilesResourceEntry(android.content.Context!, androidx.core.content.res.FontResourcesParserCompat.FontFamilyFilesResourceEntry!, android.content.res.Resources!, int);
+ method public android.graphics.Typeface? createFromFontInfo(android.content.Context!, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![], int);
+ method protected android.graphics.Typeface! createFromInputStream(android.content.Context!, java.io.InputStream!);
+ method public android.graphics.Typeface? createFromResourcesFontFile(android.content.Context!, android.content.res.Resources!, int, String!, int);
+ method protected androidx.core.provider.FontsContractCompat.FontInfo! findBestInfo(androidx.core.provider.FontsContractCompat.FontInfo![]!, int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class TypefaceCompatUtil {
+ method public static void closeQuietly(java.io.Closeable!);
+ method @RequiresApi(19) public static java.nio.ByteBuffer? copyToDirectBuffer(android.content.Context!, android.content.res.Resources!, int);
+ method public static boolean copyToFile(java.io.File!, java.io.InputStream!);
+ method public static boolean copyToFile(java.io.File!, android.content.res.Resources!, int);
+ method public static java.io.File? getTempFile(android.content.Context!);
+ method @RequiresApi(19) public static java.nio.ByteBuffer? mmap(android.content.Context!, android.os.CancellationSignal!, android.net.Uri!);
+ }
+
+}
+
+package androidx.core.graphics.drawable {
+
+ public final class DrawableCompat {
+ method public static void applyTheme(android.graphics.drawable.Drawable, android.content.res.Resources.Theme);
+ method public static boolean canApplyTheme(android.graphics.drawable.Drawable);
+ method public static void clearColorFilter(android.graphics.drawable.Drawable);
+ method public static int getAlpha(android.graphics.drawable.Drawable);
+ method public static android.graphics.ColorFilter! getColorFilter(android.graphics.drawable.Drawable);
+ method public static int getLayoutDirection(android.graphics.drawable.Drawable);
+ method public static void inflate(android.graphics.drawable.Drawable, android.content.res.Resources, org.xmlpull.v1.XmlPullParser, android.util.AttributeSet, android.content.res.Resources.Theme?) throws java.io.IOException, org.xmlpull.v1.XmlPullParserException;
+ method public static boolean isAutoMirrored(android.graphics.drawable.Drawable);
+ method @Deprecated public static void jumpToCurrentState(android.graphics.drawable.Drawable);
+ method public static void setAutoMirrored(android.graphics.drawable.Drawable, boolean);
+ method public static void setHotspot(android.graphics.drawable.Drawable, float, float);
+ method public static void setHotspotBounds(android.graphics.drawable.Drawable, int, int, int, int);
+ method public static boolean setLayoutDirection(android.graphics.drawable.Drawable, int);
+ method public static void setTint(android.graphics.drawable.Drawable, @ColorInt int);
+ method public static void setTintList(android.graphics.drawable.Drawable, android.content.res.ColorStateList?);
+ method public static void setTintMode(android.graphics.drawable.Drawable, android.graphics.PorterDuff.Mode);
+ method public static <T extends android.graphics.drawable.Drawable> T! unwrap(android.graphics.drawable.Drawable);
+ method public static android.graphics.drawable.Drawable! wrap(android.graphics.drawable.Drawable);
+ }
+
+ @androidx.versionedparcelable.VersionedParcelize(allowSerialization=true, ignoreParcelables=true, isCustom=true, jetifyAs="android.support.v4.graphics.drawable.IconCompat") public class IconCompat extends androidx.versionedparcelable.CustomVersionedParcelable {
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addToShortcutIntent(android.content.Intent, android.graphics.drawable.Drawable?, android.content.Context);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void checkResource(android.content.Context);
+ method public static androidx.core.graphics.drawable.IconCompat? createFromBundle(android.os.Bundle);
+ method @RequiresApi(23) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.content.Context, android.graphics.drawable.Icon);
+ method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIcon(android.graphics.drawable.Icon);
+ method @RequiresApi(23) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat? createFromIconOrNullIfZeroResId(android.graphics.drawable.Icon);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithAdaptiveBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(String);
+ method public static androidx.core.graphics.drawable.IconCompat createWithAdaptiveBitmapContentUri(android.net.Uri);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithBitmap(android.graphics.Bitmap!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(String!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithContentUri(android.net.Uri!);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithData(byte[]!, int, int);
+ method public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.Context!, @DrawableRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.graphics.drawable.IconCompat! createWithResource(android.content.res.Resources!, String!, @DrawableRes int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.graphics.Bitmap? getBitmap();
+ method @IdRes public int getResId();
+ method public String getResPackage();
+ method public int getType();
+ method public android.net.Uri getUri();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) public java.io.InputStream? getUriInputStream(android.content.Context);
+ method public android.graphics.drawable.Drawable? loadDrawable(android.content.Context);
+ method public androidx.core.graphics.drawable.IconCompat! setTint(@ColorInt int);
+ method public androidx.core.graphics.drawable.IconCompat! setTintList(android.content.res.ColorStateList!);
+ method public androidx.core.graphics.drawable.IconCompat! setTintMode(android.graphics.PorterDuff.Mode!);
+ method public android.os.Bundle toBundle();
+ method @Deprecated @RequiresApi(23) public android.graphics.drawable.Icon toIcon();
+ method @RequiresApi(23) public android.graphics.drawable.Icon toIcon(android.content.Context?);
+ field public static final int TYPE_ADAPTIVE_BITMAP = 5; // 0x5
+ field public static final int TYPE_BITMAP = 1; // 0x1
+ field public static final int TYPE_DATA = 3; // 0x3
+ field public static final int TYPE_RESOURCE = 2; // 0x2
+ field public static final int TYPE_UNKNOWN = -1; // 0xffffffff
+ field public static final int TYPE_URI = 4; // 0x4
+ field public static final int TYPE_URI_ADAPTIVE_BITMAP = 6; // 0x6
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @androidx.versionedparcelable.ParcelField(value=1, defaultValue="androidx.core.graphics.drawable.IconCompat.TYPE_UNKNOWN") public int mType;
+ }
+
+ public abstract class RoundedBitmapDrawable extends android.graphics.drawable.Drawable {
+ method public void draw(android.graphics.Canvas);
+ method public final android.graphics.Bitmap? getBitmap();
+ method public float getCornerRadius();
+ method public int getGravity();
+ method public int getOpacity();
+ method public final android.graphics.Paint getPaint();
+ method public boolean hasAntiAlias();
+ method public boolean hasMipMap();
+ method public boolean isCircular();
+ method public void setAlpha(int);
+ method public void setAntiAlias(boolean);
+ method public void setCircular(boolean);
+ method public void setColorFilter(android.graphics.ColorFilter!);
+ method public void setCornerRadius(float);
+ method public void setDither(boolean);
+ method public void setGravity(int);
+ method public void setMipMap(boolean);
+ method public void setTargetDensity(android.graphics.Canvas);
+ method public void setTargetDensity(android.util.DisplayMetrics);
+ method public void setTargetDensity(int);
+ }
+
+ public final class RoundedBitmapDrawableFactory {
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, android.graphics.Bitmap?);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, String);
+ method public static androidx.core.graphics.drawable.RoundedBitmapDrawable create(android.content.res.Resources, java.io.InputStream);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintAwareDrawable {
+ method public void setTint(@ColorInt int);
+ method public void setTintList(android.content.res.ColorStateList!);
+ method public void setTintMode(android.graphics.PorterDuff.Mode!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface WrappedDrawable {
+ method public android.graphics.drawable.Drawable! getWrappedDrawable();
+ method public void setWrappedDrawable(android.graphics.drawable.Drawable!);
+ }
+
+}
+
+package androidx.core.hardware.display {
+
+ public final class DisplayManagerCompat {
+ method public android.view.Display? getDisplay(int);
+ method public android.view.Display![] getDisplays();
+ method public android.view.Display![] getDisplays(String?);
+ method public static androidx.core.hardware.display.DisplayManagerCompat getInstance(android.content.Context);
+ field public static final String DISPLAY_CATEGORY_PRESENTATION = "android.hardware.display.category.PRESENTATION";
+ }
+
+}
+
+package androidx.core.hardware.fingerprint {
+
+ @Deprecated public class FingerprintManagerCompat {
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public void authenticate(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject?, int, androidx.core.os.CancellationSignal?, androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationCallback, android.os.Handler?);
+ method @Deprecated public static androidx.core.hardware.fingerprint.FingerprintManagerCompat from(android.content.Context);
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean hasEnrolledFingerprints();
+ method @Deprecated @RequiresPermission(android.Manifest.permission.USE_FINGERPRINT) public boolean isHardwareDetected();
+ }
+
+ @Deprecated public abstract static class FingerprintManagerCompat.AuthenticationCallback {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationCallback();
+ method @Deprecated public void onAuthenticationError(int, CharSequence!);
+ method @Deprecated public void onAuthenticationFailed();
+ method @Deprecated public void onAuthenticationHelp(int, CharSequence!);
+ method @Deprecated public void onAuthenticationSucceeded(androidx.core.hardware.fingerprint.FingerprintManagerCompat.AuthenticationResult!);
+ }
+
+ @Deprecated public static final class FingerprintManagerCompat.AuthenticationResult {
+ ctor @Deprecated public FingerprintManagerCompat.AuthenticationResult(androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject!);
+ method @Deprecated public androidx.core.hardware.fingerprint.FingerprintManagerCompat.CryptoObject! getCryptoObject();
+ }
+
+ @Deprecated public static class FingerprintManagerCompat.CryptoObject {
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(java.security.Signature);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Cipher);
+ ctor @Deprecated public FingerprintManagerCompat.CryptoObject(javax.crypto.Mac);
+ method @Deprecated public javax.crypto.Cipher? getCipher();
+ method @Deprecated public javax.crypto.Mac? getMac();
+ method @Deprecated public java.security.Signature? getSignature();
+ }
+
+}
+
+package androidx.core.internal.view {
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenu extends android.view.Menu {
+ method public void setGroupDividerEnabled(boolean);
+ field public static final int CATEGORY_MASK = -65536; // 0xffff0000
+ field public static final int CATEGORY_SHIFT = 16; // 0x10
+ field public static final int FLAG_KEEP_OPEN_ON_SUBMENU_OPENED = 4; // 0x4
+ field public static final int SUPPORTED_MODIFIERS_MASK = 69647; // 0x1100f
+ field public static final int USER_MASK = 65535; // 0xffff
+ field public static final int USER_SHIFT = 0; // 0x0
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportMenuItem extends android.view.MenuItem {
+ method public int getAlphabeticModifiers();
+ method public CharSequence! getContentDescription();
+ method public android.content.res.ColorStateList! getIconTintList();
+ method public android.graphics.PorterDuff.Mode! getIconTintMode();
+ method public int getNumericModifiers();
+ method public androidx.core.view.ActionProvider! getSupportActionProvider();
+ method public CharSequence! getTooltipText();
+ method public boolean requiresActionButton();
+ method public boolean requiresOverflow();
+ method public android.view.MenuItem! setAlphabeticShortcut(char, int);
+ method public androidx.core.internal.view.SupportMenuItem! setContentDescription(CharSequence!);
+ method public android.view.MenuItem! setIconTintList(android.content.res.ColorStateList!);
+ method public android.view.MenuItem! setIconTintMode(android.graphics.PorterDuff.Mode!);
+ method public android.view.MenuItem! setNumericShortcut(char, int);
+ method public android.view.MenuItem! setShortcut(char, char, int, int);
+ method public androidx.core.internal.view.SupportMenuItem! setSupportActionProvider(androidx.core.view.ActionProvider!);
+ method public androidx.core.internal.view.SupportMenuItem! setTooltipText(CharSequence!);
+ field public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+ field public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+ field public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+ field public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+ field public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SupportSubMenu extends androidx.core.internal.view.SupportMenu android.view.SubMenu {
+ }
+
+}
+
+package androidx.core.location {
+
+ public abstract class GnssStatusCompat {
+ method @FloatRange(from=0, to=360) public abstract float getAzimuthDegrees(@IntRange(from=0) int);
+ method @FloatRange(from=0, to=63) public abstract float getBasebandCn0DbHz(@IntRange(from=0) int);
+ method @FloatRange(from=0) public abstract float getCarrierFrequencyHz(@IntRange(from=0) int);
+ method @FloatRange(from=0, to=63) public abstract float getCn0DbHz(@IntRange(from=0) int);
+ method public abstract int getConstellationType(@IntRange(from=0) int);
+ method @FloatRange(from=0xffffffa6, to=90) public abstract float getElevationDegrees(@IntRange(from=0) int);
+ method @IntRange(from=0) public abstract int getSatelliteCount();
+ method @IntRange(from=1, to=200) public abstract int getSvid(@IntRange(from=0) int);
+ method public abstract boolean hasAlmanacData(@IntRange(from=0) int);
+ method public abstract boolean hasBasebandCn0DbHz(@IntRange(from=0) int);
+ method public abstract boolean hasCarrierFrequencyHz(@IntRange(from=0) int);
+ method public abstract boolean hasEphemerisData(@IntRange(from=0) int);
+ method public abstract boolean usedInFix(@IntRange(from=0) int);
+ method @RequiresApi(android.os.Build.VERSION_CODES.N) public static androidx.core.location.GnssStatusCompat wrap(android.location.GnssStatus);
+ method public static androidx.core.location.GnssStatusCompat wrap(android.location.GpsStatus);
+ field public static final int CONSTELLATION_BEIDOU = 5; // 0x5
+ field public static final int CONSTELLATION_GALILEO = 6; // 0x6
+ field public static final int CONSTELLATION_GLONASS = 3; // 0x3
+ field public static final int CONSTELLATION_GPS = 1; // 0x1
+ field public static final int CONSTELLATION_IRNSS = 7; // 0x7
+ field public static final int CONSTELLATION_QZSS = 4; // 0x4
+ field public static final int CONSTELLATION_SBAS = 2; // 0x2
+ field public static final int CONSTELLATION_UNKNOWN = 0; // 0x0
+ }
+
+ public abstract static class GnssStatusCompat.Callback {
+ ctor public GnssStatusCompat.Callback();
+ method public void onFirstFix(@IntRange(from=0) int);
+ method public void onSatelliteStatusChanged(androidx.core.location.GnssStatusCompat);
+ method public void onStarted();
+ method public void onStopped();
+ }
+
+ public final class LocationCompat {
+ method public static float getBearingAccuracyDegrees(android.location.Location);
+ method public static long getElapsedRealtimeMillis(android.location.Location);
+ method public static long getElapsedRealtimeNanos(android.location.Location);
+ method public static float getSpeedAccuracyMetersPerSecond(android.location.Location);
+ method public static float getVerticalAccuracyMeters(android.location.Location);
+ method public static boolean hasBearingAccuracy(android.location.Location);
+ method public static boolean hasSpeedAccuracy(android.location.Location);
+ method public static boolean hasVerticalAccuracy(android.location.Location);
+ method public static boolean isMock(android.location.Location);
+ method public static void setBearingAccuracyDegrees(android.location.Location, float);
+ method public static void setMock(android.location.Location, boolean);
+ method public static void setSpeedAccuracyMetersPerSecond(android.location.Location, float);
+ method public static void setVerticalAccuracyMeters(android.location.Location, float);
+ field public static final String EXTRA_BEARING_ACCURACY = "bearingAccuracy";
+ field public static final String EXTRA_IS_MOCK = "mockLocation";
+ field public static final String EXTRA_SPEED_ACCURACY = "speedAccuracy";
+ field public static final String EXTRA_VERTICAL_ACCURACY = "verticalAccuracy";
+ }
+
+ public interface LocationListenerCompat extends android.location.LocationListener {
+ method public default void onStatusChanged(String, int, android.os.Bundle?);
+ }
+
+ public final class LocationManagerCompat {
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void getCurrentLocation(android.location.LocationManager, String, androidx.core.os.CancellationSignal?, java.util.concurrent.Executor, androidx.core.util.Consumer<android.location.Location!>);
+ method public static String? getGnssHardwareModelName(android.location.LocationManager);
+ method public static int getGnssYearOfHardware(android.location.LocationManager);
+ method public static boolean hasProvider(android.location.LocationManager, String);
+ method public static boolean isLocationEnabled(android.location.LocationManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback, android.os.Handler);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_FINE_LOCATION) public static boolean registerGnssStatusCallback(android.location.LocationManager, java.util.concurrent.Executor, androidx.core.location.GnssStatusCompat.Callback);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void removeUpdates(android.location.LocationManager, androidx.core.location.LocationListenerCompat);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, java.util.concurrent.Executor, androidx.core.location.LocationListenerCompat);
+ method @RequiresPermission(anyOf={android.Manifest.permission.ACCESS_COARSE_LOCATION, android.Manifest.permission.ACCESS_FINE_LOCATION}) public static void requestLocationUpdates(android.location.LocationManager, String, androidx.core.location.LocationRequestCompat, androidx.core.location.LocationListenerCompat, android.os.Looper);
+ method public static void unregisterGnssStatusCallback(android.location.LocationManager, androidx.core.location.GnssStatusCompat.Callback);
+ }
+
+ public final class LocationRequestCompat {
+ method @IntRange(from=1) public long getDurationMillis();
+ method @IntRange(from=0) public long getIntervalMillis();
+ method @IntRange(from=0) public long getMaxUpdateDelayMillis();
+ method @IntRange(from=1, to=java.lang.Integer.MAX_VALUE) public int getMaxUpdates();
+ method @FloatRange(from=0, to=java.lang.Float.MAX_VALUE) public float getMinUpdateDistanceMeters();
+ method @IntRange(from=0) public long getMinUpdateIntervalMillis();
+ method public int getQuality();
+ method @RequiresApi(31) public android.location.LocationRequest toLocationRequest();
+ method @RequiresApi(19) public android.location.LocationRequest? toLocationRequest(String);
+ field public static final long PASSIVE_INTERVAL = 9223372036854775807L; // 0x7fffffffffffffffL
+ field public static final int QUALITY_BALANCED_POWER_ACCURACY = 102; // 0x66
+ field public static final int QUALITY_HIGH_ACCURACY = 100; // 0x64
+ field public static final int QUALITY_LOW_POWER = 104; // 0x68
+ }
+
+ public static final class LocationRequestCompat.Builder {
+ ctor public LocationRequestCompat.Builder(long);
+ ctor public LocationRequestCompat.Builder(androidx.core.location.LocationRequestCompat);
+ method public androidx.core.location.LocationRequestCompat build();
+ method public androidx.core.location.LocationRequestCompat.Builder clearMinUpdateIntervalMillis();
+ method public androidx.core.location.LocationRequestCompat.Builder setDurationMillis(@IntRange(from=1) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setIntervalMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdateDelayMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setMaxUpdates(@IntRange(from=1, to=java.lang.Integer.MAX_VALUE) int);
+ method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateDistanceMeters(@FloatRange(from=0, to=java.lang.Float.MAX_VALUE) float);
+ method public androidx.core.location.LocationRequestCompat.Builder setMinUpdateIntervalMillis(@IntRange(from=0) long);
+ method public androidx.core.location.LocationRequestCompat.Builder setQuality(int);
+ }
+
+}
+
+package androidx.core.math {
+
+ public class MathUtils {
+ method public static int addExact(int, int);
+ method public static long addExact(long, long);
+ method public static float clamp(float, float, float);
+ method public static double clamp(double, double, double);
+ method public static int clamp(int, int, int);
+ method public static long clamp(long, long, long);
+ method public static int decrementExact(int);
+ method public static long decrementExact(long);
+ method public static int incrementExact(int);
+ method public static long incrementExact(long);
+ method public static int multiplyExact(int, int);
+ method public static long multiplyExact(long, long);
+ method public static int negateExact(int);
+ method public static long negateExact(long);
+ method public static int subtractExact(int, int);
+ method public static long subtractExact(long, long);
+ method public static int toIntExact(long);
+ }
+
+}
+
+package androidx.core.net {
+
+ public final class ConnectivityManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static android.net.NetworkInfo? getNetworkInfoFromBroadcast(android.net.ConnectivityManager, android.content.Intent);
+ method @androidx.core.net.ConnectivityManagerCompat.RestrictBackgroundStatus public static int getRestrictBackgroundStatus(android.net.ConnectivityManager);
+ method @RequiresPermission(android.Manifest.permission.ACCESS_NETWORK_STATE) public static boolean isActiveNetworkMetered(android.net.ConnectivityManager);
+ field public static final int RESTRICT_BACKGROUND_STATUS_DISABLED = 1; // 0x1
+ field public static final int RESTRICT_BACKGROUND_STATUS_ENABLED = 3; // 0x3
+ field public static final int RESTRICT_BACKGROUND_STATUS_WHITELISTED = 2; // 0x2
+ }
+
+ @IntDef({androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_DISABLED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_WHITELISTED, androidx.core.net.ConnectivityManagerCompat.RESTRICT_BACKGROUND_STATUS_ENABLED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ConnectivityManagerCompat.RestrictBackgroundStatus {
+ }
+
+ public final class MailTo {
+ method public String? getBcc();
+ method public String? getBody();
+ method public String? getCc();
+ method public java.util.Map<java.lang.String!,java.lang.String!>? getHeaders();
+ method public String? getSubject();
+ method public String? getTo();
+ method public static boolean isMailTo(String?);
+ method public static boolean isMailTo(android.net.Uri?);
+ method public static androidx.core.net.MailTo parse(String) throws androidx.core.net.ParseException;
+ method public static androidx.core.net.MailTo parse(android.net.Uri) throws androidx.core.net.ParseException;
+ field public static final String MAILTO_SCHEME = "mailto:";
+ }
+
+ public class ParseException extends java.lang.RuntimeException {
+ field public final String response;
+ }
+
+ public final class TrafficStatsCompat {
+ method @Deprecated public static void clearThreadStatsTag();
+ method @Deprecated public static int getThreadStatsTag();
+ method @Deprecated public static void incrementOperationCount(int);
+ method @Deprecated public static void incrementOperationCount(int, int);
+ method @Deprecated public static void setThreadStatsTag(int);
+ method public static void tagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void tagSocket(java.net.Socket!) throws java.net.SocketException;
+ method public static void untagDatagramSocket(java.net.DatagramSocket) throws java.net.SocketException;
+ method @Deprecated public static void untagSocket(java.net.Socket!) throws java.net.SocketException;
+ }
+
+ public final class UriCompat {
+ method public static String toSafeString(android.net.Uri);
+ }
+
+}
+
+package androidx.core.os {
+
+ public class BuildCompat {
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N) public static boolean isAtLeastN();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.N_MR1) public static boolean isAtLeastNMR1();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O) public static boolean isAtLeastO();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.O_MR1) public static boolean isAtLeastOMR1();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.P) public static boolean isAtLeastP();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.Q) public static boolean isAtLeastQ();
+ method @Deprecated @ChecksSdkIntAtLeast(api=android.os.Build.VERSION_CODES.R) public static boolean isAtLeastR();
+ method @ChecksSdkIntAtLeast(api=31, codename="S") public static boolean isAtLeastS();
+ }
+
+ public final class CancellationSignal {
+ ctor public CancellationSignal();
+ method public void cancel();
+ method public Object? getCancellationSignalObject();
+ method public boolean isCanceled();
+ method public void setOnCancelListener(androidx.core.os.CancellationSignal.OnCancelListener?);
+ method public void throwIfCanceled();
+ }
+
+ public static interface CancellationSignal.OnCancelListener {
+ method public void onCancel();
+ }
+
+ public final class ConfigurationCompat {
+ method public static androidx.core.os.LocaleListCompat getLocales(android.content.res.Configuration);
+ }
+
+ public final class EnvironmentCompat {
+ method public static String getStorageState(java.io.File);
+ field public static final String MEDIA_UNKNOWN = "unknown";
+ }
+
+ public final class ExecutorCompat {
+ method public static java.util.concurrent.Executor create(android.os.Handler);
+ }
+
+ public final class HandlerCompat {
+ method public static android.os.Handler createAsync(android.os.Looper);
+ method public static android.os.Handler createAsync(android.os.Looper, android.os.Handler.Callback);
+ method @RequiresApi(16) public static boolean hasCallbacks(android.os.Handler, Runnable);
+ method public static boolean postDelayed(android.os.Handler, Runnable, Object?, long);
+ }
+
+ public final class LocaleListCompat {
+ method public static androidx.core.os.LocaleListCompat create(java.util.Locale!...);
+ method public static androidx.core.os.LocaleListCompat forLanguageTags(String?);
+ method public java.util.Locale! get(int);
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getAdjustedDefault();
+ method @Size(min=1) public static androidx.core.os.LocaleListCompat getDefault();
+ method public static androidx.core.os.LocaleListCompat getEmptyLocaleList();
+ method public java.util.Locale? getFirstMatch(String![]);
+ method @IntRange(from=0xffffffff) public int indexOf(java.util.Locale!);
+ method public boolean isEmpty();
+ method @IntRange(from=0) public int size();
+ method public String toLanguageTags();
+ method public Object? unwrap();
+ method @Deprecated @RequiresApi(24) public static androidx.core.os.LocaleListCompat! wrap(Object!);
+ method @RequiresApi(24) public static androidx.core.os.LocaleListCompat wrap(android.os.LocaleList);
+ }
+
+ public final class MessageCompat {
+ method public static boolean isAsynchronous(android.os.Message);
+ method public static void setAsynchronous(android.os.Message, boolean);
+ }
+
+ public class OperationCanceledException extends java.lang.RuntimeException {
+ ctor public OperationCanceledException();
+ ctor public OperationCanceledException(String?);
+ }
+
+ public final class ParcelCompat {
+ method public static boolean readBoolean(android.os.Parcel);
+ method public static void writeBoolean(android.os.Parcel, boolean);
+ }
+
+ @Deprecated public final class ParcelableCompat {
+ method @Deprecated public static <T> android.os.Parcelable.Creator<T!>! newCreator(androidx.core.os.ParcelableCompatCreatorCallbacks<T!>!);
+ }
+
+ @Deprecated public interface ParcelableCompatCreatorCallbacks<T> {
+ method @Deprecated public T! createFromParcel(android.os.Parcel!, ClassLoader!);
+ method @Deprecated public T![]! newArray(int);
+ }
+
+ public final class ProcessCompat {
+ method public static boolean isApplicationUid(int);
+ }
+
+ @Deprecated public final class TraceCompat {
+ method @Deprecated public static void beginAsyncSection(String, int);
+ method @Deprecated public static void beginSection(String);
+ method @Deprecated public static void endAsyncSection(String, int);
+ method @Deprecated public static void endSection();
+ method @Deprecated public static boolean isEnabled();
+ method @Deprecated public static void setCounter(String, int);
+ }
+
+ @RequiresApi(17) public class UserHandleCompat {
+ method public static android.os.UserHandle getUserHandleForUid(int);
+ }
+
+ public class UserManagerCompat {
+ method public static boolean isUserUnlocked(android.content.Context);
+ }
+
+}
+
+package androidx.core.provider {
+
+ public final class DocumentsContractCompat {
+ method public static android.net.Uri? buildChildDocumentsUri(String, String?);
+ method public static android.net.Uri? buildChildDocumentsUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri? buildDocumentUri(String, String);
+ method public static android.net.Uri? buildDocumentUriUsingTree(android.net.Uri, String);
+ method public static android.net.Uri? buildTreeDocumentUri(String, String);
+ method public static android.net.Uri? createDocument(android.content.ContentResolver, android.net.Uri, String, String) throws java.io.FileNotFoundException;
+ method public static String? getDocumentId(android.net.Uri);
+ method public static String? getTreeDocumentId(android.net.Uri);
+ method public static boolean isDocumentUri(android.content.Context, android.net.Uri?);
+ method public static boolean isTreeUri(android.net.Uri);
+ method public static boolean removeDocument(android.content.ContentResolver, android.net.Uri, android.net.Uri) throws java.io.FileNotFoundException;
+ method public static android.net.Uri? renameDocument(android.content.ContentResolver, android.net.Uri, String) throws java.io.FileNotFoundException;
+ }
+
+ public static final class DocumentsContractCompat.DocumentCompat {
+ field public static final int FLAG_VIRTUAL_DOCUMENT = 512; // 0x200
+ }
+
+ public final class FontRequest {
+ ctor public FontRequest(String, String, String, java.util.List<java.util.List<byte[]!>!>);
+ ctor public FontRequest(String, String, String, @ArrayRes int);
+ method public java.util.List<java.util.List<byte[]!>!>? getCertificates();
+ method @ArrayRes public int getCertificatesArrayResId();
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String! getIdentifier();
+ method public String getProviderAuthority();
+ method public String getProviderPackage();
+ method public String getQuery();
+ }
+
+ public class FontsContractCompat {
+ method public static android.graphics.Typeface? buildTypeface(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontsContractCompat.FontInfo![]);
+ method public static androidx.core.provider.FontsContractCompat.FontFamilyResult fetchFonts(android.content.Context, android.os.CancellationSignal?, androidx.core.provider.FontRequest) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.graphics.Typeface! getFontSync(android.content.Context!, androidx.core.provider.FontRequest!, androidx.core.content.res.ResourcesCompat.FontCallback?, android.os.Handler?, boolean, int, int);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @VisibleForTesting public static android.content.pm.ProviderInfo? getProvider(android.content.pm.PackageManager, androidx.core.provider.FontRequest, android.content.res.Resources?) throws android.content.pm.PackageManager.NameNotFoundException;
+ method @Deprecated @RequiresApi(19) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static java.util.Map<android.net.Uri!,java.nio.ByteBuffer!>! prepareFontData(android.content.Context!, androidx.core.provider.FontsContractCompat.FontInfo![]!, android.os.CancellationSignal!);
+ method public static void requestFont(android.content.Context, androidx.core.provider.FontRequest, androidx.core.provider.FontsContractCompat.FontRequestCallback, android.os.Handler);
+ method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void resetCache();
+ field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String PARCEL_FONT_RESULTS = "font_results";
+ }
+
+ public static final class FontsContractCompat.Columns implements android.provider.BaseColumns {
+ ctor public FontsContractCompat.Columns();
+ field public static final String FILE_ID = "file_id";
+ field public static final String ITALIC = "font_italic";
+ field public static final String RESULT_CODE = "result_code";
+ field public static final int RESULT_CODE_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int RESULT_CODE_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int RESULT_CODE_MALFORMED_QUERY = 3; // 0x3
+ field public static final int RESULT_CODE_OK = 0; // 0x0
+ field public static final String TTC_INDEX = "font_ttc_index";
+ field public static final String VARIATION_SETTINGS = "font_variation_settings";
+ field public static final String WEIGHT = "font_weight";
+ }
+
+ public static class FontsContractCompat.FontFamilyResult {
+ ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontFamilyResult(int, androidx.core.provider.FontsContractCompat.FontInfo![]?);
+ method public androidx.core.provider.FontsContractCompat.FontInfo![]! getFonts();
+ method public int getStatusCode();
+ field public static final int STATUS_OK = 0; // 0x0
+ field public static final int STATUS_UNEXPECTED_DATA_PROVIDED = 2; // 0x2
+ field public static final int STATUS_WRONG_CERTIFICATES = 1; // 0x1
+ }
+
+ public static class FontsContractCompat.FontInfo {
+ ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public FontsContractCompat.FontInfo(android.net.Uri, @IntRange(from=0) int, @IntRange(from=1, to=1000) int, boolean, int);
+ method public int getResultCode();
+ method @IntRange(from=0) public int getTtcIndex();
+ method public android.net.Uri getUri();
+ method @IntRange(from=1, to=1000) public int getWeight();
+ method public boolean isItalic();
+ }
+
+ public static class FontsContractCompat.FontRequestCallback {
+ ctor public FontsContractCompat.FontRequestCallback();
+ method public void onTypefaceRequestFailed(@androidx.core.provider.FontsContractCompat.FontRequestCallback.FontRequestFailReason int);
+ method public void onTypefaceRetrieved(android.graphics.Typeface!);
+ field public static final int FAIL_REASON_FONT_LOAD_ERROR = -3; // 0xfffffffd
+ field public static final int FAIL_REASON_FONT_NOT_FOUND = 1; // 0x1
+ field public static final int FAIL_REASON_FONT_UNAVAILABLE = 2; // 0x2
+ field public static final int FAIL_REASON_MALFORMED_QUERY = 3; // 0x3
+ field public static final int FAIL_REASON_PROVIDER_NOT_FOUND = -1; // 0xffffffff
+ field public static final int FAIL_REASON_SECURITY_VIOLATION = -4; // 0xfffffffc
+ field public static final int FAIL_REASON_WRONG_CERTIFICATES = -2; // 0xfffffffe
+ field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int RESULT_OK = 0; // 0x0
+ }
+
+ @IntDef({androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_PROVIDER_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_LOAD_ERROR, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_NOT_FOUND, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_FONT_UNAVAILABLE, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_MALFORMED_QUERY, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_WRONG_CERTIFICATES, androidx.core.provider.FontsContractCompat.FontRequestCallback.FAIL_REASON_SECURITY_VIOLATION, androidx.core.provider.FontsContractCompat.FontRequestCallback.RESULT_OK}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface FontsContractCompat.FontRequestCallback.FontRequestFailReason {
+ }
+
+ @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SelfDestructiveThread {
+ ctor @Deprecated public SelfDestructiveThread(String!, int, int);
+ method @Deprecated @VisibleForTesting public int getGeneration();
+ method @Deprecated @VisibleForTesting public boolean isRunning();
+ method @Deprecated public <T> void postAndReply(java.util.concurrent.Callable<T!>!, androidx.core.provider.SelfDestructiveThread.ReplyCallback<T!>!);
+ method @Deprecated public <T> T! postAndWait(java.util.concurrent.Callable<T!>!, int) throws java.lang.InterruptedException;
+ }
+
+ @Deprecated public static interface SelfDestructiveThread.ReplyCallback<T> {
+ method @Deprecated public void onReply(T!);
+ }
+
+}
+
+package androidx.core.telephony {
+
+ @RequiresApi(22) public class SubscriptionManagerCompat {
+ method public static int getSlotIndex(int);
+ }
+
+ public class TelephonyManagerCompat {
+ method @RequiresPermission(android.Manifest.permission.READ_PHONE_STATE) public static String? getImei(android.telephony.TelephonyManager);
+ method public static int getSubscriptionId(android.telephony.TelephonyManager);
+ }
+
+}
+
+package androidx.core.telephony.mbms {
+
+ public final class MbmsHelper {
+ method public static CharSequence? getBestNameForService(android.content.Context, android.telephony.mbms.ServiceInfo);
+ }
+
+}
+
+package androidx.core.text {
+
+ public final class BidiFormatter {
+ method public static androidx.core.text.BidiFormatter! getInstance();
+ method public static androidx.core.text.BidiFormatter! getInstance(boolean);
+ method public static androidx.core.text.BidiFormatter! getInstance(java.util.Locale!);
+ method public boolean getStereoReset();
+ method public boolean isRtl(String!);
+ method public boolean isRtl(CharSequence!);
+ method public boolean isRtlContext();
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!, boolean);
+ method public String! unicodeWrap(String!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public CharSequence! unicodeWrap(CharSequence!, androidx.core.text.TextDirectionHeuristicCompat!);
+ method public String! unicodeWrap(String!, boolean);
+ method public CharSequence! unicodeWrap(CharSequence!, boolean);
+ method public String! unicodeWrap(String!);
+ method public CharSequence! unicodeWrap(CharSequence!);
+ }
+
+ public static final class BidiFormatter.Builder {
+ ctor public BidiFormatter.Builder();
+ ctor public BidiFormatter.Builder(boolean);
+ ctor public BidiFormatter.Builder(java.util.Locale!);
+ method public androidx.core.text.BidiFormatter! build();
+ method public androidx.core.text.BidiFormatter.Builder! setTextDirectionHeuristic(androidx.core.text.TextDirectionHeuristicCompat!);
+ method public androidx.core.text.BidiFormatter.Builder! stereoReset(boolean);
+ }
+
+ public final class HtmlCompat {
+ method public static android.text.Spanned fromHtml(String, int);
+ method public static android.text.Spanned fromHtml(String, int, android.text.Html.ImageGetter?, android.text.Html.TagHandler?);
+ method public static String toHtml(android.text.Spanned, int);
+ field public static final int FROM_HTML_MODE_COMPACT = 63; // 0x3f
+ field public static final int FROM_HTML_MODE_LEGACY = 0; // 0x0
+ field public static final int FROM_HTML_OPTION_USE_CSS_COLORS = 256; // 0x100
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_BLOCKQUOTE = 32; // 0x20
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_DIV = 16; // 0x10
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_HEADING = 2; // 0x2
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST = 8; // 0x8
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_LIST_ITEM = 4; // 0x4
+ field public static final int FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH = 1; // 0x1
+ field public static final int TO_HTML_PARAGRAPH_LINES_CONSECUTIVE = 0; // 0x0
+ field public static final int TO_HTML_PARAGRAPH_LINES_INDIVIDUAL = 1; // 0x1
+ }
+
+ public final class ICUCompat {
+ method public static String? maximizeAndGetScript(java.util.Locale!);
+ }
+
+ public class PrecomputedTextCompat implements android.text.Spannable {
+ method public char charAt(int);
+ method public static androidx.core.text.PrecomputedTextCompat! create(CharSequence, androidx.core.text.PrecomputedTextCompat.Params);
+ method @IntRange(from=0) public int getParagraphCount();
+ method @IntRange(from=0) public int getParagraphEnd(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getParagraphStart(@IntRange(from=0) int);
+ method public androidx.core.text.PrecomputedTextCompat.Params getParams();
+ method @RequiresApi(28) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public android.text.PrecomputedText? getPrecomputedText();
+ method public int getSpanEnd(Object!);
+ method public int getSpanFlags(Object!);
+ method public int getSpanStart(Object!);
+ method public <T> T![]! getSpans(int, int, Class<T!>!);
+ method @UiThread public static java.util.concurrent.Future<androidx.core.text.PrecomputedTextCompat!>! getTextFuture(CharSequence, androidx.core.text.PrecomputedTextCompat.Params, java.util.concurrent.Executor?);
+ method public int length();
+ method public int nextSpanTransition(int, int, Class!);
+ method public void removeSpan(Object!);
+ method public void setSpan(Object!, int, int, int);
+ method public CharSequence! subSequence(int, int);
+ }
+
+ public static final class PrecomputedTextCompat.Params {
+ ctor @RequiresApi(28) public PrecomputedTextCompat.Params(android.text.PrecomputedText.Params);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean equalsWithoutTextDirection(androidx.core.text.PrecomputedTextCompat.Params);
+ method @RequiresApi(23) public int getBreakStrategy();
+ method @RequiresApi(23) public int getHyphenationFrequency();
+ method @RequiresApi(18) public android.text.TextDirectionHeuristic? getTextDirection();
+ method public android.text.TextPaint getTextPaint();
+ }
+
+ public static class PrecomputedTextCompat.Params.Builder {
+ ctor public PrecomputedTextCompat.Params.Builder(android.text.TextPaint);
+ method public androidx.core.text.PrecomputedTextCompat.Params build();
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setBreakStrategy(int);
+ method @RequiresApi(23) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setHyphenationFrequency(int);
+ method @RequiresApi(18) public androidx.core.text.PrecomputedTextCompat.Params.Builder! setTextDirection(android.text.TextDirectionHeuristic);
+ }
+
+ public interface TextDirectionHeuristicCompat {
+ method public boolean isRtl(char[]!, int, int);
+ method public boolean isRtl(CharSequence!, int, int);
+ }
+
+ public final class TextDirectionHeuristicsCompat {
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! ANYRTL_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! FIRSTSTRONG_RTL;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LOCALE;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! LTR;
+ field public static final androidx.core.text.TextDirectionHeuristicCompat! RTL;
+ }
+
+ public final class TextUtilsCompat {
+ method public static int getLayoutDirectionFromLocale(java.util.Locale?);
+ method public static String htmlEncode(String);
+ }
+
+}
+
+package androidx.core.text.util {
+
+ public final class LinkifyCompat {
+ method public static boolean addLinks(android.text.Spannable, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+ method public static boolean addLinks(android.widget.TextView, @androidx.core.text.util.LinkifyCompat.LinkifyMask int);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static void addLinks(android.widget.TextView, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ method public static boolean addLinks(android.text.Spannable, java.util.regex.Pattern, String?, String![]?, android.text.util.Linkify.MatchFilter?, android.text.util.Linkify.TransformFilter?);
+ }
+
+ @IntDef(flag=true, value={android.text.util.Linkify.WEB_URLS, android.text.util.Linkify.EMAIL_ADDRESSES, android.text.util.Linkify.PHONE_NUMBERS, android.text.util.Linkify.MAP_ADDRESSES, android.text.util.Linkify.ALL}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface LinkifyCompat.LinkifyMask {
+ }
+
+}
+
+package androidx.core.util {
+
+ public class AtomicFile {
+ ctor public AtomicFile(java.io.File);
+ method public void delete();
+ method public void failWrite(java.io.FileOutputStream?);
+ method public void finishWrite(java.io.FileOutputStream?);
+ method public java.io.File getBaseFile();
+ method public java.io.FileInputStream openRead() throws java.io.FileNotFoundException;
+ method public byte[] readFully() throws java.io.IOException;
+ method public java.io.FileOutputStream startWrite() throws java.io.IOException;
+ }
+
+ public interface Consumer<T> {
+ method public void accept(T!);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DebugUtils {
+ method public static void buildShortClassTag(Object!, StringBuilder!);
+ }
+
+ @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class LogWriter extends java.io.Writer {
+ ctor @Deprecated public LogWriter(String!);
+ method @Deprecated public void close();
+ method @Deprecated public void flush();
+ method @Deprecated public void write(char[]!, int, int);
+ }
+
+ public class ObjectsCompat {
+ method public static boolean equals(Object?, Object?);
+ method public static int hash(java.lang.Object!...);
+ method public static int hashCode(Object?);
+ method public static <T> T requireNonNull(T?);
+ method public static <T> T requireNonNull(T?, String);
+ method public static String? toString(Object?, String?);
+ }
+
+ public class Pair<F, S> {
+ ctor public Pair(F!, S!);
+ method public static <A, B> androidx.core.util.Pair<A!,B!> create(A!, B!);
+ field public final F! first;
+ field public final S! second;
+ }
+
+ public final class PatternsCompat {
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_EMAIL_ADDRESS;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final java.util.regex.Pattern AUTOLINK_WEB_URL;
+ field public static final java.util.regex.Pattern DOMAIN_NAME;
+ field public static final java.util.regex.Pattern EMAIL_ADDRESS;
+ field public static final java.util.regex.Pattern IP_ADDRESS;
+ field public static final java.util.regex.Pattern WEB_URL;
+ }
+
+ public final class Pools {
+ }
+
+ public static interface Pools.Pool<T> {
+ method public T? acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SimplePool<T> implements androidx.core.util.Pools.Pool<T> {
+ ctor public Pools.SimplePool(int);
+ method public T! acquire();
+ method public boolean release(T);
+ }
+
+ public static class Pools.SynchronizedPool<T> extends androidx.core.util.Pools.SimplePool<T> {
+ ctor public Pools.SynchronizedPool(int);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class Preconditions {
+ method public static void checkArgument(boolean);
+ method public static void checkArgument(boolean, Object);
+ method public static void checkArgument(boolean, String, java.lang.Object!...);
+ method public static int checkArgumentInRange(int, int, int, String);
+ method public static long checkArgumentInRange(long, long, long, String);
+ method public static float checkArgumentInRange(float, float, float, String);
+ method public static double checkArgumentInRange(double, double, double, String);
+ method @IntRange(from=0) public static int checkArgumentNonnegative(int, String?);
+ method @IntRange(from=0) public static int checkArgumentNonnegative(int);
+ method public static int checkFlagsArgument(int, int);
+ method public static <T> T checkNotNull(T?);
+ method public static <T> T checkNotNull(T?, Object);
+ method public static void checkState(boolean, String?);
+ method public static void checkState(boolean);
+ method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?);
+ method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, Object);
+ method public static <T extends java.lang.CharSequence> T checkStringNotEmpty(T?, String, java.lang.Object!...);
+ }
+
+ public interface Predicate<T> {
+ method public boolean test(T!);
+ }
+
+ public interface Supplier<T> {
+ method public T! get();
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TimeUtils {
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, StringBuilder!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, java.io.PrintWriter!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static void formatDuration(long, long, java.io.PrintWriter!);
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int HUNDRED_DAY_FIELD_LEN = 19; // 0x13
+ }
+
+}
+
+package androidx.core.view {
+
+ public class AccessibilityDelegateCompat {
+ ctor public AccessibilityDelegateCompat();
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityDelegateCompat(android.view.View.AccessibilityDelegate!);
+ method public boolean dispatchPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public androidx.core.view.accessibility.AccessibilityNodeProviderCompat! getAccessibilityNodeProvider(android.view.View!);
+ method public void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public void onInitializeAccessibilityNodeInfo(android.view.View!, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public boolean performAccessibilityAction(android.view.View!, int, android.os.Bundle!);
+ method public void sendAccessibilityEvent(android.view.View!, int);
+ method public void sendAccessibilityEventUnchecked(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public abstract class ActionProvider {
+ ctor public ActionProvider(android.content.Context!);
+ method public android.content.Context! getContext();
+ method public boolean hasSubMenu();
+ method public boolean isVisible();
+ method public abstract android.view.View! onCreateActionView();
+ method public android.view.View! onCreateActionView(android.view.MenuItem!);
+ method public boolean onPerformDefaultAction();
+ method public void onPrepareSubMenu(android.view.SubMenu!);
+ method public boolean overridesItemVisibility();
+ method public void refreshVisibility();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void reset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setSubUiVisibilityListener(androidx.core.view.ActionProvider.SubUiVisibilityListener!);
+ method public void setVisibilityListener(androidx.core.view.ActionProvider.VisibilityListener!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void subUiVisibilityChanged(boolean);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static interface ActionProvider.SubUiVisibilityListener {
+ method public void onSubUiVisibilityChanged(boolean);
+ }
+
+ public static interface ActionProvider.VisibilityListener {
+ method public void onActionProviderVisibilityChanged(boolean);
+ }
+
+ public final class ContentInfoCompat {
+ method public android.content.ClipData getClip();
+ method public android.os.Bundle? getExtras();
+ method @androidx.core.view.ContentInfoCompat.Flags public int getFlags();
+ method public android.net.Uri? getLinkUri();
+ method @androidx.core.view.ContentInfoCompat.Source public int getSource();
+ method public android.util.Pair<androidx.core.view.ContentInfoCompat!,androidx.core.view.ContentInfoCompat!> partition(androidx.core.util.Predicate<android.content.ClipData.Item!>);
+ method @RequiresApi(31) public static android.util.Pair<android.view.ContentInfo!,android.view.ContentInfo!> partition(android.view.ContentInfo, java.util.function.Predicate<android.content.ClipData.Item!>);
+ method @RequiresApi(31) public android.view.ContentInfo toContentInfo();
+ method @RequiresApi(31) public static androidx.core.view.ContentInfoCompat toContentInfoCompat(android.view.ContentInfo);
+ field public static final int FLAG_CONVERT_TO_PLAIN_TEXT = 1; // 0x1
+ field public static final int SOURCE_APP = 0; // 0x0
+ field public static final int SOURCE_AUTOFILL = 4; // 0x4
+ field public static final int SOURCE_CLIPBOARD = 1; // 0x1
+ field public static final int SOURCE_DRAG_AND_DROP = 3; // 0x3
+ field public static final int SOURCE_INPUT_METHOD = 2; // 0x2
+ field public static final int SOURCE_PROCESS_TEXT = 5; // 0x5
+ }
+
+ public static final class ContentInfoCompat.Builder {
+ ctor public ContentInfoCompat.Builder(androidx.core.view.ContentInfoCompat);
+ ctor public ContentInfoCompat.Builder(android.content.ClipData, @androidx.core.view.ContentInfoCompat.Source int);
+ method public androidx.core.view.ContentInfoCompat build();
+ method public androidx.core.view.ContentInfoCompat.Builder setClip(android.content.ClipData);
+ method public androidx.core.view.ContentInfoCompat.Builder setExtras(android.os.Bundle?);
+ method public androidx.core.view.ContentInfoCompat.Builder setFlags(@androidx.core.view.ContentInfoCompat.Flags int);
+ method public androidx.core.view.ContentInfoCompat.Builder setLinkUri(android.net.Uri?);
+ method public androidx.core.view.ContentInfoCompat.Builder setSource(@androidx.core.view.ContentInfoCompat.Source int);
+ }
+
+ @IntDef(flag=true, value={androidx.core.view.ContentInfoCompat.FLAG_CONVERT_TO_PLAIN_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Flags {
+ }
+
+ @IntDef({androidx.core.view.ContentInfoCompat.SOURCE_APP, androidx.core.view.ContentInfoCompat.SOURCE_CLIPBOARD, androidx.core.view.ContentInfoCompat.SOURCE_INPUT_METHOD, androidx.core.view.ContentInfoCompat.SOURCE_DRAG_AND_DROP, androidx.core.view.ContentInfoCompat.SOURCE_AUTOFILL, androidx.core.view.ContentInfoCompat.SOURCE_PROCESS_TEXT}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ContentInfoCompat.Source {
+ }
+
+ public final class DisplayCompat {
+ method public static androidx.core.view.DisplayCompat.ModeCompat getMode(android.content.Context, android.view.Display);
+ method public static androidx.core.view.DisplayCompat.ModeCompat![] getSupportedModes(android.content.Context, android.view.Display);
+ }
+
+ public static final class DisplayCompat.ModeCompat {
+ method public int getPhysicalHeight();
+ method public int getPhysicalWidth();
+ method @Deprecated public boolean isNative();
+ method @RequiresApi(android.os.Build.VERSION_CODES.M) public android.view.Display.Mode? toMode();
+ }
+
+ public final class DisplayCutoutCompat {
+ ctor public DisplayCutoutCompat(android.graphics.Rect!, java.util.List<android.graphics.Rect!>!);
+ ctor public DisplayCutoutCompat(androidx.core.graphics.Insets, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, android.graphics.Rect?, androidx.core.graphics.Insets);
+ method public java.util.List<android.graphics.Rect!> getBoundingRects();
+ method public int getSafeInsetBottom();
+ method public int getSafeInsetLeft();
+ method public int getSafeInsetRight();
+ method public int getSafeInsetTop();
+ method public androidx.core.graphics.Insets getWaterfallInsets();
+ }
+
+ public final class DragAndDropPermissionsCompat {
+ method public void release();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static androidx.core.view.DragAndDropPermissionsCompat? request(android.app.Activity!, android.view.DragEvent!);
+ }
+
+ public class DragStartHelper {
+ ctor public DragStartHelper(android.view.View!, androidx.core.view.DragStartHelper.OnDragStartListener!);
+ method public void attach();
+ method public void detach();
+ method public void getTouchPosition(android.graphics.Point!);
+ method public boolean onLongClick(android.view.View!);
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ }
+
+ public static interface DragStartHelper.OnDragStartListener {
+ method public boolean onDragStart(android.view.View!, androidx.core.view.DragStartHelper!);
+ }
+
+ public final class GestureDetectorCompat {
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!);
+ ctor public GestureDetectorCompat(android.content.Context!, android.view.GestureDetector.OnGestureListener!, android.os.Handler!);
+ method public boolean isLongpressEnabled();
+ method public boolean onTouchEvent(android.view.MotionEvent!);
+ method public void setIsLongpressEnabled(boolean);
+ method public void setOnDoubleTapListener(android.view.GestureDetector.OnDoubleTapListener!);
+ }
+
+ public final class GravityCompat {
+ method public static void apply(int, int, int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static void apply(int, int, int, android.graphics.Rect!, int, int, android.graphics.Rect!, int);
+ method public static void applyDisplay(int, android.graphics.Rect!, android.graphics.Rect!, int);
+ method public static int getAbsoluteGravity(int, int);
+ field public static final int END = 8388613; // 0x800005
+ field public static final int RELATIVE_HORIZONTAL_GRAVITY_MASK = 8388615; // 0x800007
+ field public static final int RELATIVE_LAYOUT_DIRECTION = 8388608; // 0x800000
+ field public static final int START = 8388611; // 0x800003
+ }
+
+ public final class InputDeviceCompat {
+ field public static final int SOURCE_ANY = -256; // 0xffffff00
+ field public static final int SOURCE_CLASS_BUTTON = 1; // 0x1
+ field public static final int SOURCE_CLASS_JOYSTICK = 16; // 0x10
+ field public static final int SOURCE_CLASS_MASK = 255; // 0xff
+ field public static final int SOURCE_CLASS_NONE = 0; // 0x0
+ field public static final int SOURCE_CLASS_POINTER = 2; // 0x2
+ field public static final int SOURCE_CLASS_POSITION = 8; // 0x8
+ field public static final int SOURCE_CLASS_TRACKBALL = 4; // 0x4
+ field public static final int SOURCE_DPAD = 513; // 0x201
+ field public static final int SOURCE_GAMEPAD = 1025; // 0x401
+ field public static final int SOURCE_HDMI = 33554433; // 0x2000001
+ field public static final int SOURCE_JOYSTICK = 16777232; // 0x1000010
+ field public static final int SOURCE_KEYBOARD = 257; // 0x101
+ field public static final int SOURCE_MOUSE = 8194; // 0x2002
+ field public static final int SOURCE_ROTARY_ENCODER = 4194304; // 0x400000
+ field public static final int SOURCE_STYLUS = 16386; // 0x4002
+ field public static final int SOURCE_TOUCHPAD = 1048584; // 0x100008
+ field public static final int SOURCE_TOUCHSCREEN = 4098; // 0x1002
+ field public static final int SOURCE_TOUCH_NAVIGATION = 2097152; // 0x200000
+ field public static final int SOURCE_TRACKBALL = 65540; // 0x10004
+ field public static final int SOURCE_UNKNOWN = 0; // 0x0
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class KeyEventDispatcher {
+ method public static boolean dispatchBeforeHierarchy(android.view.View, android.view.KeyEvent);
+ method public static boolean dispatchKeyEvent(androidx.core.view.KeyEventDispatcher.Component, android.view.View?, android.view.Window.Callback?, android.view.KeyEvent);
+ }
+
+ public static interface KeyEventDispatcher.Component {
+ method public boolean superDispatchKeyEvent(android.view.KeyEvent!);
+ }
+
+ public final class LayoutInflaterCompat {
+ method @Deprecated public static androidx.core.view.LayoutInflaterFactory! getFactory(android.view.LayoutInflater!);
+ method @Deprecated public static void setFactory(android.view.LayoutInflater, androidx.core.view.LayoutInflaterFactory);
+ method public static void setFactory2(android.view.LayoutInflater, android.view.LayoutInflater.Factory2);
+ }
+
+ @Deprecated public interface LayoutInflaterFactory {
+ method @Deprecated public android.view.View! onCreateView(android.view.View!, String!, android.content.Context!, android.util.AttributeSet!);
+ }
+
+ public final class MarginLayoutParamsCompat {
+ method public static int getLayoutDirection(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginEnd(android.view.ViewGroup.MarginLayoutParams!);
+ method public static int getMarginStart(android.view.ViewGroup.MarginLayoutParams!);
+ method public static boolean isMarginRelative(android.view.ViewGroup.MarginLayoutParams!);
+ method public static void resolveLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setLayoutDirection(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginEnd(android.view.ViewGroup.MarginLayoutParams!, int);
+ method public static void setMarginStart(android.view.ViewGroup.MarginLayoutParams!, int);
+ }
+
+ public final class MenuCompat {
+ method public static void setGroupDividerEnabled(android.view.Menu!, boolean);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ }
+
+ public interface MenuHost {
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void invalidateMenu();
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ }
+
+ public class MenuHostHelper {
+ ctor public MenuHostHelper(Runnable);
+ method public void addMenuProvider(androidx.core.view.MenuProvider);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner);
+ method public void addMenuProvider(androidx.core.view.MenuProvider, androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.State);
+ method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+ method public boolean onMenuItemSelected(android.view.MenuItem);
+ method public void removeMenuProvider(androidx.core.view.MenuProvider);
+ }
+
+ public final class MenuItemCompat {
+ method @Deprecated public static boolean collapseActionView(android.view.MenuItem!);
+ method @Deprecated public static boolean expandActionView(android.view.MenuItem!);
+ method public static androidx.core.view.ActionProvider! getActionProvider(android.view.MenuItem!);
+ method @Deprecated public static android.view.View! getActionView(android.view.MenuItem!);
+ method public static int getAlphabeticModifiers(android.view.MenuItem!);
+ method public static CharSequence! getContentDescription(android.view.MenuItem!);
+ method public static android.content.res.ColorStateList! getIconTintList(android.view.MenuItem!);
+ method public static android.graphics.PorterDuff.Mode! getIconTintMode(android.view.MenuItem!);
+ method public static int getNumericModifiers(android.view.MenuItem!);
+ method public static CharSequence! getTooltipText(android.view.MenuItem!);
+ method @Deprecated public static boolean isActionViewExpanded(android.view.MenuItem!);
+ method public static android.view.MenuItem! setActionProvider(android.view.MenuItem!, androidx.core.view.ActionProvider!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, android.view.View!);
+ method @Deprecated public static android.view.MenuItem! setActionView(android.view.MenuItem!, int);
+ method public static void setAlphabeticShortcut(android.view.MenuItem!, char, int);
+ method public static void setContentDescription(android.view.MenuItem!, CharSequence!);
+ method public static void setIconTintList(android.view.MenuItem!, android.content.res.ColorStateList!);
+ method public static void setIconTintMode(android.view.MenuItem!, android.graphics.PorterDuff.Mode!);
+ method public static void setNumericShortcut(android.view.MenuItem!, char, int);
+ method @Deprecated public static android.view.MenuItem! setOnActionExpandListener(android.view.MenuItem!, androidx.core.view.MenuItemCompat.OnActionExpandListener!);
+ method public static void setShortcut(android.view.MenuItem!, char, char, int, int);
+ method @Deprecated public static void setShowAsAction(android.view.MenuItem!, int);
+ method public static void setTooltipText(android.view.MenuItem!, CharSequence!);
+ field @Deprecated public static final int SHOW_AS_ACTION_ALWAYS = 2; // 0x2
+ field @Deprecated public static final int SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW = 8; // 0x8
+ field @Deprecated public static final int SHOW_AS_ACTION_IF_ROOM = 1; // 0x1
+ field @Deprecated public static final int SHOW_AS_ACTION_NEVER = 0; // 0x0
+ field @Deprecated public static final int SHOW_AS_ACTION_WITH_TEXT = 4; // 0x4
+ }
+
+ @Deprecated public static interface MenuItemCompat.OnActionExpandListener {
+ method @Deprecated public boolean onMenuItemActionCollapse(android.view.MenuItem!);
+ method @Deprecated public boolean onMenuItemActionExpand(android.view.MenuItem!);
+ }
+
+ public interface MenuProvider {
+ method public void onCreateMenu(android.view.Menu, android.view.MenuInflater);
+ method public boolean onMenuItemSelected(android.view.MenuItem);
+ }
+
+ public final class MotionEventCompat {
+ method @Deprecated public static int findPointerIndex(android.view.MotionEvent!, int);
+ method @Deprecated public static int getActionIndex(android.view.MotionEvent!);
+ method @Deprecated public static int getActionMasked(android.view.MotionEvent!);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int);
+ method @Deprecated public static float getAxisValue(android.view.MotionEvent!, int, int);
+ method @Deprecated public static int getButtonState(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerCount(android.view.MotionEvent!);
+ method @Deprecated public static int getPointerId(android.view.MotionEvent!, int);
+ method @Deprecated public static int getSource(android.view.MotionEvent!);
+ method @Deprecated public static float getX(android.view.MotionEvent!, int);
+ method @Deprecated public static float getY(android.view.MotionEvent!, int);
+ method public static boolean isFromSource(android.view.MotionEvent!, int);
+ field @Deprecated public static final int ACTION_HOVER_ENTER = 9; // 0x9
+ field @Deprecated public static final int ACTION_HOVER_EXIT = 10; // 0xa
+ field @Deprecated public static final int ACTION_HOVER_MOVE = 7; // 0x7
+ field @Deprecated public static final int ACTION_MASK = 255; // 0xff
+ field @Deprecated public static final int ACTION_POINTER_DOWN = 5; // 0x5
+ field @Deprecated public static final int ACTION_POINTER_INDEX_MASK = 65280; // 0xff00
+ field @Deprecated public static final int ACTION_POINTER_INDEX_SHIFT = 8; // 0x8
+ field @Deprecated public static final int ACTION_POINTER_UP = 6; // 0x6
+ field @Deprecated public static final int ACTION_SCROLL = 8; // 0x8
+ field @Deprecated public static final int AXIS_BRAKE = 23; // 0x17
+ field @Deprecated public static final int AXIS_DISTANCE = 24; // 0x18
+ field @Deprecated public static final int AXIS_GAS = 22; // 0x16
+ field @Deprecated public static final int AXIS_GENERIC_1 = 32; // 0x20
+ field @Deprecated public static final int AXIS_GENERIC_10 = 41; // 0x29
+ field @Deprecated public static final int AXIS_GENERIC_11 = 42; // 0x2a
+ field @Deprecated public static final int AXIS_GENERIC_12 = 43; // 0x2b
+ field @Deprecated public static final int AXIS_GENERIC_13 = 44; // 0x2c
+ field @Deprecated public static final int AXIS_GENERIC_14 = 45; // 0x2d
+ field @Deprecated public static final int AXIS_GENERIC_15 = 46; // 0x2e
+ field @Deprecated public static final int AXIS_GENERIC_16 = 47; // 0x2f
+ field @Deprecated public static final int AXIS_GENERIC_2 = 33; // 0x21
+ field @Deprecated public static final int AXIS_GENERIC_3 = 34; // 0x22
+ field @Deprecated public static final int AXIS_GENERIC_4 = 35; // 0x23
+ field @Deprecated public static final int AXIS_GENERIC_5 = 36; // 0x24
+ field @Deprecated public static final int AXIS_GENERIC_6 = 37; // 0x25
+ field @Deprecated public static final int AXIS_GENERIC_7 = 38; // 0x26
+ field @Deprecated public static final int AXIS_GENERIC_8 = 39; // 0x27
+ field @Deprecated public static final int AXIS_GENERIC_9 = 40; // 0x28
+ field @Deprecated public static final int AXIS_HAT_X = 15; // 0xf
+ field @Deprecated public static final int AXIS_HAT_Y = 16; // 0x10
+ field @Deprecated public static final int AXIS_HSCROLL = 10; // 0xa
+ field @Deprecated public static final int AXIS_LTRIGGER = 17; // 0x11
+ field @Deprecated public static final int AXIS_ORIENTATION = 8; // 0x8
+ field @Deprecated public static final int AXIS_PRESSURE = 2; // 0x2
+ field public static final int AXIS_RELATIVE_X = 27; // 0x1b
+ field public static final int AXIS_RELATIVE_Y = 28; // 0x1c
+ field @Deprecated public static final int AXIS_RTRIGGER = 18; // 0x12
+ field @Deprecated public static final int AXIS_RUDDER = 20; // 0x14
+ field @Deprecated public static final int AXIS_RX = 12; // 0xc
+ field @Deprecated public static final int AXIS_RY = 13; // 0xd
+ field @Deprecated public static final int AXIS_RZ = 14; // 0xe
+ field public static final int AXIS_SCROLL = 26; // 0x1a
+ field @Deprecated public static final int AXIS_SIZE = 3; // 0x3
+ field @Deprecated public static final int AXIS_THROTTLE = 19; // 0x13
+ field @Deprecated public static final int AXIS_TILT = 25; // 0x19
+ field @Deprecated public static final int AXIS_TOOL_MAJOR = 6; // 0x6
+ field @Deprecated public static final int AXIS_TOOL_MINOR = 7; // 0x7
+ field @Deprecated public static final int AXIS_TOUCH_MAJOR = 4; // 0x4
+ field @Deprecated public static final int AXIS_TOUCH_MINOR = 5; // 0x5
+ field @Deprecated public static final int AXIS_VSCROLL = 9; // 0x9
+ field @Deprecated public static final int AXIS_WHEEL = 21; // 0x15
+ field @Deprecated public static final int AXIS_X = 0; // 0x0
+ field @Deprecated public static final int AXIS_Y = 1; // 0x1
+ field @Deprecated public static final int AXIS_Z = 11; // 0xb
+ field @Deprecated public static final int BUTTON_PRIMARY = 1; // 0x1
+ }
+
+ public interface NestedScrollingChild {
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean isNestedScrollingEnabled();
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+ method public void stopNestedScroll();
+ }
+
+ public interface NestedScrollingChild2 extends androidx.core.view.NestedScrollingChild {
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+ method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+ }
+
+ public interface NestedScrollingChild3 extends androidx.core.view.NestedScrollingChild2 {
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+ }
+
+ public class NestedScrollingChildHelper {
+ ctor public NestedScrollingChildHelper(android.view.View);
+ method public boolean dispatchNestedFling(float, float, boolean);
+ method public boolean dispatchNestedPreFling(float, float);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?);
+ method public boolean dispatchNestedPreScroll(int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]?);
+ method public boolean hasNestedScrollingParent();
+ method public boolean hasNestedScrollingParent(@androidx.core.view.ViewCompat.NestedScrollType int);
+ method public boolean isNestedScrollingEnabled();
+ method public void onDetachedFromWindow();
+ method public void onStopNestedScroll(android.view.View);
+ method public void setNestedScrollingEnabled(boolean);
+ method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int);
+ method public boolean startNestedScroll(@androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void stopNestedScroll();
+ method public void stopNestedScroll(@androidx.core.view.ViewCompat.NestedScrollType int);
+ }
+
+ public interface NestedScrollingParent {
+ method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+ method public boolean onNestedFling(android.view.View, float, float, boolean);
+ method public boolean onNestedPreFling(android.view.View, float, float);
+ method public void onNestedPreScroll(android.view.View, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+ method public void onStopNestedScroll(android.view.View);
+ }
+
+ public interface NestedScrollingParent2 extends androidx.core.view.NestedScrollingParent {
+ method public void onNestedPreScroll(android.view.View, int, int, int[], @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+ }
+
+ public interface NestedScrollingParent3 extends androidx.core.view.NestedScrollingParent2 {
+ method public void onNestedScroll(android.view.View, int, int, int, int, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+ }
+
+ public class NestedScrollingParentHelper {
+ ctor public NestedScrollingParentHelper(android.view.ViewGroup);
+ method @androidx.core.view.ViewCompat.ScrollAxis public int getNestedScrollAxes();
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public void onStopNestedScroll(android.view.View);
+ method public void onStopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+ }
+
+ public interface OnApplyWindowInsetsListener {
+ method public androidx.core.view.WindowInsetsCompat! onApplyWindowInsets(android.view.View!, androidx.core.view.WindowInsetsCompat!);
+ }
+
+ public interface OnReceiveContentListener {
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ }
+
+ public interface OnReceiveContentViewBehavior {
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(androidx.core.view.ContentInfoCompat);
+ }
+
+ public final class OneShotPreDrawListener implements android.view.View.OnAttachStateChangeListener android.view.ViewTreeObserver.OnPreDrawListener {
+ method public static androidx.core.view.OneShotPreDrawListener add(android.view.View, Runnable);
+ method public boolean onPreDraw();
+ method public void onViewAttachedToWindow(android.view.View!);
+ method public void onViewDetachedFromWindow(android.view.View!);
+ method public void removeListener();
+ }
+
+ public final class PointerIconCompat {
+ method public static androidx.core.view.PointerIconCompat! create(android.graphics.Bitmap!, float, float);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public Object! getPointerIcon();
+ method public static androidx.core.view.PointerIconCompat! getSystemIcon(android.content.Context!, int);
+ method public static androidx.core.view.PointerIconCompat! load(android.content.res.Resources!, int);
+ field public static final int TYPE_ALIAS = 1010; // 0x3f2
+ field public static final int TYPE_ALL_SCROLL = 1013; // 0x3f5
+ field public static final int TYPE_ARROW = 1000; // 0x3e8
+ field public static final int TYPE_CELL = 1006; // 0x3ee
+ field public static final int TYPE_CONTEXT_MENU = 1001; // 0x3e9
+ field public static final int TYPE_COPY = 1011; // 0x3f3
+ field public static final int TYPE_CROSSHAIR = 1007; // 0x3ef
+ field public static final int TYPE_DEFAULT = 1000; // 0x3e8
+ field public static final int TYPE_GRAB = 1020; // 0x3fc
+ field public static final int TYPE_GRABBING = 1021; // 0x3fd
+ field public static final int TYPE_HAND = 1002; // 0x3ea
+ field public static final int TYPE_HELP = 1003; // 0x3eb
+ field public static final int TYPE_HORIZONTAL_DOUBLE_ARROW = 1014; // 0x3f6
+ field public static final int TYPE_NO_DROP = 1012; // 0x3f4
+ field public static final int TYPE_NULL = 0; // 0x0
+ field public static final int TYPE_TEXT = 1008; // 0x3f0
+ field public static final int TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW = 1017; // 0x3f9
+ field public static final int TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW = 1016; // 0x3f8
+ field public static final int TYPE_VERTICAL_DOUBLE_ARROW = 1015; // 0x3f7
+ field public static final int TYPE_VERTICAL_TEXT = 1009; // 0x3f1
+ field public static final int TYPE_WAIT = 1004; // 0x3ec
+ field public static final int TYPE_ZOOM_IN = 1018; // 0x3fa
+ field public static final int TYPE_ZOOM_OUT = 1019; // 0x3fb
+ }
+
+ public final class ScaleGestureDetectorCompat {
+ method @Deprecated public static boolean isQuickScaleEnabled(Object!);
+ method public static boolean isQuickScaleEnabled(android.view.ScaleGestureDetector!);
+ method @Deprecated public static void setQuickScaleEnabled(Object!, boolean);
+ method public static void setQuickScaleEnabled(android.view.ScaleGestureDetector!, boolean);
+ }
+
+ public interface ScrollingView {
+ method public int computeHorizontalScrollExtent();
+ method public int computeHorizontalScrollOffset();
+ method public int computeHorizontalScrollRange();
+ method public int computeVerticalScrollExtent();
+ method public int computeVerticalScrollOffset();
+ method public int computeVerticalScrollRange();
+ }
+
+ public interface TintableBackgroundView {
+ method public android.content.res.ColorStateList? getSupportBackgroundTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportBackgroundTintMode();
+ method public void setSupportBackgroundTintList(android.content.res.ColorStateList?);
+ method public void setSupportBackgroundTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @Deprecated public final class VelocityTrackerCompat {
+ method @Deprecated public static float getXVelocity(android.view.VelocityTracker!, int);
+ method @Deprecated public static float getYVelocity(android.view.VelocityTracker!, int);
+ }
+
+ public class ViewCompat {
+ ctor @Deprecated protected ViewCompat();
+ method public static int addAccessibilityAction(android.view.View, CharSequence, androidx.core.view.accessibility.AccessibilityViewCommand);
+ method public static void addKeyboardNavigationClusters(android.view.View, java.util.Collection<android.view.View!>, int);
+ method public static void addOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static androidx.core.view.ViewPropertyAnimatorCompat animate(android.view.View);
+ method @Deprecated public static boolean canScrollHorizontally(android.view.View!, int);
+ method @Deprecated public static boolean canScrollVertically(android.view.View!, int);
+ method public static void cancelDragAndDrop(android.view.View);
+ method @Deprecated public static int combineMeasuredStates(int, int);
+ method public static androidx.core.view.WindowInsetsCompat computeSystemWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat, android.graphics.Rect);
+ method public static androidx.core.view.WindowInsetsCompat dispatchApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+ method public static void dispatchFinishTemporaryDetach(android.view.View);
+ method public static boolean dispatchNestedFling(android.view.View, float, float, boolean);
+ method public static boolean dispatchNestedPreFling(android.view.View, float, float);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?);
+ method public static boolean dispatchNestedPreScroll(android.view.View, int, int, int[]?, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?);
+ method public static void dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int, int[]);
+ method public static boolean dispatchNestedScroll(android.view.View, int, int, int, int, int[]?, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public static void dispatchStartTemporaryDetach(android.view.View);
+ method public static void enableAccessibleClickableSpanSupport(android.view.View);
+ method public static int generateViewId();
+ method public static androidx.core.view.AccessibilityDelegateCompat? getAccessibilityDelegate(android.view.View);
+ method public static int getAccessibilityLiveRegion(android.view.View);
+ method public static androidx.core.view.accessibility.AccessibilityNodeProviderCompat? getAccessibilityNodeProvider(android.view.View);
+ method @UiThread public static CharSequence? getAccessibilityPaneTitle(android.view.View);
+ method @Deprecated public static float getAlpha(android.view.View!);
+ method public static android.content.res.ColorStateList? getBackgroundTintList(android.view.View);
+ method public static android.graphics.PorterDuff.Mode? getBackgroundTintMode(android.view.View);
+ method public static android.graphics.Rect? getClipBounds(android.view.View);
+ method public static android.view.Display? getDisplay(android.view.View);
+ method public static float getElevation(android.view.View);
+ method public static boolean getFitsSystemWindows(android.view.View);
+ method public static int getImportantForAccessibility(android.view.View);
+ method public static int getImportantForAutofill(android.view.View);
+ method public static int getLabelFor(android.view.View);
+ method @Deprecated public static int getLayerType(android.view.View!);
+ method public static int getLayoutDirection(android.view.View);
+ method @Deprecated public static android.graphics.Matrix? getMatrix(android.view.View!);
+ method @Deprecated public static int getMeasuredHeightAndState(android.view.View!);
+ method @Deprecated public static int getMeasuredState(android.view.View!);
+ method @Deprecated public static int getMeasuredWidthAndState(android.view.View!);
+ method public static int getMinimumHeight(android.view.View);
+ method public static int getMinimumWidth(android.view.View);
+ method public static int getNextClusterForwardId(android.view.View);
+ method public static String![]? getOnReceiveContentMimeTypes(android.view.View);
+ method @Deprecated public static int getOverScrollMode(android.view.View!);
+ method @Px public static int getPaddingEnd(android.view.View);
+ method @Px public static int getPaddingStart(android.view.View);
+ method public static android.view.ViewParent? getParentForAccessibility(android.view.View);
+ method @Deprecated public static float getPivotX(android.view.View!);
+ method @Deprecated public static float getPivotY(android.view.View!);
+ method public static androidx.core.view.WindowInsetsCompat? getRootWindowInsets(android.view.View);
+ method @Deprecated public static float getRotation(android.view.View!);
+ method @Deprecated public static float getRotationX(android.view.View!);
+ method @Deprecated public static float getRotationY(android.view.View!);
+ method @Deprecated public static float getScaleX(android.view.View!);
+ method @Deprecated public static float getScaleY(android.view.View!);
+ method public static int getScrollIndicators(android.view.View);
+ method @UiThread public static CharSequence? getStateDescription(android.view.View);
+ method public static java.util.List<android.graphics.Rect!> getSystemGestureExclusionRects(android.view.View);
+ method public static String? getTransitionName(android.view.View);
+ method @Deprecated public static float getTranslationX(android.view.View!);
+ method @Deprecated public static float getTranslationY(android.view.View!);
+ method public static float getTranslationZ(android.view.View);
+ method public static androidx.core.view.WindowInsetsControllerCompat? getWindowInsetsController(android.view.View);
+ method @Deprecated public static int getWindowSystemUiVisibility(android.view.View);
+ method @Deprecated public static float getX(android.view.View!);
+ method @Deprecated public static float getY(android.view.View!);
+ method public static float getZ(android.view.View);
+ method public static boolean hasAccessibilityDelegate(android.view.View);
+ method public static boolean hasExplicitFocusable(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View);
+ method public static boolean hasNestedScrollingParent(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public static boolean hasOnClickListeners(android.view.View);
+ method public static boolean hasOverlappingRendering(android.view.View);
+ method public static boolean hasTransientState(android.view.View);
+ method @UiThread public static boolean isAccessibilityHeading(android.view.View);
+ method public static boolean isAttachedToWindow(android.view.View);
+ method public static boolean isFocusedByDefault(android.view.View);
+ method public static boolean isImportantForAccessibility(android.view.View);
+ method public static boolean isImportantForAutofill(android.view.View);
+ method public static boolean isInLayout(android.view.View);
+ method public static boolean isKeyboardNavigationCluster(android.view.View);
+ method public static boolean isLaidOut(android.view.View);
+ method public static boolean isLayoutDirectionResolved(android.view.View);
+ method public static boolean isNestedScrollingEnabled(android.view.View);
+ method @Deprecated public static boolean isOpaque(android.view.View!);
+ method public static boolean isPaddingRelative(android.view.View);
+ method @UiThread public static boolean isScreenReaderFocusable(android.view.View);
+ method @Deprecated public static void jumpDrawablesToCurrentState(android.view.View!);
+ method public static android.view.View? keyboardNavigationClusterSearch(android.view.View, android.view.View?, @androidx.core.view.ViewCompat.FocusDirection int);
+ method public static void offsetLeftAndRight(android.view.View, int);
+ method public static void offsetTopAndBottom(android.view.View, int);
+ method public static androidx.core.view.WindowInsetsCompat onApplyWindowInsets(android.view.View, androidx.core.view.WindowInsetsCompat);
+ method @Deprecated public static void onInitializeAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void onInitializeAccessibilityNodeInfo(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat);
+ method @Deprecated public static void onPopulateAccessibilityEvent(android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static boolean performAccessibilityAction(android.view.View, int, android.os.Bundle?);
+ method public static androidx.core.view.ContentInfoCompat? performReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ method public static void postInvalidateOnAnimation(android.view.View);
+ method public static void postInvalidateOnAnimation(android.view.View, int, int, int, int);
+ method public static void postOnAnimation(android.view.View, Runnable);
+ method public static void postOnAnimationDelayed(android.view.View, Runnable, long);
+ method public static void removeAccessibilityAction(android.view.View, int);
+ method public static void removeOnUnhandledKeyEventListener(android.view.View, androidx.core.view.ViewCompat.OnUnhandledKeyEventListenerCompat);
+ method public static void replaceAccessibilityAction(android.view.View, androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat, CharSequence?, androidx.core.view.accessibility.AccessibilityViewCommand?);
+ method public static void requestApplyInsets(android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.View, @IdRes int);
+ method @Deprecated public static int resolveSizeAndState(int, int, int);
+ method public static boolean restoreDefaultFocus(android.view.View);
+ method public static void saveAttributeDataForStyleable(android.view.View, android.content.Context, int[], android.util.AttributeSet?, android.content.res.TypedArray, int, int);
+ method public static void setAccessibilityDelegate(android.view.View, androidx.core.view.AccessibilityDelegateCompat?);
+ method @UiThread public static void setAccessibilityHeading(android.view.View, boolean);
+ method public static void setAccessibilityLiveRegion(android.view.View, int);
+ method @UiThread public static void setAccessibilityPaneTitle(android.view.View, CharSequence?);
+ method @Deprecated public static void setActivated(android.view.View!, boolean);
+ method @Deprecated public static void setAlpha(android.view.View!, @FloatRange(from=0.0, to=1.0) float);
+ method public static void setAutofillHints(android.view.View, java.lang.String!...);
+ method public static void setBackground(android.view.View, android.graphics.drawable.Drawable?);
+ method public static void setBackgroundTintList(android.view.View, android.content.res.ColorStateList?);
+ method public static void setBackgroundTintMode(android.view.View, android.graphics.PorterDuff.Mode?);
+ method @Deprecated public static void setChildrenDrawingOrderEnabled(android.view.ViewGroup!, boolean);
+ method public static void setClipBounds(android.view.View, android.graphics.Rect?);
+ method public static void setElevation(android.view.View, float);
+ method @Deprecated public static void setFitsSystemWindows(android.view.View!, boolean);
+ method public static void setFocusedByDefault(android.view.View, boolean);
+ method public static void setHasTransientState(android.view.View, boolean);
+ method @UiThread public static void setImportantForAccessibility(android.view.View, int);
+ method public static void setImportantForAutofill(android.view.View, int);
+ method public static void setKeyboardNavigationCluster(android.view.View, boolean);
+ method public static void setLabelFor(android.view.View, @IdRes int);
+ method public static void setLayerPaint(android.view.View, android.graphics.Paint?);
+ method @Deprecated public static void setLayerType(android.view.View!, int, android.graphics.Paint!);
+ method public static void setLayoutDirection(android.view.View, int);
+ method public static void setNestedScrollingEnabled(android.view.View, boolean);
+ method public static void setNextClusterForwardId(android.view.View, int);
+ method public static void setOnApplyWindowInsetsListener(android.view.View, androidx.core.view.OnApplyWindowInsetsListener?);
+ method public static void setOnReceiveContentListener(android.view.View, String![]?, androidx.core.view.OnReceiveContentListener?);
+ method @Deprecated public static void setOverScrollMode(android.view.View!, int);
+ method public static void setPaddingRelative(android.view.View, @Px int, @Px int, @Px int, @Px int);
+ method @Deprecated public static void setPivotX(android.view.View!, float);
+ method @Deprecated public static void setPivotY(android.view.View!, float);
+ method public static void setPointerIcon(android.view.View, androidx.core.view.PointerIconCompat?);
+ method @Deprecated public static void setRotation(android.view.View!, float);
+ method @Deprecated public static void setRotationX(android.view.View!, float);
+ method @Deprecated public static void setRotationY(android.view.View!, float);
+ method @Deprecated public static void setSaveFromParentEnabled(android.view.View!, boolean);
+ method @Deprecated public static void setScaleX(android.view.View!, float);
+ method @Deprecated public static void setScaleY(android.view.View!, float);
+ method @UiThread public static void setScreenReaderFocusable(android.view.View, boolean);
+ method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int);
+ method public static void setScrollIndicators(android.view.View, @androidx.core.view.ViewCompat.ScrollIndicators int, @androidx.core.view.ViewCompat.ScrollIndicators int);
+ method @UiThread public static void setStateDescription(android.view.View, CharSequence?);
+ method public static void setSystemGestureExclusionRects(android.view.View, java.util.List<android.graphics.Rect!>);
+ method public static void setTooltipText(android.view.View, CharSequence?);
+ method public static void setTransitionName(android.view.View, String?);
+ method @Deprecated public static void setTranslationX(android.view.View!, float);
+ method @Deprecated public static void setTranslationY(android.view.View!, float);
+ method public static void setTranslationZ(android.view.View, float);
+ method public static void setWindowInsetsAnimationCallback(android.view.View, androidx.core.view.WindowInsetsAnimationCompat.Callback?);
+ method @Deprecated public static void setX(android.view.View!, float);
+ method @Deprecated public static void setY(android.view.View!, float);
+ method public static void setZ(android.view.View, float);
+ method public static boolean startDragAndDrop(android.view.View, android.content.ClipData?, android.view.View.DragShadowBuilder, Object?, int);
+ method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int);
+ method public static boolean startNestedScroll(android.view.View, @androidx.core.view.ViewCompat.ScrollAxis int, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public static void stopNestedScroll(android.view.View);
+ method public static void stopNestedScroll(android.view.View, @androidx.core.view.ViewCompat.NestedScrollType int);
+ method public static void updateDragShadow(android.view.View, android.view.View.DragShadowBuilder);
+ field public static final int ACCESSIBILITY_LIVE_REGION_ASSERTIVE = 2; // 0x2
+ field public static final int ACCESSIBILITY_LIVE_REGION_NONE = 0; // 0x0
+ field public static final int ACCESSIBILITY_LIVE_REGION_POLITE = 1; // 0x1
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_AUTO = 0; // 0x0
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO = 2; // 0x2
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_NO_HIDE_DESCENDANTS = 4; // 0x4
+ field public static final int IMPORTANT_FOR_ACCESSIBILITY_YES = 1; // 0x1
+ field @Deprecated public static final int LAYER_TYPE_HARDWARE = 2; // 0x2
+ field @Deprecated public static final int LAYER_TYPE_NONE = 0; // 0x0
+ field @Deprecated public static final int LAYER_TYPE_SOFTWARE = 1; // 0x1
+ field public static final int LAYOUT_DIRECTION_INHERIT = 2; // 0x2
+ field public static final int LAYOUT_DIRECTION_LOCALE = 3; // 0x3
+ field public static final int LAYOUT_DIRECTION_LTR = 0; // 0x0
+ field public static final int LAYOUT_DIRECTION_RTL = 1; // 0x1
+ field @Deprecated public static final int MEASURED_HEIGHT_STATE_SHIFT = 16; // 0x10
+ field @Deprecated public static final int MEASURED_SIZE_MASK = 16777215; // 0xffffff
+ field @Deprecated public static final int MEASURED_STATE_MASK = -16777216; // 0xff000000
+ field @Deprecated public static final int MEASURED_STATE_TOO_SMALL = 16777216; // 0x1000000
+ field @Deprecated public static final int OVER_SCROLL_ALWAYS = 0; // 0x0
+ field @Deprecated public static final int OVER_SCROLL_IF_CONTENT_SCROLLS = 1; // 0x1
+ field @Deprecated public static final int OVER_SCROLL_NEVER = 2; // 0x2
+ field public static final int SCROLL_AXIS_HORIZONTAL = 1; // 0x1
+ field public static final int SCROLL_AXIS_NONE = 0; // 0x0
+ field public static final int SCROLL_AXIS_VERTICAL = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_BOTTOM = 2; // 0x2
+ field public static final int SCROLL_INDICATOR_END = 32; // 0x20
+ field public static final int SCROLL_INDICATOR_LEFT = 4; // 0x4
+ field public static final int SCROLL_INDICATOR_RIGHT = 8; // 0x8
+ field public static final int SCROLL_INDICATOR_START = 16; // 0x10
+ field public static final int SCROLL_INDICATOR_TOP = 1; // 0x1
+ field public static final int TYPE_NON_TOUCH = 1; // 0x1
+ field public static final int TYPE_TOUCH = 0; // 0x0
+ }
+
+ @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN, android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusDirection {
+ }
+
+ @IntDef({android.view.View.FOCUS_LEFT, android.view.View.FOCUS_UP, android.view.View.FOCUS_RIGHT, android.view.View.FOCUS_DOWN}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRealDirection {
+ }
+
+ @IntDef({android.view.View.FOCUS_FORWARD, android.view.View.FOCUS_BACKWARD}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.FocusRelativeDirection {
+ }
+
+ @IntDef({androidx.core.view.ViewCompat.TYPE_TOUCH, androidx.core.view.ViewCompat.TYPE_NON_TOUCH}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.NestedScrollType {
+ }
+
+ public static interface ViewCompat.OnUnhandledKeyEventListenerCompat {
+ method public boolean onUnhandledKeyEvent(android.view.View, android.view.KeyEvent);
+ }
+
+ @IntDef(value={androidx.core.view.ViewCompat.SCROLL_AXIS_NONE, androidx.core.view.ViewCompat.SCROLL_AXIS_HORIZONTAL, androidx.core.view.ViewCompat.SCROLL_AXIS_VERTICAL}, flag=true) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollAxis {
+ }
+
+ @IntDef(flag=true, value={androidx.core.view.ViewCompat.SCROLL_INDICATOR_TOP, androidx.core.view.ViewCompat.SCROLL_INDICATOR_BOTTOM, androidx.core.view.ViewCompat.SCROLL_INDICATOR_LEFT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_RIGHT, androidx.core.view.ViewCompat.SCROLL_INDICATOR_START, androidx.core.view.ViewCompat.SCROLL_INDICATOR_END}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface ViewCompat.ScrollIndicators {
+ }
+
+ public final class ViewConfigurationCompat {
+ method public static float getScaledHorizontalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method public static int getScaledHoverSlop(android.view.ViewConfiguration!);
+ method @Deprecated public static int getScaledPagingTouchSlop(android.view.ViewConfiguration!);
+ method public static float getScaledVerticalScrollFactor(android.view.ViewConfiguration, android.content.Context);
+ method @Deprecated public static boolean hasPermanentMenuKey(android.view.ViewConfiguration!);
+ method public static boolean shouldShowMenuShortcutsWhenKeyboardPresent(android.view.ViewConfiguration!, android.content.Context);
+ }
+
+ public final class ViewGroupCompat {
+ method public static int getLayoutMode(android.view.ViewGroup);
+ method @androidx.core.view.ViewCompat.ScrollAxis public static int getNestedScrollAxes(android.view.ViewGroup);
+ method public static boolean isTransitionGroup(android.view.ViewGroup);
+ method @Deprecated public static boolean onRequestSendAccessibilityEvent(android.view.ViewGroup!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ method public static void setLayoutMode(android.view.ViewGroup, int);
+ method @Deprecated public static void setMotionEventSplittingEnabled(android.view.ViewGroup!, boolean);
+ method public static void setTransitionGroup(android.view.ViewGroup, boolean);
+ field public static final int LAYOUT_MODE_CLIP_BOUNDS = 0; // 0x0
+ field public static final int LAYOUT_MODE_OPTICAL_BOUNDS = 1; // 0x1
+ }
+
+ public final class ViewParentCompat {
+ method public static void notifySubtreeAccessibilityStateChanged(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onNestedFling(android.view.ViewParent!, android.view.View!, float, float, boolean);
+ method public static boolean onNestedPreFling(android.view.ViewParent!, android.view.View!, float, float);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!);
+ method public static void onNestedPreScroll(android.view.ViewParent!, android.view.View!, int, int, int[]!, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int);
+ method public static void onNestedScroll(android.view.ViewParent!, android.view.View!, int, int, int, int, int, int[]);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static void onNestedScrollAccepted(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int);
+ method public static boolean onStartNestedScroll(android.view.ViewParent!, android.view.View!, android.view.View!, int, int);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!);
+ method public static void onStopNestedScroll(android.view.ViewParent!, android.view.View!, int);
+ method @Deprecated public static boolean requestSendAccessibilityEvent(android.view.ViewParent!, android.view.View!, android.view.accessibility.AccessibilityEvent!);
+ }
+
+ public final class ViewPropertyAnimatorCompat {
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alpha(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! alphaBy(float);
+ method public void cancel();
+ method public long getDuration();
+ method public android.view.animation.Interpolator! getInterpolator();
+ method public long getStartDelay();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotation(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! rotationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! scaleYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setDuration(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setInterpolator(android.view.animation.Interpolator!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setListener(androidx.core.view.ViewPropertyAnimatorListener!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setStartDelay(long);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! setUpdateListener(androidx.core.view.ViewPropertyAnimatorUpdateListener!);
+ method public void start();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationX(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationXBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationY(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationYBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZ(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! translationZBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withEndAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withLayer();
+ method public androidx.core.view.ViewPropertyAnimatorCompat! withStartAction(Runnable!);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! x(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! xBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! y(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! yBy(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! z(float);
+ method public androidx.core.view.ViewPropertyAnimatorCompat! zBy(float);
+ }
+
+ public interface ViewPropertyAnimatorListener {
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public class ViewPropertyAnimatorListenerAdapter implements androidx.core.view.ViewPropertyAnimatorListener {
+ ctor public ViewPropertyAnimatorListenerAdapter();
+ method public void onAnimationCancel(android.view.View!);
+ method public void onAnimationEnd(android.view.View!);
+ method public void onAnimationStart(android.view.View!);
+ }
+
+ public interface ViewPropertyAnimatorUpdateListener {
+ method public void onAnimationUpdate(android.view.View!);
+ }
+
+ public final class WindowCompat {
+ method public static androidx.core.view.WindowInsetsControllerCompat? getInsetsController(android.view.Window, android.view.View);
+ method public static <T extends android.view.View> T requireViewById(android.view.Window, @IdRes int);
+ method public static void setDecorFitsSystemWindows(android.view.Window, boolean);
+ field public static final int FEATURE_ACTION_BAR = 8; // 0x8
+ field public static final int FEATURE_ACTION_BAR_OVERLAY = 9; // 0x9
+ field public static final int FEATURE_ACTION_MODE_OVERLAY = 10; // 0xa
+ }
+
+ public final class WindowInsetsAnimationCompat {
+ ctor public WindowInsetsAnimationCompat(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, android.view.animation.Interpolator?, long);
+ method @FloatRange(from=0.0f, to=1.0f) public float getAlpha();
+ method public long getDurationMillis();
+ method @FloatRange(from=0.0f, to=1.0f) public float getFraction();
+ method public float getInterpolatedFraction();
+ method public android.view.animation.Interpolator? getInterpolator();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypeMask();
+ method public void setAlpha(@FloatRange(from=0.0f, to=1.0f) float);
+ method public void setFraction(@FloatRange(from=0.0f, to=1.0f) float);
+ }
+
+ public static final class WindowInsetsAnimationCompat.BoundsCompat {
+ ctor public WindowInsetsAnimationCompat.BoundsCompat(androidx.core.graphics.Insets, androidx.core.graphics.Insets);
+ method public androidx.core.graphics.Insets getLowerBound();
+ method public androidx.core.graphics.Insets getUpperBound();
+ method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat inset(androidx.core.graphics.Insets);
+ method @RequiresApi(30) public android.view.WindowInsetsAnimation.Bounds toBounds();
+ method @RequiresApi(30) public static androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat toBoundsCompat(android.view.WindowInsetsAnimation.Bounds);
+ }
+
+ public abstract static class WindowInsetsAnimationCompat.Callback {
+ ctor public WindowInsetsAnimationCompat.Callback(@androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode int);
+ method @androidx.core.view.WindowInsetsAnimationCompat.Callback.DispatchMode public final int getDispatchMode();
+ method public void onEnd(androidx.core.view.WindowInsetsAnimationCompat);
+ method public void onPrepare(androidx.core.view.WindowInsetsAnimationCompat);
+ method public abstract androidx.core.view.WindowInsetsCompat onProgress(androidx.core.view.WindowInsetsCompat, java.util.List<androidx.core.view.WindowInsetsAnimationCompat!>);
+ method public androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat onStart(androidx.core.view.WindowInsetsAnimationCompat, androidx.core.view.WindowInsetsAnimationCompat.BoundsCompat);
+ field public static final int DISPATCH_MODE_CONTINUE_ON_SUBTREE = 1; // 0x1
+ field public static final int DISPATCH_MODE_STOP = 0; // 0x0
+ }
+
+ @IntDef({androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_STOP, androidx.core.view.WindowInsetsAnimationCompat.Callback.DISPATCH_MODE_CONTINUE_ON_SUBTREE}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsAnimationCompat.Callback.DispatchMode {
+ }
+
+ public interface WindowInsetsAnimationControlListenerCompat {
+ method public void onCancelled(androidx.core.view.WindowInsetsAnimationControllerCompat?);
+ method public void onFinished(androidx.core.view.WindowInsetsAnimationControllerCompat);
+ method public void onReady(androidx.core.view.WindowInsetsAnimationControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ }
+
+ public final class WindowInsetsAnimationControllerCompat {
+ method public void finish(boolean);
+ method public float getCurrentAlpha();
+ method @FloatRange(from=0.0f, to=1.0f) public float getCurrentFraction();
+ method public androidx.core.graphics.Insets getCurrentInsets();
+ method public androidx.core.graphics.Insets getHiddenStateInsets();
+ method public androidx.core.graphics.Insets getShownStateInsets();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public int getTypes();
+ method public boolean isCancelled();
+ method public boolean isFinished();
+ method public boolean isReady();
+ method public void setInsetsAndAlpha(androidx.core.graphics.Insets?, @FloatRange(from=0.0f, to=1.0f) float, @FloatRange(from=0.0f, to=1.0f) float);
+ }
+
+ public class WindowInsetsCompat {
+ ctor public WindowInsetsCompat(androidx.core.view.WindowInsetsCompat?);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeDisplayCutout();
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeStableInsets();
+ method @Deprecated public androidx.core.view.WindowInsetsCompat consumeSystemWindowInsets();
+ method public androidx.core.view.DisplayCutoutCompat? getDisplayCutout();
+ method public androidx.core.graphics.Insets getInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ method public androidx.core.graphics.Insets getInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ method @Deprecated public androidx.core.graphics.Insets getMandatorySystemGestureInsets();
+ method @Deprecated public int getStableInsetBottom();
+ method @Deprecated public int getStableInsetLeft();
+ method @Deprecated public int getStableInsetRight();
+ method @Deprecated public int getStableInsetTop();
+ method @Deprecated public androidx.core.graphics.Insets getStableInsets();
+ method @Deprecated public androidx.core.graphics.Insets getSystemGestureInsets();
+ method @Deprecated public int getSystemWindowInsetBottom();
+ method @Deprecated public int getSystemWindowInsetLeft();
+ method @Deprecated public int getSystemWindowInsetRight();
+ method @Deprecated public int getSystemWindowInsetTop();
+ method @Deprecated public androidx.core.graphics.Insets getSystemWindowInsets();
+ method @Deprecated public androidx.core.graphics.Insets getTappableElementInsets();
+ method public boolean hasInsets();
+ method @Deprecated public boolean hasStableInsets();
+ method @Deprecated public boolean hasSystemWindowInsets();
+ method public androidx.core.view.WindowInsetsCompat inset(androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat inset(@IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int, @IntRange(from=0) int);
+ method public boolean isConsumed();
+ method public boolean isRound();
+ method public boolean isVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(int, int, int, int);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat replaceSystemWindowInsets(android.graphics.Rect);
+ method @RequiresApi(20) public android.view.WindowInsets? toWindowInsets();
+ method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets);
+ method @RequiresApi(20) public static androidx.core.view.WindowInsetsCompat toWindowInsetsCompat(android.view.WindowInsets, android.view.View?);
+ field public static final androidx.core.view.WindowInsetsCompat CONSUMED;
+ }
+
+ public static final class WindowInsetsCompat.Builder {
+ ctor public WindowInsetsCompat.Builder();
+ ctor public WindowInsetsCompat.Builder(androidx.core.view.WindowInsetsCompat);
+ method public androidx.core.view.WindowInsetsCompat build();
+ method public androidx.core.view.WindowInsetsCompat.Builder setDisplayCutout(androidx.core.view.DisplayCutoutCompat?);
+ method public androidx.core.view.WindowInsetsCompat.Builder setInsets(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat.Builder setInsetsIgnoringVisibility(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setMandatorySystemGestureInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setStableInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemGestureInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setSystemWindowInsets(androidx.core.graphics.Insets);
+ method @Deprecated public androidx.core.view.WindowInsetsCompat.Builder setTappableElementInsets(androidx.core.graphics.Insets);
+ method public androidx.core.view.WindowInsetsCompat.Builder setVisible(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, boolean);
+ }
+
+ public static final class WindowInsetsCompat.Type {
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int captionBar();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int displayCutout();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int ime();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int mandatorySystemGestures();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int navigationBars();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int statusBars();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemBars();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int systemGestures();
+ method @androidx.core.view.WindowInsetsCompat.Type.InsetsType public static int tappableElement();
+ }
+
+ @IntDef(flag=true, value={0x1, 0x2, 0x4, 0x8, 0x100, 0x10, 0x20, 0x40, 0x80}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface WindowInsetsCompat.Type.InsetsType {
+ }
+
+ public final class WindowInsetsControllerCompat {
+ ctor public WindowInsetsControllerCompat(android.view.Window, android.view.View);
+ method public void addOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+ method public void controlWindowInsetsAnimation(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int, long, android.view.animation.Interpolator?, android.os.CancellationSignal?, androidx.core.view.WindowInsetsAnimationControlListenerCompat);
+ method public int getSystemBarsBehavior();
+ method public void hide(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ method public boolean isAppearanceLightNavigationBars();
+ method public boolean isAppearanceLightStatusBars();
+ method public void removeOnControllableInsetsChangedListener(androidx.core.view.WindowInsetsControllerCompat.OnControllableInsetsChangedListener);
+ method public void setAppearanceLightNavigationBars(boolean);
+ method public void setAppearanceLightStatusBars(boolean);
+ method public void setSystemBarsBehavior(int);
+ method public void show(@androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ method @RequiresApi(30) public static androidx.core.view.WindowInsetsControllerCompat toWindowInsetsControllerCompat(android.view.WindowInsetsController);
+ field public static final int BEHAVIOR_SHOW_BARS_BY_SWIPE = 1; // 0x1
+ field public static final int BEHAVIOR_SHOW_BARS_BY_TOUCH = 0; // 0x0
+ field public static final int BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE = 2; // 0x2
+ }
+
+ public static interface WindowInsetsControllerCompat.OnControllableInsetsChangedListener {
+ method public void onControllableInsetsChanged(androidx.core.view.WindowInsetsControllerCompat, @androidx.core.view.WindowInsetsCompat.Type.InsetsType int);
+ }
+
+}
+
+package androidx.core.view.accessibility {
+
+ public final class AccessibilityClickableSpanCompat extends android.text.style.ClickableSpan {
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityClickableSpanCompat(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat!, int);
+ method public void onClick(android.view.View);
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final String SPAN_ID = "ACCESSIBILITY_CLICKABLE_SPAN_ID";
+ }
+
+ public final class AccessibilityEventCompat {
+ method @Deprecated public static void appendRecord(android.view.accessibility.AccessibilityEvent!, androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! asRecord(android.view.accessibility.AccessibilityEvent!);
+ method public static int getAction(android.view.accessibility.AccessibilityEvent!);
+ method @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType public static int getContentChangeTypes(android.view.accessibility.AccessibilityEvent!);
+ method public static int getMovementGranularity(android.view.accessibility.AccessibilityEvent!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! getRecord(android.view.accessibility.AccessibilityEvent!, int);
+ method @Deprecated public static int getRecordCount(android.view.accessibility.AccessibilityEvent!);
+ method public static void setAction(android.view.accessibility.AccessibilityEvent!, int);
+ method public static void setContentChangeTypes(android.view.accessibility.AccessibilityEvent!, @androidx.core.view.accessibility.AccessibilityEventCompat.ContentChangeType int);
+ method public static void setMovementGranularity(android.view.accessibility.AccessibilityEvent!, int);
+ field public static final int CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION = 4; // 0x4
+ field public static final int CONTENT_CHANGE_TYPE_PANE_APPEARED = 16; // 0x10
+ field public static final int CONTENT_CHANGE_TYPE_PANE_DISAPPEARED = 32; // 0x20
+ field public static final int CONTENT_CHANGE_TYPE_PANE_TITLE = 8; // 0x8
+ field public static final int CONTENT_CHANGE_TYPE_STATE_DESCRIPTION = 64; // 0x40
+ field public static final int CONTENT_CHANGE_TYPE_SUBTREE = 1; // 0x1
+ field public static final int CONTENT_CHANGE_TYPE_TEXT = 2; // 0x2
+ field public static final int CONTENT_CHANGE_TYPE_UNDEFINED = 0; // 0x0
+ field public static final int TYPES_ALL_MASK = -1; // 0xffffffff
+ field public static final int TYPE_ANNOUNCEMENT = 16384; // 0x4000
+ field public static final int TYPE_ASSIST_READING_CONTEXT = 16777216; // 0x1000000
+ field public static final int TYPE_GESTURE_DETECTION_END = 524288; // 0x80000
+ field public static final int TYPE_GESTURE_DETECTION_START = 262144; // 0x40000
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_END = 1024; // 0x400
+ field @Deprecated public static final int TYPE_TOUCH_EXPLORATION_GESTURE_START = 512; // 0x200
+ field public static final int TYPE_TOUCH_INTERACTION_END = 2097152; // 0x200000
+ field public static final int TYPE_TOUCH_INTERACTION_START = 1048576; // 0x100000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUSED = 32768; // 0x8000
+ field public static final int TYPE_VIEW_ACCESSIBILITY_FOCUS_CLEARED = 65536; // 0x10000
+ field public static final int TYPE_VIEW_CONTEXT_CLICKED = 8388608; // 0x800000
+ field @Deprecated public static final int TYPE_VIEW_HOVER_ENTER = 128; // 0x80
+ field @Deprecated public static final int TYPE_VIEW_HOVER_EXIT = 256; // 0x100
+ field @Deprecated public static final int TYPE_VIEW_SCROLLED = 4096; // 0x1000
+ field @Deprecated public static final int TYPE_VIEW_TEXT_SELECTION_CHANGED = 8192; // 0x2000
+ field public static final int TYPE_VIEW_TEXT_TRAVERSED_AT_MOVEMENT_GRANULARITY = 131072; // 0x20000
+ field public static final int TYPE_WINDOWS_CHANGED = 4194304; // 0x400000
+ field @Deprecated public static final int TYPE_WINDOW_CONTENT_CHANGED = 2048; // 0x800
+ }
+
+ @IntDef(flag=true, value={androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, androidx.core.view.accessibility.AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface AccessibilityEventCompat.ContentChangeType {
+ }
+
+ public final class AccessibilityManagerCompat {
+ method @Deprecated public static boolean addAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean addTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getEnabledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!, int);
+ method @Deprecated public static java.util.List<android.accessibilityservice.AccessibilityServiceInfo!>! getInstalledAccessibilityServiceList(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean isTouchExplorationEnabled(android.view.accessibility.AccessibilityManager!);
+ method @Deprecated public static boolean removeAccessibilityStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener!);
+ method public static boolean removeTouchExplorationStateChangeListener(android.view.accessibility.AccessibilityManager!, androidx.core.view.accessibility.AccessibilityManagerCompat.TouchExplorationStateChangeListener!);
+ }
+
+ @Deprecated public static interface AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ method @Deprecated public void onAccessibilityStateChanged(boolean);
+ }
+
+ @Deprecated public abstract static class AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat implements androidx.core.view.accessibility.AccessibilityManagerCompat.AccessibilityStateChangeListener {
+ ctor @Deprecated public AccessibilityManagerCompat.AccessibilityStateChangeListenerCompat();
+ }
+
+ public static interface AccessibilityManagerCompat.TouchExplorationStateChangeListener {
+ method public void onTouchExplorationStateChanged(boolean);
+ }
+
+ public class AccessibilityNodeInfoCompat {
+ ctor @Deprecated public AccessibilityNodeInfoCompat(Object!);
+ method public void addAction(int);
+ method public void addAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public void addChild(android.view.View!);
+ method public void addChild(android.view.View!, int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addSpansToExtras(CharSequence!, android.view.View!);
+ method public boolean canOpenPopup();
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByText(String!);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>! findAccessibilityNodeInfosByViewId(String!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! findFocus(int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! focusSearch(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!>! getActionList();
+ method public int getActions();
+ method @Deprecated public void getBoundsInParent(android.graphics.Rect!);
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public CharSequence! getClassName();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.text.style.ClickableSpan![]! getClickableSpans(CharSequence!);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! getCollectionInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! getCollectionItemInfo();
+ method public CharSequence! getContentDescription();
+ method public int getDrawingOrder();
+ method public CharSequence! getError();
+ method public android.os.Bundle! getExtras();
+ method public CharSequence? getHintText();
+ method @Deprecated public Object! getInfo();
+ method public int getInputType();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabelFor();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getLabeledBy();
+ method public int getLiveRegion();
+ method public int getMaxTextLength();
+ method public int getMovementGranularities();
+ method public CharSequence! getPackageName();
+ method public CharSequence? getPaneTitle();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! getRangeInfo();
+ method public CharSequence? getRoleDescription();
+ method public CharSequence? getStateDescription();
+ method public CharSequence! getText();
+ method public int getTextSelectionEnd();
+ method public int getTextSelectionStart();
+ method public CharSequence? getTooltipText();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat? getTouchDelegateInfo();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalAfter();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getTraversalBefore();
+ method public String! getViewIdResourceName();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getWindow();
+ method public int getWindowId();
+ method public boolean isAccessibilityFocused();
+ method public boolean isCheckable();
+ method public boolean isChecked();
+ method public boolean isClickable();
+ method public boolean isContentInvalid();
+ method public boolean isContextClickable();
+ method public boolean isDismissable();
+ method public boolean isEditable();
+ method public boolean isEnabled();
+ method public boolean isFocusable();
+ method public boolean isFocused();
+ method public boolean isHeading();
+ method public boolean isImportantForAccessibility();
+ method public boolean isLongClickable();
+ method public boolean isMultiLine();
+ method public boolean isPassword();
+ method public boolean isScreenReaderFocusable();
+ method public boolean isScrollable();
+ method public boolean isSelected();
+ method public boolean isShowingHintText();
+ method public boolean isTextEntryKey();
+ method public boolean isVisibleToUser();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(android.view.View!, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityNodeInfoCompat!);
+ method public boolean performAction(int);
+ method public boolean performAction(int, android.os.Bundle!);
+ method public void recycle();
+ method public boolean refresh();
+ method public boolean removeAction(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat!);
+ method public boolean removeChild(android.view.View!);
+ method public boolean removeChild(android.view.View!, int);
+ method public void setAccessibilityFocused(boolean);
+ method @Deprecated public void setBoundsInParent(android.graphics.Rect!);
+ method public void setBoundsInScreen(android.graphics.Rect!);
+ method public void setCanOpenPopup(boolean);
+ method public void setCheckable(boolean);
+ method public void setChecked(boolean);
+ method public void setClassName(CharSequence!);
+ method public void setClickable(boolean);
+ method public void setCollectionInfo(Object!);
+ method public void setCollectionItemInfo(Object!);
+ method public void setContentDescription(CharSequence!);
+ method public void setContentInvalid(boolean);
+ method public void setContextClickable(boolean);
+ method public void setDismissable(boolean);
+ method public void setDrawingOrder(int);
+ method public void setEditable(boolean);
+ method public void setEnabled(boolean);
+ method public void setError(CharSequence!);
+ method public void setFocusable(boolean);
+ method public void setFocused(boolean);
+ method public void setHeading(boolean);
+ method public void setHintText(CharSequence?);
+ method public void setImportantForAccessibility(boolean);
+ method public void setInputType(int);
+ method public void setLabelFor(android.view.View!);
+ method public void setLabelFor(android.view.View!, int);
+ method public void setLabeledBy(android.view.View!);
+ method public void setLabeledBy(android.view.View!, int);
+ method public void setLiveRegion(int);
+ method public void setLongClickable(boolean);
+ method public void setMaxTextLength(int);
+ method public void setMovementGranularities(int);
+ method public void setMultiLine(boolean);
+ method public void setPackageName(CharSequence!);
+ method public void setPaneTitle(CharSequence?);
+ method public void setParent(android.view.View!);
+ method public void setParent(android.view.View!, int);
+ method public void setPassword(boolean);
+ method public void setRangeInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat!);
+ method public void setRoleDescription(CharSequence?);
+ method public void setScreenReaderFocusable(boolean);
+ method public void setScrollable(boolean);
+ method public void setSelected(boolean);
+ method public void setShowingHintText(boolean);
+ method public void setSource(android.view.View!);
+ method public void setSource(android.view.View!, int);
+ method public void setStateDescription(CharSequence?);
+ method public void setText(CharSequence!);
+ method public void setTextEntryKey(boolean);
+ method public void setTextSelection(int, int);
+ method public void setTooltipText(CharSequence?);
+ method public void setTouchDelegateInfo(androidx.core.view.accessibility.AccessibilityNodeInfoCompat.TouchDelegateInfoCompat);
+ method public void setTraversalAfter(android.view.View!);
+ method public void setTraversalAfter(android.view.View!, int);
+ method public void setTraversalBefore(android.view.View!);
+ method public void setTraversalBefore(android.view.View!, int);
+ method public void setViewIdResourceName(String!);
+ method public void setVisibleToUser(boolean);
+ method public android.view.accessibility.AccessibilityNodeInfo! unwrap();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat! wrap(android.view.accessibility.AccessibilityNodeInfo);
+ field public static final int ACTION_ACCESSIBILITY_FOCUS = 64; // 0x40
+ field public static final String ACTION_ARGUMENT_COLUMN_INT = "android.view.accessibility.action.ARGUMENT_COLUMN_INT";
+ field public static final String ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN = "ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN";
+ field public static final String ACTION_ARGUMENT_HTML_ELEMENT_STRING = "ACTION_ARGUMENT_HTML_ELEMENT_STRING";
+ field public static final String ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT = "ACTION_ARGUMENT_MOVEMENT_GRANULARITY_INT";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_X = "ACTION_ARGUMENT_MOVE_WINDOW_X";
+ field public static final String ACTION_ARGUMENT_MOVE_WINDOW_Y = "ACTION_ARGUMENT_MOVE_WINDOW_Y";
+ field public static final String ACTION_ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT = "android.view.accessibility.action.ARGUMENT_PRESS_AND_HOLD_DURATION_MILLIS_INT";
+ field public static final String ACTION_ARGUMENT_PROGRESS_VALUE = "android.view.accessibility.action.ARGUMENT_PROGRESS_VALUE";
+ field public static final String ACTION_ARGUMENT_ROW_INT = "android.view.accessibility.action.ARGUMENT_ROW_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_END_INT = "ACTION_ARGUMENT_SELECTION_END_INT";
+ field public static final String ACTION_ARGUMENT_SELECTION_START_INT = "ACTION_ARGUMENT_SELECTION_START_INT";
+ field public static final String ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE = "ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE";
+ field public static final int ACTION_CLEAR_ACCESSIBILITY_FOCUS = 128; // 0x80
+ field public static final int ACTION_CLEAR_FOCUS = 2; // 0x2
+ field public static final int ACTION_CLEAR_SELECTION = 8; // 0x8
+ field public static final int ACTION_CLICK = 16; // 0x10
+ field public static final int ACTION_COLLAPSE = 524288; // 0x80000
+ field public static final int ACTION_COPY = 16384; // 0x4000
+ field public static final int ACTION_CUT = 65536; // 0x10000
+ field public static final int ACTION_DISMISS = 1048576; // 0x100000
+ field public static final int ACTION_EXPAND = 262144; // 0x40000
+ field public static final int ACTION_FOCUS = 1; // 0x1
+ field public static final int ACTION_LONG_CLICK = 32; // 0x20
+ field public static final int ACTION_NEXT_AT_MOVEMENT_GRANULARITY = 256; // 0x100
+ field public static final int ACTION_NEXT_HTML_ELEMENT = 1024; // 0x400
+ field public static final int ACTION_PASTE = 32768; // 0x8000
+ field public static final int ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY = 512; // 0x200
+ field public static final int ACTION_PREVIOUS_HTML_ELEMENT = 2048; // 0x800
+ field public static final int ACTION_SCROLL_BACKWARD = 8192; // 0x2000
+ field public static final int ACTION_SCROLL_FORWARD = 4096; // 0x1000
+ field public static final int ACTION_SELECT = 4; // 0x4
+ field public static final int ACTION_SET_SELECTION = 131072; // 0x20000
+ field public static final int ACTION_SET_TEXT = 2097152; // 0x200000
+ field public static final int FOCUS_ACCESSIBILITY = 2; // 0x2
+ field public static final int FOCUS_INPUT = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_CHARACTER = 1; // 0x1
+ field public static final int MOVEMENT_GRANULARITY_LINE = 4; // 0x4
+ field public static final int MOVEMENT_GRANULARITY_PAGE = 16; // 0x10
+ field public static final int MOVEMENT_GRANULARITY_PARAGRAPH = 8; // 0x8
+ field public static final int MOVEMENT_GRANULARITY_WORD = 2; // 0x2
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int mParentVirtualDescendantId;
+ }
+
+ public static class AccessibilityNodeInfoCompat.AccessibilityActionCompat {
+ ctor public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!);
+ ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public AccessibilityNodeInfoCompat.AccessibilityActionCompat(int, CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! createReplacementAction(CharSequence!, androidx.core.view.accessibility.AccessibilityViewCommand!);
+ method public int getId();
+ method public CharSequence! getLabel();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public boolean perform(android.view.View!, android.os.Bundle!);
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_ACCESSIBILITY_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLEAR_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COLLAPSE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CONTEXT_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_COPY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_CUT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_DISMISS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_EXPAND;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_FOCUS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_HIDE_TOOLTIP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_IME_ENTER;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_LONG_CLICK;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_MOVE_WINDOW;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_NEXT_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PAGE_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PASTE;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat ACTION_PRESS_AND_HOLD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_AT_MOVEMENT_GRANULARITY;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_PREVIOUS_HTML_ELEMENT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_BACKWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_DOWN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_FORWARD;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_LEFT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_RIGHT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_TO_POSITION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SCROLL_UP;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SELECT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_PROGRESS;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_SELECTION;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SET_TEXT;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_ON_SCREEN;
+ field public static final androidx.core.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat! ACTION_SHOW_TOOLTIP;
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected final androidx.core.view.accessibility.AccessibilityViewCommand! mCommand;
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionInfoCompat {
+ method public int getColumnCount();
+ method public int getRowCount();
+ method public int getSelectionMode();
+ method public boolean isHierarchical();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean, int);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionInfoCompat! obtain(int, int, boolean);
+ field public static final int SELECTION_MODE_MULTIPLE = 2; // 0x2
+ field public static final int SELECTION_MODE_NONE = 0; // 0x0
+ field public static final int SELECTION_MODE_SINGLE = 1; // 0x1
+ }
+
+ public static class AccessibilityNodeInfoCompat.CollectionItemInfoCompat {
+ method public int getColumnIndex();
+ method public int getColumnSpan();
+ method public int getRowIndex();
+ method public int getRowSpan();
+ method @Deprecated public boolean isHeading();
+ method public boolean isSelected();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean, boolean);
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.CollectionItemInfoCompat! obtain(int, int, int, int, boolean);
+ }
+
+ public static class AccessibilityNodeInfoCompat.RangeInfoCompat {
+ method public float getCurrent();
+ method public float getMax();
+ method public float getMin();
+ method public int getType();
+ method public static androidx.core.view.accessibility.AccessibilityNodeInfoCompat.RangeInfoCompat! obtain(int, float, float, float);
+ field public static final int RANGE_TYPE_FLOAT = 1; // 0x1
+ field public static final int RANGE_TYPE_INT = 0; // 0x0
+ field public static final int RANGE_TYPE_PERCENT = 2; // 0x2
+ }
+
+ public static final class AccessibilityNodeInfoCompat.TouchDelegateInfoCompat {
+ ctor public AccessibilityNodeInfoCompat.TouchDelegateInfoCompat(java.util.Map<android.graphics.Region!,android.view.View!>);
+ method public android.graphics.Region? getRegionAt(@IntRange(from=0) int);
+ method @IntRange(from=0) public int getRegionCount();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? getTargetForRegion(android.graphics.Region);
+ }
+
+ public class AccessibilityNodeProviderCompat {
+ ctor public AccessibilityNodeProviderCompat();
+ ctor public AccessibilityNodeProviderCompat(Object!);
+ method public void addExtraDataToAccessibilityNodeInfo(int, androidx.core.view.accessibility.AccessibilityNodeInfoCompat, String, android.os.Bundle?);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? createAccessibilityNodeInfo(int);
+ method public java.util.List<androidx.core.view.accessibility.AccessibilityNodeInfoCompat!>? findAccessibilityNodeInfosByText(String!, int);
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat? findFocus(int);
+ method public Object! getProvider();
+ method public boolean performAction(int, int, android.os.Bundle!);
+ field public static final int HOST_VIEW_ID = -1; // 0xffffffff
+ }
+
+ public class AccessibilityRecordCompat {
+ ctor @Deprecated public AccessibilityRecordCompat(Object!);
+ method @Deprecated public boolean equals(Object?);
+ method @Deprecated public int getAddedCount();
+ method @Deprecated public CharSequence! getBeforeText();
+ method @Deprecated public CharSequence! getClassName();
+ method @Deprecated public CharSequence! getContentDescription();
+ method @Deprecated public int getCurrentItemIndex();
+ method @Deprecated public int getFromIndex();
+ method @Deprecated public Object! getImpl();
+ method @Deprecated public int getItemCount();
+ method @Deprecated public int getMaxScrollX();
+ method public static int getMaxScrollX(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public int getMaxScrollY();
+ method public static int getMaxScrollY(android.view.accessibility.AccessibilityRecord!);
+ method @Deprecated public android.os.Parcelable! getParcelableData();
+ method @Deprecated public int getRemovedCount();
+ method @Deprecated public int getScrollX();
+ method @Deprecated public int getScrollY();
+ method @Deprecated public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getSource();
+ method @Deprecated public java.util.List<java.lang.CharSequence!>! getText();
+ method @Deprecated public int getToIndex();
+ method @Deprecated public int getWindowId();
+ method @Deprecated public int hashCode();
+ method @Deprecated public boolean isChecked();
+ method @Deprecated public boolean isEnabled();
+ method @Deprecated public boolean isFullScreen();
+ method @Deprecated public boolean isPassword();
+ method @Deprecated public boolean isScrollable();
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain(androidx.core.view.accessibility.AccessibilityRecordCompat!);
+ method @Deprecated public static androidx.core.view.accessibility.AccessibilityRecordCompat! obtain();
+ method @Deprecated public void recycle();
+ method @Deprecated public void setAddedCount(int);
+ method @Deprecated public void setBeforeText(CharSequence!);
+ method @Deprecated public void setChecked(boolean);
+ method @Deprecated public void setClassName(CharSequence!);
+ method @Deprecated public void setContentDescription(CharSequence!);
+ method @Deprecated public void setCurrentItemIndex(int);
+ method @Deprecated public void setEnabled(boolean);
+ method @Deprecated public void setFromIndex(int);
+ method @Deprecated public void setFullScreen(boolean);
+ method @Deprecated public void setItemCount(int);
+ method @Deprecated public void setMaxScrollX(int);
+ method public static void setMaxScrollX(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setMaxScrollY(int);
+ method public static void setMaxScrollY(android.view.accessibility.AccessibilityRecord!, int);
+ method @Deprecated public void setParcelableData(android.os.Parcelable!);
+ method @Deprecated public void setPassword(boolean);
+ method @Deprecated public void setRemovedCount(int);
+ method @Deprecated public void setScrollX(int);
+ method @Deprecated public void setScrollY(int);
+ method @Deprecated public void setScrollable(boolean);
+ method @Deprecated public void setSource(android.view.View!);
+ method @Deprecated public void setSource(android.view.View!, int);
+ method public static void setSource(android.view.accessibility.AccessibilityRecord, android.view.View!, int);
+ method @Deprecated public void setToIndex(int);
+ }
+
+ public interface AccessibilityViewCommand {
+ method public boolean perform(android.view.View, androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments?);
+ }
+
+ public abstract static class AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.CommandArguments();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void setBundle(android.os.Bundle!);
+ }
+
+ public static final class AccessibilityViewCommand.MoveAtGranularityArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveAtGranularityArguments();
+ method public boolean getExtendSelection();
+ method public int getGranularity();
+ }
+
+ public static final class AccessibilityViewCommand.MoveHtmlArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveHtmlArguments();
+ method public String! getHTMLElement();
+ }
+
+ public static final class AccessibilityViewCommand.MoveWindowArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.MoveWindowArguments();
+ method public int getX();
+ method public int getY();
+ }
+
+ public static final class AccessibilityViewCommand.ScrollToPositionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.ScrollToPositionArguments();
+ method public int getColumn();
+ method public int getRow();
+ }
+
+ public static final class AccessibilityViewCommand.SetProgressArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetProgressArguments();
+ method public float getProgress();
+ }
+
+ public static final class AccessibilityViewCommand.SetSelectionArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetSelectionArguments();
+ method public int getEnd();
+ method public int getStart();
+ }
+
+ public static final class AccessibilityViewCommand.SetTextArguments extends androidx.core.view.accessibility.AccessibilityViewCommand.CommandArguments {
+ ctor public AccessibilityViewCommand.SetTextArguments();
+ method public CharSequence! getText();
+ }
+
+ public class AccessibilityWindowInfoCompat {
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getAnchor();
+ method public void getBoundsInScreen(android.graphics.Rect!);
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getChild(int);
+ method public int getChildCount();
+ method public int getId();
+ method public int getLayer();
+ method public androidx.core.view.accessibility.AccessibilityWindowInfoCompat! getParent();
+ method public androidx.core.view.accessibility.AccessibilityNodeInfoCompat! getRoot();
+ method public CharSequence! getTitle();
+ method public int getType();
+ method public boolean isAccessibilityFocused();
+ method public boolean isActive();
+ method public boolean isFocused();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain();
+ method public static androidx.core.view.accessibility.AccessibilityWindowInfoCompat! obtain(androidx.core.view.accessibility.AccessibilityWindowInfoCompat!);
+ method public void recycle();
+ field public static final int TYPE_ACCESSIBILITY_OVERLAY = 4; // 0x4
+ field public static final int TYPE_APPLICATION = 1; // 0x1
+ field public static final int TYPE_INPUT_METHOD = 2; // 0x2
+ field public static final int TYPE_SPLIT_SCREEN_DIVIDER = 5; // 0x5
+ field public static final int TYPE_SYSTEM = 3; // 0x3
+ }
+
+}
+
+package androidx.core.view.animation {
+
+ public final class PathInterpolatorCompat {
+ method public static android.view.animation.Interpolator! create(android.graphics.Path!);
+ method public static android.view.animation.Interpolator! create(float, float);
+ method public static android.view.animation.Interpolator! create(float, float, float, float);
+ }
+
+}
+
+package androidx.core.view.inputmethod {
+
+ public final class EditorInfoCompat {
+ ctor @Deprecated public EditorInfoCompat();
+ method public static String![] getContentMimeTypes(android.view.inputmethod.EditorInfo);
+ method public static CharSequence? getInitialSelectedText(android.view.inputmethod.EditorInfo, int);
+ method public static CharSequence? getInitialTextAfterCursor(android.view.inputmethod.EditorInfo, int, int);
+ method public static CharSequence? getInitialTextBeforeCursor(android.view.inputmethod.EditorInfo, int, int);
+ method public static void setContentMimeTypes(android.view.inputmethod.EditorInfo, String![]?);
+ method public static void setInitialSurroundingSubText(android.view.inputmethod.EditorInfo, CharSequence, int);
+ method public static void setInitialSurroundingText(android.view.inputmethod.EditorInfo, CharSequence);
+ field public static final int IME_FLAG_FORCE_ASCII = -2147483648; // 0x80000000
+ field public static final int IME_FLAG_NO_PERSONALIZED_LEARNING = 16777216; // 0x1000000
+ }
+
+ public final class InputConnectionCompat {
+ ctor @Deprecated public InputConnectionCompat();
+ method public static boolean commitContent(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ method @Deprecated public static android.view.inputmethod.InputConnection createWrapper(android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo, androidx.core.view.inputmethod.InputConnectionCompat.OnCommitContentListener);
+ method public static android.view.inputmethod.InputConnection createWrapper(android.view.View, android.view.inputmethod.InputConnection, android.view.inputmethod.EditorInfo);
+ field public static final int INPUT_CONTENT_GRANT_READ_URI_PERMISSION = 1; // 0x1
+ }
+
+ public static interface InputConnectionCompat.OnCommitContentListener {
+ method public boolean onCommitContent(androidx.core.view.inputmethod.InputContentInfoCompat, int, android.os.Bundle?);
+ }
+
+ public final class InputContentInfoCompat {
+ ctor public InputContentInfoCompat(android.net.Uri, android.content.ClipDescription, android.net.Uri?);
+ method public android.net.Uri getContentUri();
+ method public android.content.ClipDescription getDescription();
+ method public android.net.Uri? getLinkUri();
+ method public void releasePermission();
+ method public void requestPermission();
+ method public Object? unwrap();
+ method public static androidx.core.view.inputmethod.InputContentInfoCompat? wrap(Object?);
+ }
+
+}
+
+package androidx.core.widget {
+
+ public abstract class AutoScrollHelper implements android.view.View.OnTouchListener {
+ ctor public AutoScrollHelper(android.view.View);
+ method public abstract boolean canTargetScrollHorizontally(int);
+ method public abstract boolean canTargetScrollVertically(int);
+ method public boolean isEnabled();
+ method public boolean isExclusive();
+ method public boolean onTouch(android.view.View!, android.view.MotionEvent!);
+ method public abstract void scrollTargetBy(int, int);
+ method public androidx.core.widget.AutoScrollHelper setActivationDelay(int);
+ method public androidx.core.widget.AutoScrollHelper setEdgeType(int);
+ method public androidx.core.widget.AutoScrollHelper! setEnabled(boolean);
+ method public androidx.core.widget.AutoScrollHelper! setExclusive(boolean);
+ method public androidx.core.widget.AutoScrollHelper setMaximumEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMaximumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setMinimumVelocity(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRampDownDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRampUpDuration(int);
+ method public androidx.core.widget.AutoScrollHelper setRelativeEdges(float, float);
+ method public androidx.core.widget.AutoScrollHelper setRelativeVelocity(float, float);
+ field public static final int EDGE_TYPE_INSIDE = 0; // 0x0
+ field public static final int EDGE_TYPE_INSIDE_EXTEND = 1; // 0x1
+ field public static final int EDGE_TYPE_OUTSIDE = 2; // 0x2
+ field public static final float NO_MAX = 3.4028235E38f;
+ field public static final float NO_MIN = 0.0f;
+ field public static final float RELATIVE_UNSPECIFIED = 0.0f;
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface AutoSizeableTextView {
+ method public int getAutoSizeMaxTextSize();
+ method public int getAutoSizeMinTextSize();
+ method public int getAutoSizeStepGranularity();
+ method public int[]! getAutoSizeTextAvailableSizes();
+ method @androidx.core.widget.TextViewCompat.AutoSizeTextType public int getAutoSizeTextType();
+ method public void setAutoSizeTextTypeUniformWithConfiguration(int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeUniformWithPresetSizes(int[], int) throws java.lang.IllegalArgumentException;
+ method public void setAutoSizeTextTypeWithDefaults(@androidx.core.widget.TextViewCompat.AutoSizeTextType int);
+ field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final boolean PLATFORM_SUPPORTS_AUTOSIZE;
+ }
+
+ public final class CheckedTextViewCompat {
+ method public static android.graphics.drawable.Drawable? getCheckMarkDrawable(android.widget.CheckedTextView);
+ method public static android.content.res.ColorStateList? getCheckMarkTintList(android.widget.CheckedTextView);
+ method public static android.graphics.PorterDuff.Mode? getCheckMarkTintMode(android.widget.CheckedTextView);
+ method public static void setCheckMarkTintList(android.widget.CheckedTextView, android.content.res.ColorStateList?);
+ method public static void setCheckMarkTintMode(android.widget.CheckedTextView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class CompoundButtonCompat {
+ method public static android.graphics.drawable.Drawable? getButtonDrawable(android.widget.CompoundButton);
+ method public static android.content.res.ColorStateList? getButtonTintList(android.widget.CompoundButton);
+ method public static android.graphics.PorterDuff.Mode? getButtonTintMode(android.widget.CompoundButton);
+ method public static void setButtonTintList(android.widget.CompoundButton, android.content.res.ColorStateList?);
+ method public static void setButtonTintMode(android.widget.CompoundButton, android.graphics.PorterDuff.Mode?);
+ }
+
+ public class ContentLoadingProgressBar extends android.widget.ProgressBar {
+ ctor public ContentLoadingProgressBar(android.content.Context);
+ ctor public ContentLoadingProgressBar(android.content.Context, android.util.AttributeSet?);
+ method public void hide();
+ method public void onAttachedToWindow();
+ method public void onDetachedFromWindow();
+ method public void show();
+ }
+
+ public final class EdgeEffectCompat {
+ ctor @Deprecated public EdgeEffectCompat(android.content.Context!);
+ method public static android.widget.EdgeEffect create(android.content.Context, android.util.AttributeSet?);
+ method @Deprecated public boolean draw(android.graphics.Canvas!);
+ method @Deprecated public void finish();
+ method public static float getDistance(android.widget.EdgeEffect);
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean onAbsorb(int);
+ method @Deprecated public boolean onPull(float);
+ method @Deprecated public boolean onPull(float, float);
+ method public static void onPull(android.widget.EdgeEffect, float, float);
+ method public static float onPullDistance(android.widget.EdgeEffect, float, float);
+ method @Deprecated public boolean onRelease();
+ method @Deprecated public void setSize(int, int);
+ }
+
+ public class ImageViewCompat {
+ method public static android.content.res.ColorStateList? getImageTintList(android.widget.ImageView);
+ method public static android.graphics.PorterDuff.Mode? getImageTintMode(android.widget.ImageView);
+ method public static void setImageTintList(android.widget.ImageView, android.content.res.ColorStateList?);
+ method public static void setImageTintMode(android.widget.ImageView, android.graphics.PorterDuff.Mode?);
+ }
+
+ public final class ListPopupWindowCompat {
+ method @Deprecated public static android.view.View.OnTouchListener! createDragToOpenListener(Object!, android.view.View!);
+ method public static android.view.View.OnTouchListener? createDragToOpenListener(android.widget.ListPopupWindow, android.view.View);
+ }
+
+ public class ListViewAutoScrollHelper extends androidx.core.widget.AutoScrollHelper {
+ ctor public ListViewAutoScrollHelper(android.widget.ListView);
+ method public boolean canTargetScrollHorizontally(int);
+ method public boolean canTargetScrollVertically(int);
+ method public void scrollTargetBy(int, int);
+ }
+
+ public final class ListViewCompat {
+ method public static boolean canScrollList(android.widget.ListView, int);
+ method public static void scrollListBy(android.widget.ListView, int);
+ }
+
+ public class NestedScrollView extends android.widget.FrameLayout implements androidx.core.view.NestedScrollingChild3 androidx.core.view.NestedScrollingParent3 androidx.core.view.ScrollingView {
+ ctor public NestedScrollView(android.content.Context);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?);
+ ctor public NestedScrollView(android.content.Context, android.util.AttributeSet?, int);
+ method public boolean arrowScroll(int);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeHorizontalScrollRange();
+ method protected int computeScrollDeltaToGetChildRectOnScreen(android.graphics.Rect!);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollExtent();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollOffset();
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public int computeVerticalScrollRange();
+ method public boolean dispatchNestedPreScroll(int, int, int[]!, int[]!, int);
+ method public void dispatchNestedScroll(int, int, int, int, int[]?, int, int[]);
+ method public boolean dispatchNestedScroll(int, int, int, int, int[]!, int);
+ method public boolean executeKeyEvent(android.view.KeyEvent);
+ method public void fling(int);
+ method public boolean fullScroll(int);
+ method public int getMaxScrollAmount();
+ method public boolean hasNestedScrollingParent(int);
+ method public boolean isFillViewport();
+ method public boolean isSmoothScrollingEnabled();
+ method public void onAttachedToWindow();
+ method public void onNestedPreScroll(android.view.View, int, int, int[], int);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int, int[]);
+ method public void onNestedScroll(android.view.View, int, int, int, int, int);
+ method public void onNestedScrollAccepted(android.view.View, android.view.View, int, int);
+ method public boolean onStartNestedScroll(android.view.View, android.view.View, int, int);
+ method public void onStopNestedScroll(android.view.View, int);
+ method public boolean pageScroll(int);
+ method public void setFillViewport(boolean);
+ method public void setOnScrollChangeListener(androidx.core.widget.NestedScrollView.OnScrollChangeListener?);
+ method public void setSmoothScrollingEnabled(boolean);
+ method public final void smoothScrollBy(int, int);
+ method public final void smoothScrollBy(int, int, int);
+ method public final void smoothScrollTo(int, int);
+ method public final void smoothScrollTo(int, int, int);
+ method public boolean startNestedScroll(int, int);
+ method public void stopNestedScroll(int);
+ }
+
+ public static interface NestedScrollView.OnScrollChangeListener {
+ method public void onScrollChange(androidx.core.widget.NestedScrollView!, int, int, int, int);
+ }
+
+ public final class PopupMenuCompat {
+ method public static android.view.View.OnTouchListener? getDragToOpenListener(Object);
+ }
+
+ public final class PopupWindowCompat {
+ method public static boolean getOverlapAnchor(android.widget.PopupWindow);
+ method public static int getWindowLayoutType(android.widget.PopupWindow);
+ method public static void setOverlapAnchor(android.widget.PopupWindow, boolean);
+ method public static void setWindowLayoutType(android.widget.PopupWindow, int);
+ method public static void showAsDropDown(android.widget.PopupWindow, android.view.View, int, int, int);
+ }
+
+ @Deprecated public final class ScrollerCompat {
+ method @Deprecated public void abortAnimation();
+ method @Deprecated public boolean computeScrollOffset();
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!);
+ method @Deprecated public static androidx.core.widget.ScrollerCompat! create(android.content.Context!, android.view.animation.Interpolator!);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int);
+ method @Deprecated public void fling(int, int, int, int, int, int, int, int, int, int);
+ method @Deprecated public float getCurrVelocity();
+ method @Deprecated public int getCurrX();
+ method @Deprecated public int getCurrY();
+ method @Deprecated public int getFinalX();
+ method @Deprecated public int getFinalY();
+ method @Deprecated public boolean isFinished();
+ method @Deprecated public boolean isOverScrolled();
+ method @Deprecated public void notifyHorizontalEdgeReached(int, int, int);
+ method @Deprecated public void notifyVerticalEdgeReached(int, int, int);
+ method @Deprecated public boolean springBack(int, int, int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int);
+ method @Deprecated public void startScroll(int, int, int, int, int);
+ }
+
+ public final class TextViewCompat {
+ method public static int getAutoSizeMaxTextSize(android.widget.TextView);
+ method public static int getAutoSizeMinTextSize(android.widget.TextView);
+ method public static int getAutoSizeStepGranularity(android.widget.TextView);
+ method public static int[] getAutoSizeTextAvailableSizes(android.widget.TextView);
+ method public static int getAutoSizeTextType(android.widget.TextView);
+ method public static android.content.res.ColorStateList? getCompoundDrawableTintList(android.widget.TextView);
+ method public static android.graphics.PorterDuff.Mode? getCompoundDrawableTintMode(android.widget.TextView);
+ method public static android.graphics.drawable.Drawable![] getCompoundDrawablesRelative(android.widget.TextView);
+ method public static int getFirstBaselineToTopHeight(android.widget.TextView);
+ method public static int getLastBaselineToBottomHeight(android.widget.TextView);
+ method public static int getMaxLines(android.widget.TextView);
+ method public static int getMinLines(android.widget.TextView);
+ method public static androidx.core.text.PrecomputedTextCompat.Params getTextMetricsParams(android.widget.TextView);
+ method public static void setAutoSizeTextTypeUniformWithConfiguration(android.widget.TextView, int, int, int, int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeUniformWithPresetSizes(android.widget.TextView, int[], int) throws java.lang.IllegalArgumentException;
+ method public static void setAutoSizeTextTypeWithDefaults(android.widget.TextView, int);
+ method public static void setCompoundDrawableTintList(android.widget.TextView, android.content.res.ColorStateList?);
+ method public static void setCompoundDrawableTintMode(android.widget.TextView, android.graphics.PorterDuff.Mode?);
+ method public static void setCompoundDrawablesRelative(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?, android.graphics.drawable.Drawable?);
+ method public static void setCompoundDrawablesRelativeWithIntrinsicBounds(android.widget.TextView, @DrawableRes int, @DrawableRes int, @DrawableRes int, @DrawableRes int);
+ method public static void setCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback);
+ method public static void setFirstBaselineToTopHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setLastBaselineToBottomHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setLineHeight(android.widget.TextView, @IntRange(from=0) @Px int);
+ method public static void setPrecomputedText(android.widget.TextView, androidx.core.text.PrecomputedTextCompat);
+ method public static void setTextAppearance(android.widget.TextView, @StyleRes int);
+ method public static void setTextMetricsParams(android.widget.TextView, androidx.core.text.PrecomputedTextCompat.Params);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? unwrapCustomSelectionActionModeCallback(android.view.ActionMode.Callback?);
+ method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static android.view.ActionMode.Callback? wrapCustomSelectionActionModeCallback(android.widget.TextView, android.view.ActionMode.Callback?);
+ field public static final int AUTO_SIZE_TEXT_TYPE_NONE = 0; // 0x0
+ field public static final int AUTO_SIZE_TEXT_TYPE_UNIFORM = 1; // 0x1
+ }
+
+ @IntDef({androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_NONE, androidx.core.widget.TextViewCompat.AUTO_SIZE_TEXT_TYPE_UNIFORM}) @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.SOURCE) public static @interface TextViewCompat.AutoSizeTextType {
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TextViewOnReceiveContentListener implements androidx.core.view.OnReceiveContentListener {
+ ctor public TextViewOnReceiveContentListener();
+ method public androidx.core.view.ContentInfoCompat? onReceiveContent(android.view.View, androidx.core.view.ContentInfoCompat);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableCheckedTextView {
+ method public android.content.res.ColorStateList? getSupportCheckMarkTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportCheckMarkTintMode();
+ method public void setSupportCheckMarkTintList(android.content.res.ColorStateList?);
+ method public void setSupportCheckMarkTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface TintableCompoundButton {
+ method public android.content.res.ColorStateList? getSupportButtonTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportButtonTintMode();
+ method public void setSupportButtonTintList(android.content.res.ColorStateList?);
+ method public void setSupportButtonTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ public interface TintableCompoundDrawablesView {
+ method public android.content.res.ColorStateList? getSupportCompoundDrawablesTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportCompoundDrawablesTintMode();
+ method public void setSupportCompoundDrawablesTintList(android.content.res.ColorStateList?);
+ method public void setSupportCompoundDrawablesTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+ @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface TintableImageSourceView {
+ method public android.content.res.ColorStateList? getSupportImageTintList();
+ method public android.graphics.PorterDuff.Mode? getSupportImageTintMode();
+ method public void setSupportImageTintList(android.content.res.ColorStateList?);
+ method public void setSupportImageTintMode(android.graphics.PorterDuff.Mode?);
+ }
+
+}
+
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index 1ff06b3..6222e07 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -3,6 +3,248 @@
<issue
id="NewApi"
+ message="Call requires API level S (current min is 14): `android.view.ContentInfo#getClip`"
+ errorLine1=" return mWrapped.getClip();"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ContentInfoCompat.java"
+ line="456"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 14): `android.view.ContentInfo#getSource`"
+ errorLine1=" return mWrapped.getSource();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ContentInfoCompat.java"
+ line="462"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 14): `android.view.ContentInfo#getFlags`"
+ errorLine1=" return mWrapped.getFlags();"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ContentInfoCompat.java"
+ line="468"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 14): `android.view.ContentInfo#getLinkUri`"
+ errorLine1=" return mWrapped.getLinkUri();"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ContentInfoCompat.java"
+ line="474"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 14): `android.view.ContentInfo#getExtras`"
+ errorLine1=" return mWrapped.getExtras();"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/view/ContentInfoCompat.java"
+ line="480"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 30): `new android.widget.EdgeEffect`"
+ errorLine1=" return new EdgeEffect(context, attrs);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="306"
+ column="24"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 30): `android.widget.EdgeEffect#onPullDistance`"
+ errorLine1=" return edgeEffect.onPullDistance(deltaDistance, displacement);"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="319"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 30): `android.widget.EdgeEffect#getDistance`"
+ errorLine1=" return edgeEffect.getDistance();"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/widget/EdgeEffectCompat.java"
+ line="329"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 14): `android.location.LocationRequest`"
+ errorLine1=" LocationRequest.class, Executor.class, LocationListener.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+ line="254"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 14): `android.location.LocationRequest`"
+ errorLine1=" LocationRequest.class, LocationListener.class, Looper.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+ line="278"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 14): `android.location.LocationRequest`"
+ errorLine1=" LocationRequest.class, LocationListener.class, Looper.class);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+ line="333"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 14): `android.location.LocationListener#onLocationChanged`"
+ errorLine1=" listener.onLocationChanged(locations);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+ line="692"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 14): `android.location.LocationListener#onFlushComplete`"
+ errorLine1=" listener.onFlushComplete(requestCode);"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationManagerCompat.java"
+ line="707"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 19): `android.location.LocationRequest`"
+ errorLine1=" sCreateFromDeprecatedProviderMethod = LocationRequest.class.getDeclaredMethod("
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationRequestCompat.java"
+ line="251"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 19): `android.location.LocationRequest`"
+ errorLine1=" (LocationRequest) sCreateFromDeprecatedProviderMethod.invoke(null, provider,"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationRequestCompat.java"
+ line="258"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 19): `android.location.LocationRequest`"
+ errorLine1=" sSetQualityMethod = LocationRequest.class.getDeclaredMethod("
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationRequestCompat.java"
+ line="266"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 19): `android.location.LocationRequest`"
+ errorLine1=" sSetFastestIntervalMethod = LocationRequest.class.getDeclaredMethod("
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationRequestCompat.java"
+ line="274"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 19): `android.location.LocationRequest`"
+ errorLine1=" sSetNumUpdatesMethod = LocationRequest.class.getDeclaredMethod("
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationRequestCompat.java"
+ line="284"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 19): `android.location.LocationRequest`"
+ errorLine1=" sSetExpireInMethod = LocationRequest.class.getDeclaredMethod("
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/core/location/LocationRequestCompat.java"
+ line="294"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 19): `android.location.LocationRequest#getQuality`"
+ errorLine1=" builder.build().toLocationRequest("test").getQuality());"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java"
+ line="107"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level S (current min is 19): `android.location.LocationRequest#getQuality`"
+ errorLine1=" assertEquals(QUALITY_HIGH_ACCURACY, builder.build().toLocationRequest("test").getQuality());"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java"
+ line="115"
+ column="87"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Class requires API level S (current min is 30): `android.location.LocationRequest`"
+ errorLine1=" sGetExpireInMethod = LocationRequest.class.getDeclaredMethod("getExpireIn");"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/location/LocationRequestCompatTest.java"
+ line="242"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="NewApi"
message="Call requires API level 24 (current min is 14): `java.util.Optional#of`"
errorLine1=" return Optional.of(modeCompat);"
errorLine2=" ~~">
@@ -773,6 +1015,127 @@
<issue
id="NewApi"
+ message="Call requires API level 29 (current min is 28): `COLOR_DODGE`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.COLOR_DODGE, null);"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="100"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `COLOR_BURN`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.COLOR_BURN, null);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="101"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `HARD_LIGHT`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.HARD_LIGHT, null);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="102"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `SOFT_LIGHT`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.SOFT_LIGHT, null);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="103"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `DIFFERENCE`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.DIFFERENCE, null);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="104"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `EXCLUSION`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.EXCLUSION, null);"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="105"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `MULTIPLY`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.MULTIPLY, null);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="108"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `HUE`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.HUE, null);"
+ errorLine2=" ~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="109"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `SATURATION`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.SATURATION, null);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="110"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `COLOR`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.COLOR, null);"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="111"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 29 (current min is 28): `LUMINOSITY`"
+ errorLine1=" verifyPorterDuffMatchesCompat(BlendModeCompat.LUMINOSITY, null);"
+ errorLine2=" ~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/graphics/PaintTest.java"
+ line="112"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="NewApi"
message="Call requires API level 29 (current min is 14): `android.graphics.Paint#getBlendMode`"
errorLine1=" assertEquals(blendMode, p.getBlendMode());"
errorLine2=" ~~~~~~~~~~~~">
@@ -1113,6 +1476,72 @@
</issue>
<issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `scenario`"
+ errorLine1=" scenario.onActivity {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt"
+ line="298"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `windowInsetsController`"
+ errorLine1=" windowInsetsController.systemBarsBehavior ="
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt"
+ line="299"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `scenario`"
+ errorLine1=" val decorView = scenario.withActivity { window.decorView }"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt"
+ line="302"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `scenario`"
+ errorLine1=" scenario.onActivity {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt"
+ line="315"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `windowInsetsController`"
+ errorLine1=" windowInsetsController.systemBarsBehavior ="
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt"
+ line="316"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 21): `scenario`"
+ errorLine1=" val decorView = scenario.withActivity { window.decorView }"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/core/view/WindowInsetsControllerCompatActivityTest.kt"
+ line="319"
+ column="25"/>
+ </issue>
+
+ <issue
id="WrongConstant"
message="Must be one or more of: AccessibilityEventCompat.CONTENT_CHANGE_TYPE_CONTENT_DESCRIPTION, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_STATE_DESCRIPTION, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_SUBTREE, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_TEXT, AccessibilityEventCompat.CONTENT_CHANGE_TYPE_UNDEFINED, but could be AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_TITLE, AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_APPEARED, AccessibilityEvent.CONTENT_CHANGE_TYPE_PANE_DISAPPEARED"
errorLine1=" return event.getContentChangeTypes();"
diff --git a/core/core/src/main/java/androidx/core/content/PackageManagerCompat.java b/core/core/src/main/java/androidx/core/content/PackageManagerCompat.java
index 4bdf096..8831564 100644
--- a/core/core/src/main/java/androidx/core/content/PackageManagerCompat.java
+++ b/core/core/src/main/java/androidx/core/content/PackageManagerCompat.java
@@ -99,16 +99,16 @@
* <li>{@link UnusedAppRestrictionsConstants#API_30_BACKPORT}: Unused App Restrictions
* introduced by Android API 30, and since made available on earlier (API 23-29) devices
* are enabled for this app:
- * <a href="https://developer.android.com/training/permissions/requesting?hl=hu
- * #auto-reset-permissions-unused-apps">permission auto-reset</a>.</li>
+ * <a href="https://developer.android.com/training/permissions/requesting#auto-reset-permissions-unused-apps"
+ * >permission auto-reset</a>.</li>
* <li>{@link UnusedAppRestrictionsConstants#API_30}: Unused App Restrictions introduced
* by Android API 30 are enabled for this app:
- * <a href="https://developer.android.com/training/permissions/requesting?hl=hu
- * #auto-reset-permissions-unused-apps">permission auto-reset</a>.</li>
+ * <a href="https://developer.android.com/training/permissions/requesting#auto-reset-permissions-unused-apps"
+ * >permission auto-reset</a>.</li>
* <li>{@link UnusedAppRestrictionsConstants#API_31}: Unused App Restrictions introduced
* by Android API 31 are enabled for this app:
- * <a href="https://developer.android.com/training/permissions/requesting?hl=hu
- * #auto-reset-permissions-unused-apps">permission auto-reset</a> and
+ * <a href="https://developer.android.com/training/permissions/requesting#auto-reset-permissions-unused-apps"
+ * >permission auto-reset</a> and
* <a href="https://developer.android.com/about/versions/12/behavior-changes-12#app-hibernation"
* >app hibernation</a>.</li>
* </ul>
diff --git a/core/core/src/main/java/androidx/core/content/UnusedAppRestrictionsConstants.java b/core/core/src/main/java/androidx/core/content/UnusedAppRestrictionsConstants.java
index f7eee70..2c3f0a2 100644
--- a/core/core/src/main/java/androidx/core/content/UnusedAppRestrictionsConstants.java
+++ b/core/core/src/main/java/androidx/core/content/UnusedAppRestrictionsConstants.java
@@ -47,8 +47,8 @@
/**
* Unused App Restrictions introduced by Android API 30, and since made available on earlier
* (API 23-29) devices are enabled for this app:
- * <a href="https://developer.android.com/training/permissions/requesting?hl=hu
- * #auto-reset-permissions-unused-apps">permission auto-reset</a>.
+ * <a href="https://developer.android.com/training/permissions/requesting#auto-reset-permissions-unused-apps"
+ * >permission auto-reset</a>.
*
* Note: This value is only used on API 29 or earlier devices.
*/
@@ -56,8 +56,8 @@
/**
* Unused App Restrictions introduced by Android API 30 are enabled for this app:
- * <a href="https://developer.android.com/training/permissions/requesting?hl=hu
- * #auto-reset-permissions-unused-apps">permission auto-reset</a>.
+ * <a href="https://developer.android.com/training/permissions/requesting#auto-reset-permissions-unused-apps"
+ * >permission auto-reset</a>.
*
* Note: This value is only used on API 30 or later devices.
*/
@@ -65,8 +65,8 @@
/**
* Unused App Restrictions introduced by Android API 31 are enabled for this app:
- * <a href="https://developer.android.com/training/permissions/requesting?hl=hu
- * #auto-reset-permissions-unused-apps">permission auto-reset</a> and
+ * <a href="https://developer.android.com/training/permissions/requesting#auto-reset-permissions-unused-apps"
+ * >permission auto-reset</a> and
* <a href="https://developer.android.com/about/versions/12/behavior-changes-12#app-hibernation"
* >app hibernation</a>.
*
diff --git a/datastore/datastore-sampleapp/build.gradle b/datastore/datastore-sampleapp/build.gradle
index 66a40e7..9d7572c 100644
--- a/datastore/datastore-sampleapp/build.gradle
+++ b/datastore/datastore-sampleapp/build.gradle
@@ -48,8 +48,6 @@
// For kotlin serialization
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.0.1")
-
- compileOnly(project(":annotation:annotation-sampled"))
}
protobuf {
diff --git a/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt b/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt
index fbc126a..b8ed192 100644
--- a/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt
+++ b/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/PreferencesDataStoreActivity.kt
@@ -22,7 +22,6 @@
import android.util.Log
import android.widget.Button
import android.widget.TextView
-import androidx.annotation.Sampled
import androidx.appcompat.app.AppCompatActivity
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.emptyPreferences
@@ -45,7 +44,6 @@
private val PREFERENCE_STORE_FILE_NAME = "datastore_test_app"
private val COUNTER_KEY = intPreferencesKey("counter")
- @Sampled
override fun onCreate(savedInstanceState: Bundle?) {
// Strict mode allows us to check that no writes or reads are blocking the UI thread.
StrictMode.setThreadPolicy(
@@ -62,7 +60,6 @@
setUpPreferenceStoreUi()
}
- @Sampled
private fun setUpPreferenceStoreUi() {
// Using preferenceStore:
findViewById<Button>(R.id.counter_dec).setOnClickListener {
diff --git a/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/ProtoDataStoreActivity.kt b/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/ProtoDataStoreActivity.kt
index 1956c6b..1bce259 100644
--- a/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/ProtoDataStoreActivity.kt
+++ b/datastore/datastore-sampleapp/src/main/java/com/example/datastoresampleapp/ProtoDataStoreActivity.kt
@@ -21,7 +21,6 @@
import android.util.Log
import android.widget.Button
import android.widget.TextView
-import androidx.annotation.Sampled
import androidx.appcompat.app.AppCompatActivity
import androidx.datastore.core.CorruptionException
import androidx.datastore.core.DataStore
@@ -51,7 +50,6 @@
) { File(applicationContext.filesDir, PROTO_STORE_FILE_NAME) }
}
- @Sampled
override fun onCreate(savedInstanceState: Bundle?) {
// Strict mode allows us to check that no writes or reads are blocking the UI thread.
StrictMode.setThreadPolicy(
@@ -68,7 +66,6 @@
setUpProtoDataStoreUi()
}
- @Sampled
private fun setUpProtoDataStoreUi() {
findViewById<Button>(R.id.counter_dec).setOnClickListener {
lifecycleScope.launch {
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index 2a5d306..333a3bd 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -136,6 +136,12 @@
# > Task :buildSrc:build
# > Configure project :appsearch:appsearch\-local\-backend
Configuration on demand is an incubating feature\.
+Configuration cache is an incubating feature\.
+Calculating task graph as configuration cache cannot be reused because environment variable '.*' has changed\.
+Calculating task graph as configuration cache cannot be reused because file '[^ ]*' has changed\.
+Calculating task graph as no configuration cache is available for tasks:.*
+Reusing configuration cache\.
+Calculating task graph as configuration cache cannot be reused because an input to task '[^ ]*' has changed\.
Type\-safe dependency accessors is an incubating feature\.
# > Configure project :
updated local\.properties
@@ -158,11 +164,13 @@
\* jvmMain
# > Task :listTaskOutputs
Wrote \$DIST_DIR/task_outputs\.txt
+[0-9]+ problem was found reusing the configuration cache\.
Deprecated Gradle features were used in this build, making it incompatible with Gradle [0-9]+\.[0-9]+\.
See https://docs.gradle.org/.*/userguide/command_line_interface\.html#sec:command_line_warnings
Execution optimizations have been disabled for [0-9]+ invalid unit\(s\) of work during this build to ensure correctness\.
Please consult deprecation warnings for more details\.
BUILD SUCCESSFUL in .*
+Configuration cache entry reused with [0-9]+ problem\.
# > Task :doclava:compileJava
Note\: Some input files use or override a deprecated API\.
Note: Some input files use or override a deprecated API that is marked for removal\.
@@ -218,8 +226,16 @@
location\: class PendingIntent
\$OUT_DIR\/androidx\/docs\-public\/build\/unzippedDocsSources\/androidx\/work\/impl\/utils\/ForceStopRunnable\.java\:[0-9]+\: error\: cannot find symbol
# > Task :buildOnServer
+[0-9]+ problems were found reusing the configuration cache, [0-9]+ of which seem unique\.
+\- Task `:docs\-tip\-of\-tree:unzipSampleSources` of type `org\.gradle\.api\.tasks\.Sync`: cannot deserialize object of type 'org\.gradle\.api\.Project' as these are not supported with the configuration cache\.
[0-9]+ actionable tasks: [0-9]+ executed, [0-9]+ up\-to\-date
+Configuration cache entry reused with [0-9]+ problems\.
+See the profiling report at: file://\$GRADLE_USER_HOME/daemon/[0-9]+\.[0-9]+/reports/profile/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
+Configuration cache entry reused\.
+Configuration cache entry stored with [0-9]+ problems\.
+Configuration cache entry stored with [0-9] problem\.
[0-9]+ actionable tasks: [0-9]+ executed, [0-9]+ from cache
+Configuration cache entry stored\.
See the profiling report at\: file\:\/\/\$OUT_DIR\/androidx\/build\/reports\/profile\/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
See the profiling report at\: file\:\/\/\$OUT_DIR\/gradle\/external\/doclava\/build\/reports\/profile\/profile\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\-[0-9]+\.html
# > Task :lifecycle:lifecycle-common:compileJava
@@ -289,6 +305,37 @@
w\: \$CHECKOUT\/prebuilts\/androidx\/external\/org\/jetbrains\/kotlin\/kotlin\-stdlib\-common\/[0-9]+\.[0-9]+\.[0-9]+\/kotlin\-stdlib\-common\-[0-9]+\.[0-9]+\.[0-9]+\.jar\: Runtime JAR file has version [0-9]+\.[0-9]+ which is older than required for API version [0-9]+\.[0-9]+
# > Task :compose:material:material:icons:generator:zipHtmlResultsOfTest
Html results of .* zipped into.*\.zip
+[0-9]+ problems were found storing the configuration cache, [0-9]+ of which seem unique\.
+\- Task `:docs\-tip\-of\-tree:unzipSampleSources` of type `org\.gradle\.api\.tasks\.Sync`: cannot serialize object of type 'org\.gradle\.api\.internal\.artifacts\.configurations\.DefaultConfiguration', a subtype of 'org\.gradle\.api\.artifacts\.Configuration', as these are not supported with the configuration cache\.
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:disallowed_types
+\- Task `:docs\-tip\-of\-tree:unzipSampleSources` of type `org\.gradle\.api\.tasks\.Sync`: cannot deserialize object of type 'org\.gradle\.api\.artifacts\.Configuration' as these are not supported with the configuration cache\.
+\- Task `:docs\-tip\-of\-tree:unzipSampleSources` of type `org\.gradle\.api\.tasks\.Sync`: value 'file collection' is not assignable to 'org\.gradle\.api\.artifacts\.Configuration'
+\- Task `:docs\-tip\-of\-tree:unzipSourcesForDackka` of type `org\.gradle\.api\.tasks\.Sync`: cannot deserialize object of type 'org\.gradle\.api\.Project' as these are not supported with the configuration cache\.
+\- Task `:docs\-tip\-of\-tree:unzipSourcesForDackka` of type `org\.gradle\.api\.tasks\.Sync`: cannot deserialize object of type 'org\.gradle\.api\.artifacts\.Configuration' as these are not supported with the configuration cache\.
+\- Task `:docs\-tip\-of\-tree:unzipSourcesForDackka` of type `org\.gradle\.api\.tasks\.Sync`: value 'file collection' is not assignable to 'org\.gradle\.api\.artifacts\.Configuration'
+\- Task `:activity:activity\-compose:compile[^ ]*Kotlin` of type `org\.jetbrains\.kotlin\.gradle\.tasks\.KotlinCompileWithWorkers`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+\- Task `:activity:activity\-compose:integration\-tests:activity\-demos:compile[^ ]*Kotlin` of type `org\.jetbrains\.kotlin\.gradle\.tasks\.KotlinCompileWithWorkers`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+\- Task `:activity:activity\-compose:activity\-compose\-samples:compile[^ ]*Kotlin` of type `org\.jetbrains\.kotlin\.gradle\.tasks\.KotlinCompileWithWorkers`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+\- Task `:camera:integration\-tests:camera\-testapp\-view:compile[^ ]*Kotlin` of type `org\.jetbrains\.kotlin\.gradle\.tasks\.KotlinCompileWithWorkers`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+\- Task `:compose:animation:animation\-core:animation\-core\-benchmark:compile[^ ]*Kotlin` of type `org\.jetbrains\.kotlin\.gradle\.tasks\.KotlinCompileWithWorkers`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+\- Task `:compose:animation:animation\-core:animation\-core\-samples:compile[^ ]*Kotlin` of type `org\.jetbrains\.kotlin\.gradle\.tasks\.KotlinCompileWithWorkers`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+\- Task `:docs\-tip\-of\-tree:unzipSampleSources` of type `org\.gradle\.api\.tasks\.Sync`: cannot serialize object of type 'org\.gradle\.api\.internal\.project\.DefaultProject', a subtype of 'org\.gradle\.api\.Project', as these are not supported with the configuration cache\.
+[0-9]+ problem was found storing the configuration cache.
+\- Task `:listTaskOutputs` of type `androidx\.build\.ListTaskOutputsTask`: invocation of 'Task\.project' at execution time is unsupported\.
+\- Task `[^ ]*checkExternalLicenses` of type `[^ ]*CheckExternalDependencyLicensesTask`: invocation of 'Task\.project' at execution time is unsupported\.
+\- Plugin class 'androidx\.build\.AndroidXImplPlugin': read system property 'user\.dir'
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:undeclared_sys_prop_read
+\- Task `[^ ]*generateInspectionPlatformVersionRelease` of type `androidx\.inspection\.gradle\.GenerateInspectionPlatformVersionTask`: invocation of 'Task\.project' at execution time is unsupported\.
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:use_project_during_execution
+\- Task `[^ ]*validateProperties` of type `[^ ]*ValidatePropertiesTask`: invocation of 'Task\.project' at execution time is unsupported\.
+\- Task `[^ ]*verifyDependencyVersions` of type `[^ ]*VerifyDependencyVersionsTask`: invocation of 'Task\.project' at execution time is unsupported\.
+\- Task `[^ ]*createLibraryBuildInfoFiles` of type `[^ ]*CreateLibraryBuildInfoFileTask`: invocation of 'Task\.project' at execution time is unsupported\.
+\- Task `[^ ]* of type `org\.gradle\.api\.tasks\.testing\.Test`: cannot serialize object of type 'org\.gradle\.api\.tasks\.bundling\.Zip', a subtype of 'org\.gradle\.api\.Task', as these are not supported with the configuration cache\.
+See https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/configuration_cache\.html\#config_cache:requirements:task_access
+\- Task [^ ]* of type `com\.android\.build\.gradle\.tasks\.factory\.AndroidUnitTest`: cannot serialize object of type 'org\.gradle\.api\.tasks\.bundling\.Zip', a subtype of 'org\.gradle\.api\.Task', as these are not supported with the configuration cache\.
+plus [0-9]+ more problems\. Please see the report for details\.
+See the complete report at file://\$SUPPORT/build/reports/configuration\-cache/[^/]*/[^/]*/configuration\-cache\-report\.html
+See the complete report at file://\$OUT_DIR/androidx/build/reports/configuration\-cache/[^ ]*/[^ ]*/configuration\-cache\-report\.html
# > Task :annotation:annotation-experimental-lint:test
WARNING: An illegal reflective access operation has occurred
WARNING: Please consider reporting this to the maintainers of org\.jetbrains\.kotlin\.kapt[0-9]+\.base\.javac\.KaptJavaFileManager
@@ -320,8 +367,8 @@
compiler or generated code\. Use it at your own risk\!
# > Task :compose:ui:ui-util:compileReleaseKotlin
\-XXLanguage\:\+InlineClasses
-# > Task :docs-public:lintRelease
-Wrote HTML report to file://\$OUT_DIR/androidx/docs\-public/build/reports/lint\-results\-release\.html
+# > Task :docs-public:lintDebug
+Wrote HTML report to file://\$OUT_DIR/androidx/docs\-public/build/reports/lint\-results\-debug\.html
# > Task :camera:camera-core:compileDebugJavaWithJavac
warning: unknown enum constant AnnotationRetention\.BINARY
# > Task :compose:ui:ui:processDebugUnitTestManifest
@@ -538,8 +585,8 @@
# > Task :stripArchiveForPartialDejetification
Execution optimizations have been disabled for task ':stripArchiveForPartialDejetification' to ensure correctness due to the following reasons:
\- Gradle detected a problem with the following location: '\$DIST_DIR/top\-of\-tree\-m2repository\-all\-.*.zip'\. Reason: Task ':stripArchiveForPartialDejetification' uses this output of task ':benchmark:benchmark\-gradle\-plugin:buildOnServer' without declaring an explicit or implicit dependency\. This can lead to incorrect results being produced, depending on what order the tasks are executed\. Please refer to https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/validation_problems\.html\#implicit_dependency for more details about this problem\.
-# > Task :icing:lintRelease
-Wrote HTML report to file://\$OUT_DIR/androidx/icing/build/reports/lint\-results\-release\.html
+# > Task :icing:lintDebug
+Wrote HTML report to file://\$OUT_DIR/androidx/icing/build/reports/lint\-results\-debug\.html
# https://youtrack.jetbrains.com/issue/KT-30589
WARNING: Illegal reflective access by org\.jetbrains\.kotlin\.kapt3\.base\.javac\.KaptJavaFileManager .* to method com\.sun\.tools\.javac\.file\.BaseFileManager\.handleOption\(com\.sun\.tools\.javac\.main\.Option,java\.lang\.String\)
# > Task :benchmark:benchmark-macro:compileReleaseKotlin
@@ -607,5 +654,7 @@
To honour the JVM settings for this build a single\-use Daemon process will be forked.*
# > Task :work:work-benchmark:processReleaseAndroidTestManifest
\$SUPPORT/work/work\-benchmark/src/androidTest/AndroidManifest\.xml:[0-9]+:[0-9]+\-[0-9]+:[0-9]+ Warning:
-# > Task :lint-checks:integration-tests:copyReleaseAndroidLintReports
-Copying lint text report to \$OUT_DIR/androidx/lint\-checks/integration\-tests/build/lint\-results\-release\.txt
\ No newline at end of file
+[0-9]+ problems were found storing the configuration cache\.
+[0-9]+ problems were found storing the configuration cache, [0-9]+ of which seems unique\.
+# > Task :car:app:app:generateProtocolApi
+\- Task `:car:app:app:generateProtocolApi` of type `GenerateProtocolApiTask`: invocation of 'Task\.project' at execution time is unsupported\.
diff --git a/development/importMaven/build.gradle.kts b/development/importMaven/build.gradle.kts
index 8dd0eaa..966f125 100644
--- a/development/importMaven/build.gradle.kts
+++ b/development/importMaven/build.gradle.kts
@@ -116,30 +116,27 @@
artifact()
}
}
+ maven {
+ url = uri("https://maven.pkg.jetbrains.space/public/p/compose/dev")
+ metadataSources {
+ artifact()
+ }
+ }
}
- ivy {
- setUrl("https://download.jetbrains.com/kotlin/native/builds/releases")
- patternLayout {
- artifact("[revision]/macos/[artifact]-[revision].[ext]")
- }
- metadataSources {
- artifact()
- }
- content {
- includeGroup("")
- }
- }
- ivy {
- setUrl("https://download.jetbrains.com/kotlin/native/builds/releases")
- patternLayout {
- artifact("[revision]/linux/[artifact]-[revision].[ext]")
- }
- metadataSources {
- artifact()
- }
- content {
- includeGroup("")
+
+ listOf("macos", "macos-x86_64", "linux", "linux-x86_64").forEach { platstring ->
+ ivy {
+ setUrl("https://download.jetbrains.com/kotlin/native/builds/releases")
+ patternLayout {
+ artifact("[revision]/$platstring/[artifact]-[revision].[ext]")
+ }
+ metadataSources {
+ artifact()
+ }
+ content {
+ includeGroup("")
+ }
}
}
}
diff --git a/development/importMaven/import_maven_artifacts.py b/development/importMaven/import_maven_artifacts.py
index 10875fa..50e8261 100755
--- a/development/importMaven/import_maven_artifacts.py
+++ b/development/importMaven/import_maven_artifacts.py
@@ -60,7 +60,7 @@
if ("kotlin-native-linux" in artifact_name): artifact_name = fix_kotlin_native(artifact_name)
# Add -Dorg.gradle.debug=true to debug or --stacktrace to see the stack trace
- command = './gradlew --build-file build.gradle.kts -PartifactName=%s' % (
+ command = './gradlew --build-file build.gradle.kts --no-configuration-cache -PartifactName=%s' % (
artifact_name)
metalava_build_id = parse_result.metalava_build_id
if (metalava_build_id):
diff --git a/development/project-creator/create_project.py b/development/project-creator/create_project.py
index 31c8f90..7501453 100755
--- a/development/project-creator/create_project.py
+++ b/development/project-creator/create_project.py
@@ -19,6 +19,8 @@
import argparse
from datetime import date
import subprocess
+from enum import Enum
+from textwrap import dedent
from shutil import rmtree
from shutil import copyfile
from distutils.dir_util import copy_tree
@@ -32,6 +34,7 @@
SAMPLE_JAVA_SRC_FP = os.path.abspath(os.path.join(os.getcwd(), 'java-template', 'groupId', 'artifactId'))
SAMPLE_KOTLIN_SRC_FP = os.path.abspath(os.path.join(os.getcwd(), 'kotlin-template', 'groupId', 'artifactId'))
SAMPLE_COMPOSE_SRC_FP = os.path.abspath(os.path.join(os.getcwd(), 'compose-template', 'groupId', 'artifactId'))
+NATIVE_SRC_FP = os.path.abspath(os.path.join(os.getcwd(), 'native-template', 'groupId', 'artifactId'))
SETTINGS_GRADLE_FP = os.path.abspath(os.path.join(os.getcwd(), '..', '..', "settings.gradle"))
LIBRARY_VERSIONS_REL = './buildSrc/public/src/main/kotlin/androidx/build/LibraryVersions.kt'
LIBRARY_VERSIONS_FP = os.path.join(FRAMEWORKS_SUPPORT_FP, LIBRARY_VERSIONS_REL)
@@ -50,6 +53,12 @@
'artifact_id',
help='artifact_id for the new library')
+
+class ProjectType(Enum):
+ KOTLIN = 0
+ JAVA = 1
+ NATIVE = 2
+
def print_e(*args, **kwargs):
print(*args, file=sys.stderr, **kwargs)
@@ -127,6 +136,12 @@
return None
return new_file_path
+def create_file(path):
+ """
+ Creates an empty file if it does not already exist.
+ """
+ open(path, "a").close()
+
def generate_package_name(group_id, artifact_id):
final_group_id_word = group_id.split(".")[-1]
artifact_id_suffix = artifact_id.replace(final_group_id_word, "")
@@ -184,6 +199,29 @@
if reply[0] == 'n': return False
print("Please respond with y/n")
+def ask_project_type():
+ """Asks the user which type of project they wish to create"""
+ message = dedent("""
+ Please choose the type of project you would like to create:
+ 1: Kotlin (AAR)
+ 2: Java (AAR / JAR)
+ 3: Native (AAR)
+ """).strip()
+ while(True):
+ reply = str(input(message + "\n")).strip()
+ if reply == "1": return ProjectType.KOTLIN
+ if reply == "2":
+ if confirm_java_project_type():
+ return ProjectType.JAVA
+ if reply == "3": return ProjectType.NATIVE
+ print("Please respond with one of the presented options")
+
+def confirm_java_project_type():
+ return ask_yes_or_no("All new androidx projects are expected and encouraged "
+ "to use Kotlin. Java projects should only be used if "
+ "there is a business need to do so. "
+ "Please ack to proceed:")
+
def ask_library_purpose():
question = ("Project description (please complete the sentence): "
"This library makes it easy for developers to... ")
@@ -278,7 +316,7 @@
group_id.replace(".", "/")
return full_artifact_path + group_id_subpath
-def get_package_documentation_filename(group_id, artifact_id, is_kotlin_project):
+def get_package_documentation_filename(group_id, artifact_id, project_type):
"""Generates the documentation filename
Given androidx.foo.bar:bar-qux, the structure will be:
@@ -292,28 +330,18 @@
artifact_id: group_id of the new library
is_kotlin_project: whether or not the library is a kotin project
"""
- if is_kotlin_project:
+ if project_type == ProjectType.JAVA:
+ return "package-info.java"
+ else:
formatted_group_id = group_id.replace(".", "-")
return "%s-%s-documentation.md" % (formatted_group_id, artifact_id)
- else:
- return "package-info.java"
-def ask_if_kotlin_project(group_id, artifact_id):
- """Asks the user if the project is a kotlin or java project
+def is_compose_project(group_id, artifact_id):
+ """Returns true if project can be inferred to be a compose / Kotlin project
"""
- if "compose" in group_id or "compose" in artifact_id:
- return True
- elif ask_yes_or_no("Is this a kotlin project?"):
- return True
- else:
- # Confirm that the user is intentionally using java.
- ask_yes_or_no("All new androidx projects are expected and encouraged "
- "to use Kotlin. Java projects should only be used if "
- "there is a business need to do so. "
- "Please ack to proceed:")
- return False
+ return "compose" in group_id or "compose" in artifact_id
-def create_directories(group_id, artifact_id, is_kotlin_project):
+def create_directories(group_id, artifact_id, project_type, is_compose_project):
"""Creates the standard directories for the given group_id and artifact_id.
Given androidx.foo.bar:bar-qux, the structure will be:
@@ -338,21 +366,22 @@
copyfile(SAMPLE_OWNERS_FP, group_id_path + "/OWNERS")
# Copy the full src structure, depending on the project source code
- is_compose_project = False
- if "compose" in group_id or "compose" in artifact_id:
+ if is_compose_project:
print("Auto-detected Compose project.")
cp(SAMPLE_COMPOSE_SRC_FP, full_artifact_path)
- is_compose_project = True
- elif is_kotlin_project:
+ elif project_type == ProjectType.NATIVE:
+ cp(NATIVE_SRC_FP, full_artifact_path)
+ elif project_type == ProjectType.KOTLIN:
cp(SAMPLE_KOTLIN_SRC_FP, full_artifact_path)
else:
cp(SAMPLE_JAVA_SRC_FP, full_artifact_path)
# Java only libraries have no dependency on android.
# Java-only produces a jar, whereas an android library produces an aar.
- if (get_library_type(artifact_id) == "LINT" or
+ if (project_type == ProjectType.JAVA and
+ (get_library_type(artifact_id) == "LINT" or
ask_yes_or_no("Is this a java-only library? Java-only libraries produce"
- " JARs, whereas Android libraries produce AARs.")):
+ " JARs, whereas Android libraries produce AARs."))):
sed("com.android.library", "java-library",
full_artifact_path + "/build.gradle")
sed("org.jetbrains.kotlin.android", "kotlin",
@@ -373,7 +402,7 @@
# Set up the package documentation.
full_package_docs_dir = get_package_documentation_file_dir(group_id, artifact_id)
- package_docs_filename = get_package_documentation_filename(group_id, artifact_id, is_kotlin_project)
+ package_docs_filename = get_package_documentation_filename(group_id, artifact_id, project_type)
full_package_docs_file = os.path.join(full_package_docs_dir, package_docs_filename)
# Compose projects use multiple main directories, so we handle it separately
if is_compose_project:
@@ -382,8 +411,9 @@
package_docs_filename)
mv_dir(full_artifact_path + "/src/commonMain/kotlin/groupId", full_package_docs_dir)
else:
- if is_kotlin_project:
+ if project_type != ProjectType.JAVA:
# Kotlin projects use -documentation.md files, so we need to rename it appropriately.
+ # We also rename this file for native projects in case they also have public Kotlin APIs
rename_file(full_artifact_path + "/src/main/groupId/artifactId-documentation.md",
package_docs_filename)
mv_dir(full_artifact_path + "/src/main/groupId", full_package_docs_dir)
@@ -418,6 +448,10 @@
sed("<GROUPID>", group_id_version_macro, full_artifact_path + "/build.gradle")
# Update the name and description in the build.gradle
sed("<NAME>", group_id + ":" + artifact_id, full_artifact_path + "/build.gradle")
+ if project_type == ProjectType.NATIVE:
+ sed("<NAME>", artifact_id, full_artifact_path + "/src/main/cpp/CMakeLists.txt")
+ sed("<TARGET>", artifact_id, full_artifact_path + "/build.gradle")
+ create_file(full_artifact_path + "/src/main/cpp/" + artifact_id + ".cpp")
sed("<DESCRIPTION>", project_description, full_artifact_path + "/build.gradle")
@@ -437,7 +471,7 @@
"""
build_type = "MAIN"
- if ("compose" in group_id or "compose" in artifact_id):
+ if (is_compose_project(group_id, artifact_id)):
build_type = "COMPOSE"
gradle_cmd = get_gradle_project_coordinates(group_id, artifact_id)
@@ -666,7 +700,7 @@
# The group id does not exist yet, so just default to false.
return False
-def print_todo_list(group_id, artifact_id, is_kotlin_project):
+def print_todo_list(group_id, artifact_id, project_type):
"""Prints to the todo list once the script has finished.
There are some pieces that can not be automated or require human eyes.
@@ -682,7 +716,7 @@
owners_file_path = get_group_id_path(group_id) + "/OWNERS"
package_docs_path = os.path.join(
get_package_documentation_file_dir(group_id, artifact_id),
- get_package_documentation_filename(group_id, artifact_id, is_kotlin_project))
+ get_package_documentation_filename(group_id, artifact_id, project_type))
print("---\n")
print("Created the project. The following TODOs need to be completed by "
"you:\n")
@@ -707,9 +741,16 @@
sys.exit(1)
if not validate_name(args.group_id, args.artifact_id):
sys.exit(1)
-
- is_kotlin_project = ask_if_kotlin_project(args.group_id, args.artifact_id)
- create_directories(args.group_id, args.artifact_id, is_kotlin_project)
+ if is_compose_project(args.group_id, args.artifact_id):
+ project_type = ProjectType.KOTLIN
+ else:
+ project_type = ask_project_type()
+ create_directories(
+ args.group_id,
+ args.artifact_id,
+ project_type,
+ is_compose_project(args.group_id, args.artifact_id)
+ )
update_settings_gradle(args.group_id, args.artifact_id)
insert_new_group_id_into_library_versions_kt(args.group_id,
args.artifact_id)
@@ -720,7 +761,7 @@
print("done.")
else:
print("failed. Please investigate manually.")
- print_todo_list(args.group_id, args.artifact_id, is_kotlin_project)
+ print_todo_list(args.group_id, args.artifact_id, project_type)
if __name__ == '__main__':
main(sys.argv)
diff --git a/development/project-creator/native-template/groupId/OWNERS b/development/project-creator/native-template/groupId/OWNERS
new file mode 100644
index 0000000..15331e5
--- /dev/null
+++ b/development/project-creator/native-template/groupId/OWNERS
@@ -0,0 +1 @@
+# example@google.com
diff --git a/development/project-creator/native-template/groupId/artifactId/api/current.txt b/development/project-creator/native-template/groupId/artifactId/api/current.txt
new file mode 100644
index 0000000..da4f6cc
--- /dev/null
+++ b/development/project-creator/native-template/groupId/artifactId/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 3.0
diff --git a/development/project-creator/native-template/groupId/artifactId/build.gradle b/development/project-creator/native-template/groupId/artifactId/build.gradle
new file mode 100644
index 0000000..30a52d5
--- /dev/null
+++ b/development/project-creator/native-template/groupId/artifactId/build.gradle
@@ -0,0 +1,66 @@
+/*
+ * Copyright (C) <YEAR> The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.LibraryVersions
+
+plugins {
+ id("AndroidXPlugin")
+ id("com.android.library")
+ id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+ api(libs.kotlinStdlib)
+ // Add dependencies here
+}
+
+androidx {
+ name = "<NAME>"
+ type = LibraryType.<LIBRARY_TYPE>
+ mavenVersion = LibraryVersions.<GROUPID>
+ mavenGroup = LibraryGroups.<GROUPID>
+ inceptionYear = "<YEAR>"
+ description = "<DESCRIPTION>"
+}
+
+android {
+ defaultConfig {
+ externalNativeBuild {
+ cmake {
+ arguments "=DANDROID_STL=c++_shared"
+ targets "<TARGET>"
+ }
+ }
+ }
+ externalNativeBuild {
+ cmake {
+ version "3.10.2"
+ path "src/main/cpp/CMakeLists.txt"
+ }
+ }
+
+ buildFeatures {
+ prefabPublishing true
+ }
+
+ prefab {
+ <TARGET> {
+ headers "src/main/cpp/include"
+ }
+ }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml b/development/project-creator/native-template/groupId/artifactId/src/androidTest/AndroidManifest.xml
similarity index 66%
copy from glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
copy to development/project-creator/native-template/groupId/artifactId/src/androidTest/AndroidManifest.xml
index 86afc60..fc95144 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
+++ b/development/project-creator/native-template/groupId/artifactId/src/androidTest/AndroidManifest.xml
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright <YEAR> The Android Open 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 +14,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="<PACKAGE>.test">
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView2"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+</manifest>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml b/development/project-creator/native-template/groupId/artifactId/src/main/AndroidManifest.xml
similarity index 66%
copy from glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
copy to development/project-creator/native-template/groupId/artifactId/src/main/AndroidManifest.xml
index 86afc60..b5e2156 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
+++ b/development/project-creator/native-template/groupId/artifactId/src/main/AndroidManifest.xml
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright <YEAR> The Android Open 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 +14,7 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="<PACKAGE>">
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView2"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+</manifest>
\ No newline at end of file
diff --git a/development/project-creator/native-template/groupId/artifactId/src/main/cpp/CMakeLists.txt b/development/project-creator/native-template/groupId/artifactId/src/main/cpp/CMakeLists.txt
new file mode 100644
index 0000000..f125827
--- /dev/null
+++ b/development/project-creator/native-template/groupId/artifactId/src/main/cpp/CMakeLists.txt
@@ -0,0 +1,7 @@
+cmake_minimum_required(VERSION 3.10.2)
+
+project(<NAME> LANGUAGES CXX)
+
+add_library(<NAME>
+ SHARED
+ <NAME>.cpp)
\ No newline at end of file
diff --git a/development/project-creator/native-template/groupId/artifactId/src/main/groupId/artifactId-documentation.md b/development/project-creator/native-template/groupId/artifactId/src/main/groupId/artifactId-documentation.md
new file mode 100644
index 0000000..a37b120
--- /dev/null
+++ b/development/project-creator/native-template/groupId/artifactId/src/main/groupId/artifactId-documentation.md
@@ -0,0 +1,7 @@
+# Module root
+
+<GROUPID> <ARTIFACTID>
+
+# Package <PACKAGE>
+
+Insert package level documentation here
diff --git a/development/project-creator/test_project_creator.py b/development/project-creator/test_project_creator.py
index 57a7b79..2cbc88f 100755
--- a/development/project-creator/test_project_creator.py
+++ b/development/project-creator/test_project_creator.py
@@ -83,28 +83,31 @@
def test_get_package_documentation_filename(self):
frameworks_support_fp = os.path.abspath(os.path.join(os.getcwd(), '..', '..'))
- package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", True)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", ProjectType.KOTLIN)
self.assertEqual("androidx-foo-foo-documentation.md", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo-bar", True)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", ProjectType.NATIVE)
+ self.assertEqual("androidx-foo-foo-documentation.md", package_info_dir_filename)
+
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo-bar", ProjectType.KOTLIN)
self.assertEqual("androidx-foo-foo-bar-documentation.md", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar", True)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar", ProjectType.KOTLIN)
self.assertEqual("androidx-foo-bar-bar-documentation.md", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar-qux", True)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar-qux", ProjectType.KOTLIN)
self.assertEqual("androidx-foo-bar-bar-qux-documentation.md", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", False)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo", ProjectType.JAVA)
self.assertEqual("package-info.java", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo-bar", False)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo", "foo-bar", ProjectType.JAVA)
self.assertEqual("package-info.java", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar", False)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar", ProjectType.JAVA)
self.assertEqual("package-info.java", package_info_dir_filename)
- package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar-qux", False)
+ package_info_dir_filename = get_package_documentation_filename("androidx.foo.bar", "bar-qux", ProjectType.JAVA)
self.assertEqual("package-info.java", package_info_dir_filename)
def test_group_id_directory_name(self):
diff --git a/docs-public/build.gradle b/docs-public/build.gradle
index ef400dd..3751f03 100644
--- a/docs-public/build.gradle
+++ b/docs-public/build.gradle
@@ -4,16 +4,16 @@
}
dependencies {
- docs("androidx.activity:activity:1.4.0-alpha02")
- docs("androidx.activity:activity-compose:1.4.0-alpha02")
- samples("androidx.activity:activity-compose-samples:1.4.0-alpha02")
- docs("androidx.activity:activity-ktx:1.4.0-alpha02")
+ docs("androidx.activity:activity:1.4.0-beta01")
+ docs("androidx.activity:activity-compose:1.4.0-beta01")
+ samples("androidx.activity:activity-compose-samples:1.4.0-beta01")
+ docs("androidx.activity:activity-ktx:1.4.0-beta01")
docs("androidx.ads:ads-identifier:1.0.0-alpha04")
docs("androidx.ads:ads-identifier-provider:1.0.0-alpha04")
- docs("androidx.annotation:annotation:1.3.0-alpha01")
+ docs("androidx.annotation:annotation:1.3.0-beta01")
docs("androidx.annotation:annotation-experimental:1.2.0-alpha01")
- docs("androidx.appcompat:appcompat:1.4.0-alpha03")
- docs("androidx.appcompat:appcompat-resources:1.4.0-alpha03")
+ docs("androidx.appcompat:appcompat:1.4.0-beta01")
+ docs("androidx.appcompat:appcompat-resources:1.4.0-beta01")
docs("androidx.appsearch:appsearch:1.0.0-alpha03")
docs("androidx.appsearch:appsearch-ktx:1.0.0-alpha03")
docs("androidx.appsearch:appsearch-local-storage:1.0.0-alpha03")
@@ -23,20 +23,20 @@
docs("androidx.arch.core:core-testing:2.1.0")
docs("androidx.asynclayoutinflater:asynclayoutinflater:1.0.0")
docs("androidx.autofill:autofill:1.2.0-beta01")
- docs("androidx.benchmark:benchmark-common:1.1.0-alpha07")
- docs("androidx.benchmark:benchmark-junit4:1.1.0-alpha07")
- docs("androidx.benchmark:benchmark-macro:1.1.0-alpha07")
- docs("androidx.benchmark:benchmark-macro-junit4:1.1.0-alpha07")
+ docs("androidx.benchmark:benchmark-common:1.1.0-alpha08")
+ docs("androidx.benchmark:benchmark-junit4:1.1.0-alpha08")
+ docs("androidx.benchmark:benchmark-macro:1.1.0-alpha08")
+ docs("androidx.benchmark:benchmark-macro-junit4:1.1.0-alpha08")
docs("androidx.biometric:biometric:1.2.0-alpha03")
docs("androidx.biometric:biometric-ktx:1.2.0-alpha03")
samples("androidx.biometric:biometric-ktx-samples:1.2.0-alpha03")
- docs("androidx.browser:browser:1.4.0-alpha01")
+ docs("androidx.browser:browser:1.4.0-beta01")
docs("androidx.camera:camera-camera2:1.1.0-alpha08")
docs("androidx.camera:camera-core:1.1.0-alpha08")
- docs("androidx.camera:camera-extensions:1.0.0-alpha28")
+ docs("androidx.camera:camera-extensions:1.0.0-alpha29")
stubs(fileTree(dir: "../camera/camera-extensions-stub", include: ["camera-extensions-stub.jar"]))
docs("androidx.camera:camera-lifecycle:1.1.0-alpha08")
- docs("androidx.camera:camera-view:1.0.0-alpha28")
+ docs("androidx.camera:camera-view:1.0.0-alpha29")
docs("androidx.car.app:app:1.1.0-beta01")
docs("androidx.car.app:app-automotive:1.1.0-beta01")
docs("androidx.car.app:app-projected:1.1.0-beta01")
@@ -44,48 +44,48 @@
docs("androidx.cardview:cardview:1.0.0")
docs("androidx.collection:collection:1.2.0-alpha01")
docs("androidx.collection:collection-ktx:1.2.0-alpha01")
- docs("androidx.compose.animation:animation:1.1.0-alpha04")
- docs("androidx.compose.animation:animation-core:1.1.0-alpha04")
- docs("androidx.compose.animation:animation-graphics:1.1.0-alpha04")
- samples("androidx.compose.animation:animation-samples:1.1.0-alpha04")
- samples("androidx.compose.animation:animation-core-samples:1.1.0-alpha04")
- samples("androidx.compose.animation:animation-graphics-samples:1.1.0-alpha04")
- docs("androidx.compose.foundation:foundation:1.1.0-alpha04")
- docs("androidx.compose.foundation:foundation-layout:1.1.0-alpha04")
- samples("androidx.compose.foundation:foundation-layout-samples:1.1.0-alpha04")
- samples("androidx.compose.foundation:foundation-samples:1.1.0-alpha04")
- docs("androidx.compose.material:material:1.1.0-alpha04")
- docs("androidx.compose.material:material-icons-core:1.1.0-alpha04")
- samples("androidx.compose.material:material-icons-core-samples:1.1.0-alpha04")
- docs("androidx.compose.material:material-ripple:1.1.0-alpha04")
- samples("androidx.compose.material:material-samples:1.1.0-alpha04")
- docs("androidx.compose.runtime:runtime:1.1.0-alpha04")
- docs("androidx.compose.runtime:runtime-livedata:1.1.0-alpha04")
- samples("androidx.compose.runtime:runtime-livedata-samples:1.1.0-alpha04")
- docs("androidx.compose.runtime:runtime-rxjava2:1.1.0-alpha04")
- samples("androidx.compose.runtime:runtime-rxjava2-samples:1.1.0-alpha04")
- docs("androidx.compose.runtime:runtime-rxjava3:1.1.0-alpha04")
- samples("androidx.compose.runtime:runtime-rxjava3-samples:1.1.0-alpha04")
- docs("androidx.compose.runtime:runtime-saveable:1.1.0-alpha04")
- samples("androidx.compose.runtime:runtime-saveable-samples:1.1.0-alpha04")
- samples("androidx.compose.runtime:runtime-samples:1.1.0-alpha04")
- docs("androidx.compose.ui:ui:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-geometry:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-graphics:1.1.0-alpha04")
- samples("androidx.compose.ui:ui-graphics-samples:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-test:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-test-junit4:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-text:1.1.0-alpha04")
- samples("androidx.compose.ui:ui-text-samples:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-tooling:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-tooling-data:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-tooling-preview:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-unit:1.1.0-alpha04")
- samples("androidx.compose.ui:ui-unit-samples:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-util:1.1.0-alpha04")
- docs("androidx.compose.ui:ui-viewbinding:1.1.0-alpha04")
- samples("androidx.compose.ui:ui-viewbinding-samples:1.1.0-alpha04")
- samples("androidx.compose.ui:ui-samples:1.1.0-alpha04")
+ docs("androidx.compose.animation:animation:1.1.0-alpha05")
+ docs("androidx.compose.animation:animation-core:1.1.0-alpha05")
+ docs("androidx.compose.animation:animation-graphics:1.1.0-alpha05")
+ samples("androidx.compose.animation:animation-samples:1.1.0-alpha05")
+ samples("androidx.compose.animation:animation-core-samples:1.1.0-alpha05")
+ samples("androidx.compose.animation:animation-graphics-samples:1.1.0-alpha05")
+ docs("androidx.compose.foundation:foundation:1.1.0-alpha05")
+ docs("androidx.compose.foundation:foundation-layout:1.1.0-alpha05")
+ samples("androidx.compose.foundation:foundation-layout-samples:1.1.0-alpha05")
+ samples("androidx.compose.foundation:foundation-samples:1.1.0-alpha05")
+ docs("androidx.compose.material:material:1.1.0-alpha05")
+ docs("androidx.compose.material:material-icons-core:1.1.0-alpha05")
+ samples("androidx.compose.material:material-icons-core-samples:1.1.0-alpha05")
+ docs("androidx.compose.material:material-ripple:1.1.0-alpha05")
+ samples("androidx.compose.material:material-samples:1.1.0-alpha05")
+ docs("androidx.compose.runtime:runtime:1.1.0-alpha05")
+ docs("androidx.compose.runtime:runtime-livedata:1.1.0-alpha05")
+ samples("androidx.compose.runtime:runtime-livedata-samples:1.1.0-alpha05")
+ docs("androidx.compose.runtime:runtime-rxjava2:1.1.0-alpha05")
+ samples("androidx.compose.runtime:runtime-rxjava2-samples:1.1.0-alpha05")
+ docs("androidx.compose.runtime:runtime-rxjava3:1.1.0-alpha05")
+ samples("androidx.compose.runtime:runtime-rxjava3-samples:1.1.0-alpha05")
+ docs("androidx.compose.runtime:runtime-saveable:1.1.0-alpha05")
+ samples("androidx.compose.runtime:runtime-saveable-samples:1.1.0-alpha05")
+ samples("androidx.compose.runtime:runtime-samples:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-geometry:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-graphics:1.1.0-alpha05")
+ samples("androidx.compose.ui:ui-graphics-samples:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-test:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-test-junit4:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-text:1.1.0-alpha05")
+ samples("androidx.compose.ui:ui-text-samples:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-tooling:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-tooling-data:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-tooling-preview:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-unit:1.1.0-alpha05")
+ samples("androidx.compose.ui:ui-unit-samples:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-util:1.1.0-alpha05")
+ docs("androidx.compose.ui:ui-viewbinding:1.1.0-alpha05")
+ samples("androidx.compose.ui:ui-viewbinding-samples:1.1.0-alpha05")
+ samples("androidx.compose.ui:ui-samples:1.1.0-alpha05")
docs("androidx.concurrent:concurrent-futures:1.1.0")
docs("androidx.concurrent:concurrent-futures-ktx:1.1.0")
docs("androidx.contentpager:contentpager:1.0.0")
@@ -94,9 +94,9 @@
docs("androidx.core:core-role:1.1.0-alpha02")
docs("androidx.core:core-animation:1.0.0-alpha02")
docs("androidx.core:core-animation-testing:1.0.0-alpha02")
- docs("androidx.core:core:1.7.0-beta01")
+ docs("androidx.core:core:1.7.0-beta02")
docs("androidx.core:core-ktx:1.7.0-beta01")
- docs("androidx.core:core-splashscreen:1.0.0-alpha01")
+ docs("androidx.core:core-splashscreen:1.0.0-alpha02")
docs("androidx.cursoradapter:cursoradapter:1.0.0")
docs("androidx.customview:customview:1.1.0")
docs("androidx.datastore:datastore:1.0.0")
@@ -121,11 +121,11 @@
docs("androidx.enterprise:enterprise-feedback:1.1.0")
docs("androidx.enterprise:enterprise-feedback-testing:1.1.0")
docs("androidx.exifinterface:exifinterface:1.3.3")
- docs("androidx.fragment:fragment:1.4.0-alpha09")
- docs("androidx.fragment:fragment-ktx:1.4.0-alpha09")
- docs("androidx.fragment:fragment-testing:1.4.0-alpha09")
+ docs("androidx.fragment:fragment:1.4.0-alpha10")
+ docs("androidx.fragment:fragment-ktx:1.4.0-alpha10")
+ docs("androidx.fragment:fragment-testing:1.4.0-alpha10")
docs("androidx.gridlayout:gridlayout:1.0.0")
- docs("androidx.health:health-services-client:1.0.0-alpha01")
+ docs("androidx.health:health-services-client:1.0.0-alpha02")
docs("androidx.heifwriter:heifwriter:1.1.0-alpha01")
docs("androidx.hilt:hilt-common:1.0.0-beta01")
docs("androidx.hilt:hilt-navigation:1.0.0-beta01")
@@ -138,25 +138,25 @@
docs("androidx.leanback:leanback-paging:1.1.0-alpha08")
docs("androidx.leanback:leanback-preference:1.2.0-alpha01")
docs("androidx.leanback:leanback-tab:1.1.0-beta01")
- docs("androidx.lifecycle:lifecycle-common:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-common-java8:2.4.0-beta01")
+ docs("androidx.lifecycle:lifecycle-common:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-common-java8:2.4.0-rc01")
docs("androidx.lifecycle:lifecycle-extensions:2.2.0")
- docs("androidx.lifecycle:lifecycle-livedata:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-livedata-core:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-process:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-reactivestreams:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-runtime:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-runtime-testing:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-service:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-viewmodel:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-beta01")
- samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0-beta01")
- docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0-beta01")
+ docs("androidx.lifecycle:lifecycle-livedata:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-livedata-core:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-livedata-core-ktx:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-livedata-ktx:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-process:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-reactivestreams:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-reactivestreams-ktx:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-runtime:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-runtime-ktx:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-runtime-testing:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-service:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-viewmodel:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-rc01")
+ samples("androidx.lifecycle:lifecycle-viewmodel-compose-samples:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0-rc01")
+ docs("androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.0-rc01")
docs("androidx.loader:loader:1.1.0")
docs("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0-alpha01")
docs("androidx.media2:media2-common:1.2.0")
@@ -165,19 +165,19 @@
docs("androidx.media2:media2-widget:1.2.0")
docs("androidx.media:media:1.4.2")
docs("androidx.mediarouter:mediarouter:1.2.5")
- docs("androidx.navigation:navigation-common:2.4.0-alpha09")
- docs("androidx.navigation:navigation-common-ktx:2.4.0-alpha09")
- docs("androidx.navigation:navigation-compose:2.4.0-alpha09")
- samples("androidx.navigation:navigation-compose-samples:2.4.0-alpha09")
- docs("androidx.navigation:navigation-dynamic-features-fragment:2.4.0-alpha09")
- docs("androidx.navigation:navigation-dynamic-features-runtime:2.4.0-alpha09")
- docs("androidx.navigation:navigation-fragment:2.4.0-alpha09")
- docs("androidx.navigation:navigation-fragment-ktx:2.4.0-alpha09")
- docs("androidx.navigation:navigation-runtime:2.4.0-alpha09")
- docs("androidx.navigation:navigation-runtime-ktx:2.4.0-alpha09")
- docs("androidx.navigation:navigation-testing:2.4.0-alpha09")
- docs("androidx.navigation:navigation-ui:2.4.0-alpha09")
- docs("androidx.navigation:navigation-ui-ktx:2.4.0-alpha09")
+ docs("androidx.navigation:navigation-common:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-common-ktx:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-compose:2.4.0-alpha10")
+ samples("androidx.navigation:navigation-compose-samples:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-dynamic-features-fragment:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-dynamic-features-runtime:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-fragment:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-fragment-ktx:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-runtime:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-runtime-ktx:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-testing:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-ui:2.4.0-alpha10")
+ docs("androidx.navigation:navigation-ui-ktx:2.4.0-alpha10")
docs("androidx.paging:paging-common:3.1.0-alpha03")
docs("androidx.paging:paging-common-ktx:3.1.0-alpha03")
docs("androidx.paging:paging-compose:1.0.0-alpha12")
@@ -195,21 +195,21 @@
docs("androidx.preference:preference:1.1.1")
docs("androidx.preference:preference-ktx:1.1.1")
docs("androidx.print:print:1.1.0-beta01")
- docs("androidx.profileinstaller:profileinstaller:1.1.0-alpha05")
+ docs("androidx.profileinstaller:profileinstaller:1.1.0-alpha06")
docs("androidx.recommendation:recommendation:1.0.0")
docs("androidx.recyclerview:recyclerview:1.3.0-alpha01")
docs("androidx.recyclerview:recyclerview-selection:2.0.0-alpha01")
docs("androidx.remotecallback:remotecallback:1.0.0-alpha02")
docs("androidx.resourceinspection:resourceinspection-annotation:1.0.0-beta01")
- docs("androidx.room:room-common:2.4.0-alpha04")
- docs("androidx.room:room-guava:2.4.0-alpha04")
- docs("androidx.room:room-ktx:2.4.0-alpha04")
- docs("androidx.room:room-migration:2.4.0-alpha04")
- docs("androidx.room:room-paging:2.4.0-alpha04")
- docs("androidx.room:room-runtime:2.4.0-alpha04")
- docs("androidx.room:room-rxjava2:2.4.0-alpha04")
- docs("androidx.room:room-rxjava3:2.4.0-alpha04")
- docs("androidx.room:room-testing:2.4.0-alpha04")
+ docs("androidx.room:room-common:2.4.0-alpha05")
+ docs("androidx.room:room-guava:2.4.0-alpha05")
+ docs("androidx.room:room-ktx:2.4.0-alpha05")
+ docs("androidx.room:room-migration:2.4.0-alpha05")
+ docs("androidx.room:room-paging:2.4.0-alpha05")
+ docs("androidx.room:room-runtime:2.4.0-alpha05")
+ docs("androidx.room:room-rxjava2:2.4.0-alpha05")
+ docs("androidx.room:room-rxjava3:2.4.0-alpha05")
+ docs("androidx.room:room-testing:2.4.0-alpha05")
docs("androidx.savedstate:savedstate:1.1.0")
docs("androidx.savedstate:savedstate-ktx:1.1.0")
docs("androidx.security:security-app-authenticator:1.0.0-alpha02")
@@ -240,35 +240,36 @@
docs("androidx.versionedparcelable:versionedparcelable:1.1.1")
docs("androidx.viewpager2:viewpager2:1.1.0-beta01")
docs("androidx.viewpager:viewpager:1.1.0-alpha01")
- docs("androidx.wear.compose:compose-foundation:1.0.0-alpha06")
- samples("androidx.wear.compose:compose-foundation-samples:1.0.0-alpha06")
- docs("androidx.wear.compose:compose-material:1.0.0-alpha06")
- samples("androidx.wear.compose:compose-material-samples:1.0.0-alpha06")
- docs("androidx.wear.tiles:tiles:1.0.0-alpha11")
- docs("androidx.wear.tiles:tiles-renderer:1.0.0-alpha11")
- docs("androidx.wear.tiles:tiles-testing:1.0.0-alpha11")
- docs("androidx.wear:wear:1.2.0")
+ docs("androidx.wear.compose:compose-foundation:1.0.0-alpha07")
+ samples("androidx.wear.compose:compose-foundation-samples:1.0.0-alpha07")
+ docs("androidx.wear.compose:compose-material:1.0.0-alpha07")
+ samples("androidx.wear.compose:compose-material-samples:1.0.0-alpha07")
+ docs("androidx.wear.compose:compose-navigation:1.0.0-alpha07")
+ docs("androidx.wear.tiles:tiles:1.0.0-alpha12")
+ docs("androidx.wear.tiles:tiles-renderer:1.0.0-alpha12")
+ docs("androidx.wear.tiles:tiles-testing:1.0.0-alpha12")
+ docs("androidx.wear.watchface:watchface:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-client:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-client-guava:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-complications-data:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-complications-data-source:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-complications-data-source-ktx:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-complications-rendering:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-data:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-editor:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-editor-guava:1.0.0-alpha23")
+ samples("androidx.wear.watchface:watchface-editor-samples:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-guava:1.0.0-alpha23")
+ samples("androidx.wear.watchface:watchface-samples:1.0.0-alpha23")
+ docs("androidx.wear.watchface:watchface-style:1.0.0-alpha23")
+ docs("androidx.wear:wear:1.3.0-alpha01")
stubs(fileTree(dir: "../wear/wear_stubs/", include: ["com.google.android.wearable-stubs.jar"]))
- docs("androidx.wear:wear-complications-data:1.0.0-alpha22")
- docs("androidx.wear:wear-complications-data-source:1.0.0-alpha22")
- docs("androidx.wear:wear-complications-data-source-ktx:1.0.0-alpha22")
docs("androidx.wear:wear-ongoing:1.1.0-alpha01")
docs("androidx.wear:wear-phone-interactions:1.1.0-alpha01")
docs("androidx.wear:wear-remote-interactions:1.0.0")
- docs("androidx.wear:wear-watchface:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-client:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-client-guava:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-complications-rendering:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-data:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-editor:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-editor-guava:1.0.0-alpha22")
- samples("androidx.wear:wear-watchface-editor-samples:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-guava:1.0.0-alpha22")
- samples("androidx.wear:wear-watchface-samples:1.0.0-alpha22")
- docs("androidx.wear:wear-watchface-style:1.0.0-alpha22")
- docs("androidx.wear:wear-input:1.2.0-alpha01")
+ docs("androidx.wear:wear-input:1.2.0-alpha02")
samples("androidx.wear:wear-input-samples:1.2.0-alpha01")
- docs("androidx.wear:wear-input-testing:1.2.0-alpha01")
+ docs("androidx.wear:wear-input-testing:1.2.0-alpha02")
docs("androidx.webkit:webkit:1.4.0")
docs("androidx.window:window:1.0.0-beta02")
stubs(fileTree(dir: "../window/stubs/", include: ["window-sidecar-release-0.1.0-alpha01.aar"]))
@@ -277,11 +278,11 @@
docs("androidx.window:window-rxjava2:1.0.0-beta02")
docs("androidx.window:window-rxjava3:1.0.0-beta02")
docs("androidx.window:window-testing:1.0.0-beta02")
- docs("androidx.work:work-gcm:2.7.0-beta01")
- docs("androidx.work:work-multiprocess:2.7.0-beta01")
- docs("androidx.work:work-runtime:2.7.0-beta01")
- docs("androidx.work:work-runtime-ktx:2.7.0-beta01")
- docs("androidx.work:work-rxjava2:2.7.0-beta01")
- docs("androidx.work:work-rxjava3:2.7.0-beta01")
- docs("androidx.work:work-testing:2.7.0-beta01")
+ docs("androidx.work:work-gcm:2.7.0-rc01")
+ docs("androidx.work:work-multiprocess:2.7.0-rc01")
+ docs("androidx.work:work-runtime:2.7.0-rc01")
+ docs("androidx.work:work-runtime-ktx:2.7.0-rc01")
+ docs("androidx.work:work-rxjava2:2.7.0-rc01")
+ docs("androidx.work:work-rxjava3:2.7.0-rc01")
+ docs("androidx.work:work-testing:2.7.0-rc01")
}
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index c8573f4..ffecff2 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -58,6 +58,7 @@
samples(project(":compose:foundation:foundation-layout:foundation-layout-samples"))
samples(project(":compose:foundation:foundation:foundation-samples"))
docs(project(":compose:material3:material3"))
+ samples(project(":compose:material3:material3:material3-samples"))
docs(project(":compose:material:material"))
docs(project(":compose:material:material-icons-core"))
samples(project(":compose:material:material-icons-core:material-icons-core-samples"))
@@ -147,6 +148,7 @@
docs(project(":hilt:hilt-navigation-fragment"))
docs(project(":hilt:hilt-work"))
docs(project(":interpolator:interpolator"))
+ docs(project(":metrics:metrics-performance"))
docs(project(":leanback:leanback"))
docs(project(":leanback:leanback-paging"))
docs(project(":leanback:leanback-preference"))
@@ -273,6 +275,7 @@
docs(project(":wear:tiles:tiles-proto"))
docs(project(":wear:tiles:tiles-renderer"))
docs(project(":wear:watchface:watchface"))
+ docs(project(":wear:watchface:watchface-complications"))
docs(project(":wear:watchface:watchface-complications-data"))
docs(project(":wear:watchface:watchface-complications-data-source"))
samples(project(":wear:watchface:watchface-complications-data-source-samples"))
diff --git a/docs/androidx.gif b/docs/androidx.gif
new file mode 100644
index 0000000..4912971
--- /dev/null
+++ b/docs/androidx.gif
Binary files differ
diff --git a/docs/api_guidelines.md b/docs/api_guidelines.md
index 2510986..16a0053 100644
--- a/docs/api_guidelines.md
+++ b/docs/api_guidelines.md
@@ -73,7 +73,7 @@
#### Project creator script {#module-creation}
-Note: The terms _project_, _module_, and _library_ are often used
+Note: The terms *project*, *module*, and *library* are often used
interchangeably within AndroidX, with project being the technical term used by
Gradle to describe a build target, e.g. a library that maps to a single AAR.
@@ -111,7 +111,7 @@
#### Splitting existing modules
-Existing modules _should not_ be split into smaller modules; doing so creates
+Existing modules *should not* be split into smaller modules; doing so creates
the potential for class duplication issues when a developer depends on a new
sub-module alongside the older top-level module. Consider the following
scenario:
@@ -230,7 +230,7 @@
Individual classes or methods may be annotated with the
[@RequiresApi](https://developer.android.com/reference/android/annotation/RequiresApi.html)
annotation to indicate divergence from the overall module's minimum SDK version.
-Note that this pattern is _not recommended_ because it leads to confusion for
+Note that this pattern is *not recommended* because it leads to confusion for
external developers and should be considered a last-resort when backporting
behavior is not feasible.
@@ -250,13 +250,13 @@
the base library and **must** be versioned and released identically to the base
library.
-Kotlin extension libraries _should not_ expose new functionality; they should
+Kotlin extension libraries *should not* expose new functionality; they should
only provide Kotlin-friendly versions of existing Java-facing functionality.
## Platform compatibility API patterns {#platform-compatibility-apis}
NOTE For all library APIs that wrap or provide parity with platform APIs,
-_parity with the platform APIs overrides API guidelines_. For example, if the
+*parity with the platform APIs overrides API guidelines*. For example, if the
platform API being wrapped has incorrect `Executor` and `Callback` ordering
according to the API Guidelines, the corresponding library API should have the
exact same (incorrect) ordering.
@@ -281,7 +281,7 @@
* Public method names **must** match platform method names
* Public methods **must** be static and take `PlatformClass` as first
parameter
-* Implementation _may_ delegate to `PlatformClass` methods when available
+* Implementation *may* delegate to `PlatformClass` methods when available
#### Sample {#static-shim-sample}
@@ -516,7 +516,7 @@
##### Construction {#wrapper-construction}
-* Class _may_ have public constructor(s) to provide parity with public
+* Class *may* have public constructor(s) to provide parity with public
`PlatformClass` constructors
* Constructor used to wrap `PlatformClass` **must not** be public
* Class **must** implement a static `PlatformClassCompat
@@ -533,7 +533,7 @@
* If class does not exist at module's `minSdkVersion`, method must be
annotated with `@RequiresApi(<sdk>)` for SDK version where class was
introduced
-* Implementation _may_ delegate to `PlatformClass` methods when available (see
+* Implementation *may* delegate to `PlatformClass` methods when available (see
below note for caveats)
* To avoid runtime class verification issues, all operations that interact
with the internal structure of `PlatformClass` must be implemented in inner
@@ -557,12 +557,12 @@
* Package name **must** be `androidx.<platform.package>`
* Superclass **must not** be `<PlatformClass>`
* Class **must not** expose `PlatformClass` in public API
- * In exceptional cases, a _released_ standalone class may add conversion
- between itself and the equivalent platform class; however, _new_ classes
+ * In exceptional cases, a *released* standalone class may add conversion
+ between itself and the equivalent platform class; however, *new* classes
that support conversion should follow the [Wrapper](#wrapper)
guidelines. In these cases, use a `toPlatform<PlatformClass>` and
`static toCompat<PlatformClass>` method naming convention.
-* Implementation _may_ delegate to `PlatformClass` methods when available
+* Implementation *may* delegate to `PlatformClass` methods when available
### Standalone JAR library (no Android dependencies) {#standalone-jar-library-no-android-dependencies}
@@ -784,12 +784,24 @@
storage or inter-process communication. Preserving and verifying compatibility
is difficult and error-prone.
-If you expose a `Bundle` to callers that can cross processes, you should
-[prevent apps from adding their own custom parcelables](https://android.googlesource.com/platform/frameworks/base/+/6cddbe14e1ff67dc4691a013fe38a2eb0893fe03)
-as top-level entries; if *any* entry in a `Bundle` can't be loaded, even if it's
-not actually accessed, the receiving process is likely to crash.
+Developers **should** use protocol buffers for most cases. See
+[Protobuf](#dependencies-protobuf) for more information on using protocol
+buffers in your library.
-**Do** use protocol buffers or, in some simpler cases, `VersionedParcelable`.
+Developers **may** use `Bundle` in simple cases that require sending `Binder`s
+or `FileDescriptor`s across IPC. Note that `Bundle` has several caveats:
+
+- Accessing *any* entry in a `Bundle` will result in the platform attempting
+ to load *every* entry. If a single entry cannot be loaded -- for example if
+ a developer added a custom `Parcelable` that doesn't exist in the receiver's
+ classpath -- an exception will be thrown when accessing *any* entry. Library
+ code that accesses `Bundle`s received from outside the process **must** do
+ so defensively. Library code that sends `Bundle`s outside the process
+ *should* discourage clients from passing custom `Parcelable`s.
+- `Bundle` provides no versioning and Jetpack provides no affordances for
+ tracking the keys or value types associated with a `Bundle`. Library owners
+ are responsible for providing their own system for guaranteeing wire format
+ compatibility between versions.
#### Communication protocols
@@ -1008,7 +1020,7 @@
Developers **must not** add `<application>`-level `<meta-data>` tags to library
manifests or advise developers to add such tags to their application manifests.
-Doing so may _inadvertently cause denial-of-service attacks against other apps_.
+Doing so may *inadvertently cause denial-of-service attacks against other apps*.
Assume a library adds a single item of meta-data at the application level. When
an app uses the library, that meta-data will be merged into the resulting app's
@@ -1104,7 +1116,7 @@
`alpha` or `beta` suffix.
Note: This does not apply to test dependencies: suffixes of test dependencies do
-_not_ carry over to your artifact.
+*not* carry over to your artifact.
#### Pinned versions {#dependencies-prebuilt}
@@ -1167,10 +1179,45 @@
Please see Jetpack's [open-source policy page](open_source.md) for more details
on using third-party libraries.
+### Types of dependencies {#dependencies-types}
+
+AndroidX allows dependencies to be specified as `api` or `implementation` with a
+"pinned" Maven spec (ex. `androidx.core:core:1.0.0`) or a "tip-of-tree" project
+spec (ex. `project(":core:core")`).
+
+Projects used in Playground, the experimental GitHub workflow, should use a
+"recent" project or artifact spec (ex. `projectOrArtifact(":core:core")`) which
+will default to tip-of-tree when used outside of the Playground workflow or a
+pinned `SNAPSHOT` artifact otherwise.
+
+Regardless of which dependency spec is used, all projects are built against
+tip-of-tree dependencies in CI to prevent regressions and enforce Jetpack's
+compatible-at-head policy.
+
+#### `api` versus `implementation` {#dependencies-api-vs-impl}
+
+`api`-type dependencies will appear in clients' auto-complete as though they had
+added the dependency directly to their project, and Studio will run any lint
+checks bundled with `api`-type dependencies.
+
+Dependencies whose APIs are exposed in a library's API surface **must** be
+included as `api`-type. For example, if your library's API surface includes
+`AccessibilityNodeInfoCompat` then you will use an `api`-type dependency on the
+`androidx.core:core` library.
+
+NOTE Libraries that provide client-facing lint checks, including
+`annotation-experimental`, **must** be included as `api`-type to ensure that
+lint checks are run in the clients' dependent projects.
+
+`implementation`-type dependencies will be included in the classpath, but will
+not be made available at design time (ex. in auto-complete) unless the client
+explicitly adds them.
+
### System health {#dependencies-health}
-Libraries should consider the system health implications of their dependencies,
-including:
+Generally, Jetpack libraries should avoid dependencies that negatively impact
+developers without providing substantial benefit. Libraries should consider the
+system health implications of their dependencies, including:
- Large dependencies where only a small portion is needed (e.g. APK bloat)
- Dependencies that slow down build times through annotation processing or
@@ -1178,14 +1225,14 @@
#### Kotlin {#dependencies-kotlin}
-Kotlin is _strongly recommended_ for new libraries; however, it's important to
+Kotlin is *strongly recommended* for new libraries; however, it's important to
consider its size impact on clients. Currently, the Kotlin stdlib adds a minimum
of 40kB post-optimization. It may not make sense to use Kotlin for a library
that targets Java-only clients or space-constrained (ex. Android Go) clients.
-Existing Java-based libraries are _strongly discouraged_ from using Kotlin,
+Existing Java-based libraries are *strongly discouraged* from using Kotlin,
primarily because our documentation system does not currently provide a
-Java-facing version of Kotlin API reference docs. Java-based libraries _may_
+Java-facing version of Kotlin API reference docs. Java-based libraries *may*
migrate to Kotlin, but they must consider the docs usability and size impacts on
existing Java-only and space-constrained clients.
@@ -1207,7 +1254,7 @@
#### Java 8 {#dependencies-java8}
-Libraries that take a dependency on a library targeting Java 8 must _also_
+Libraries that take a dependency on a library targeting Java 8 must *also*
target Java 8, which will incur a ~5% build performance (as of 8/2019) hit for
clients. New libraries targeting Java 8 may use Java 8 dependencies.
@@ -1224,6 +1271,24 @@
}
```
+#### Protobuf {#dependencies-protobuf}
+
+[Protocol buffers](https://developers.google.com/protocol-buffers) provide a
+language- and platform-neutral mechanism for serializing structured data. The
+implementation enables developers to maintain protocol compatibility across
+library versions, meaning that two clients can communicate regardless of the
+library versions included in their APKs.
+
+The Protobuf library itself, however, does not guarantee ABI compatibility
+across minor versions and a specific version **must** be bundled with a library
+to avoid conflict with other dependencies used by the developer.
+
+Additionally, the Java API surface generated by the Protobuf compiler is not
+guaranteed to be stable and **must not** be exposed to developers. Library
+owners should wrap the generated API surface with well-documented public APIs
+that follow an appropriate language-specific paradigm for constructing data
+classes, e.g. the Java `Builder` pattern.
+
### Open-source compatibility {#dependencies-aosp}
[Jetpack Principles](principles.md) require that libraries consider the
@@ -1239,23 +1304,27 @@
permissions, or IPC mechanisms that may only be fulfulled by closed-source
components.
-Optional artifacts, e.g. `workmanager-gcm`, _may_ depend on closed-source
+Optional artifacts, e.g. `workmanager-gcm`, *may* depend on closed-source
components or configure a primary artifact to be backed by a closed-source
component via service discovery or initialization.
Some examples of safely depending on closed-source components include:
-- WorkManager's GCM Network Manager integration, which uses manifest metadata
+- WorkManager's GCM Network Manager integration, which uses
+ [manifest metadata](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:work/workmanager-gcm/src/main/AndroidManifest.xml)
for service discovery and provides an optional artifact exposing the
service.
- Ads Identifier's Play Services integration, which provides a default backend
- and uses `Intent` handling as a service discovery mechanism for Play
- Services.
+ and uses
+ [`Intent` handling](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:ads/ads-identifier-provider/src/main/java/androidx/ads/identifier/provider/AdvertisingIdProviderManager.java;l=108)
+ as a service discovery mechanism for Play Services.
- Downloadable Fonts integration with Play Services, which plugs in via a
- `ContentProvider` as a service discovery mechanism with developer-specified
- signature verification for additional security.
+ [`ContentProvider`](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-master-dev:core/core/src/androidTest/java/androidx/core/provider/MockFontProvider.java)
+ as a service discovery mechanism with developer-specified
+ [signature verification](https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts#adding-certificates)
+ for additional security.
-Note that in all cases, the developer is not _required_ to use GCM or Play
+Note that in all cases, the developer is not *required* to use GCM or Play
Services and may instead use another compatible service implementing the same
publicly-defined protocols.
@@ -1303,7 +1372,7 @@
of `@RequiresOptIn` in JetBrains libraries as indicating **binary instability**
and avoid using them outside of `alpha`; however, teams are welcome to obtain
written assurance from JetBrains regarding binary stability of specific APIs.
-`@RequiresOptIn` APIs that are guaranteed to remain binary compatible _may_ be
+`@RequiresOptIn` APIs that are guaranteed to remain binary compatible *may* be
used in `beta`, but usages must be removed when the library moves to `rc`.
#### How to mark an API surface as experimental
@@ -1365,7 +1434,7 @@
#### When to use `@hide` {#restricted-api-usage}
In other cases, avoid using `@hide` / `@suppress`. These annotations indicates
-that developers should not call an API that is _technically_ public from a Java
+that developers should not call an API that is *technically* public from a Java
visibility perspective. Hiding APIs is often a sign of a poorly-abstracted API
surface, and priority should be given to creating public, maintainable APIs and
using Java visibility modifiers.
@@ -1384,16 +1453,19 @@
#### `RestrictTo.Scope` and inter- versus intra-library API surfaces {#private-api-types}
To maintain binary compatibility between different versions of libraries,
-restricted API surfaces that are used between libraries (inter-library APIs)
-must follow the same Semantic Versioning rules as public APIs. Inter-library
-APIs should be annotated with the `@RestrictTo(LIBRARY_GROUP)` source
-annotation.
+restricted API surfaces that are used between libraries within Jetpack
+(inter-library APIs) must follow the same Semantic Versioning rules as public
+APIs. Inter-library APIs should be annotated with the
+`@RestrictTo(LIBRARY_GROUP)` source annotation and `@hide` docs annotation.
Restricted API surfaces used within a single library (intra-library APIs), on
the other hand, may be added or removed without any compatibility
-considerations. It is safe to assume that developers _never_ call these APIs,
+considerations. It is safe to assume that developers *never* call these APIs,
even though it is technically feasible. Intra-library APIs should be annotated
-with the `@RestrictTo(LIBRARY)` source annotation.
+with the `@RestrictTo(LIBRARY)` source annotation and `@hide` docs annotation.
+
+In all cases, correctness and compatibility tracking are handled by AndroidX's
+build system and lint checks.
The following table shows the visibility of a hypothetical API within Maven
coordinate `androidx.concurrent:concurrent` when annotated with a variety of
@@ -1430,12 +1502,12 @@
and packaged separately to be read by Android Studio and lint which enforces the
types in application code.
-* Libraries _must_ `@hide` all `@IntDef`, `@StringDef`, and `@LongDef`
+* Libraries *must* `@hide` all `@IntDef`, `@StringDef`, and `@LongDef`
declarations.
-* Libraries _must_ expose constants used to define the `@IntDef` etc at the
+* Libraries *must* expose constants used to define the `@IntDef` etc at the
same Java visibility as the hidden `@IntDef`
-* Libraries _should_ also use @RestrictTo to create a warning when the type
- used incorrectly.
+* Libraries *must* use `@RestrictTo` to create a warning when the type is used
+ incorrectly.
Here is a complete example of an `@IntDef`
@@ -1471,7 +1543,7 @@
resource. Because this API was added in SDK 21, care must be taken to ensure
that it is not called through any < SDK 21 code path.
-Views _may_ implement a four-arg constructor in one of the following ways:
+Views *may* implement a four-arg constructor in one of the following ways:
1. Do not implement.
1. Implement and annotate with `@RequiresApi(21)`. This means the three-arg
@@ -1493,6 +1565,10 @@
Java libraries should prefer `ListenableFuture` and the
[`CallbackToFutureAdapter`](https://developer.android.com/reference/androidx/concurrent/futures/CallbackToFutureAdapter)
implementation provided by the `androidx.concurrent:concurrent-futures` library.
+Functions and methods that return `ListenableFuture` should be suffixed by,
+`Async` to reserve the shorter, unmodified name for a `suspend` method or
+extension function in Kotlin that returns the value normally in accordance with
+structured concurrency.
Libraries **must not** use `java.util.concurrent.CompletableFuture`, as it has a
large API surface that permits arbitrary mutation of the future's value and has
@@ -1504,7 +1580,7 @@
#### Cancellation
Libraries that expose APIs for performing asynchronous work should support
-cancellation. There are _very few_ cases where it is not feasible to support
+cancellation. There are *very few* cases where it is not feasible to support
cancellation.
Libraries that use `ListenableFuture` must be careful to follow the exact
@@ -1663,7 +1739,7 @@
re-implement any old `copy` variants as items are added. If these constraints
are acceptable, data classes may still be useful to you.
-As a result, Kotlin `data` classes are _strongly discouraged_ in library APIs.
+As a result, Kotlin `data` classes are *strongly discouraged* in library APIs.
Instead, follow best-practices for Java data classes including implementing
`equals`, `hashCode`, and `toString`.
diff --git a/docs/index.md b/docs/index.md
index 7968dac..ff3003a 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,5 +1,7 @@
# What is Jetpack?
+![alt_text](androidx.gif "Androidx Gif")
+
## Ethos
To create recommended components, tools, and guidance that makes it quick and
diff --git a/docs/kdoc_guidelines.md b/docs/kdoc_guidelines.md
index 72f91eb..714632c 100644
--- a/docs/kdoc_guidelines.md
+++ b/docs/kdoc_guidelines.md
@@ -193,7 +193,7 @@
```kotlin {.good}
/**
- * * @param T my cool param
+ * @param T my cool param
*/
```
diff --git a/docs/lint_guide.md b/docs/lint_guide.md
index b6ee876..f3557c3 100644
--- a/docs/lint_guide.md
+++ b/docs/lint_guide.md
@@ -19,13 +19,6 @@
If this is the first Lint rule for a library, you will need to create a module
by doing the following:
-Add a new `ignore` rule to the `PublishDocsRules.kt` file to prevent the module
-from showing up in published docs:
-
-```
-ignore(LibraryGroups.MyLibrary.group, "mylibrary-lint")
-```
-
Include the project in the top-level `settings.gradle` file so that it shows up
in Android Studio's list of modules:
@@ -37,16 +30,12 @@
directory you are making lint rules for). In the new module, add a `src` folder
and a `build.gradle` file containing the needed dependencies.
-build.gradle
+`mylibrary/mylibrary-lint/build.gradle`:
```
-import static androidx.build.dependencies.DependenciesKt.*
-import androidx.build.AndroidXExtension
-import androidx.build.CompilationTarget
import androidx.build.LibraryGroups
+import androidx.build.LibraryType
import androidx.build.LibraryVersions
-import androidx.build.SdkHelperKt
-import androidx.build.Publish
plugins {
id("AndroidXPlugin")
@@ -54,36 +43,25 @@
}
dependencies {
- // compileOnly because lint runtime is provided when checks are run
- // Use latest lint for running from IDE to make sure checks always run
- if (rootProject.hasProperty("android.injected.invoked.from.ide")) {
- compileOnly LINT_API_LATEST
- } else {
- compileOnly LINT_API_MIN
- }
- compileOnly KOTLIN_STDLIB
+ compileOnly(libs.androidLintMinApi)
+ compileOnly(libs.kotlinStdlib)
- testImplementation KOTLIN_STDLIB
- testImplementation LINT_CORE
- testImplementation LINT_TESTS
+ testImplementation(libs.kotlinStdlib)
+ testImplementation(libs.androidLint)
+ testImplementation(libs.androidLintTests)
+ testImplementation(libs.junit)
}
androidx {
- name = "Android MyLibrary Lint Checks"
- toolingProject = true
- publish = Publish.NONE
+ name = "MyLibrary lint checks"
+ type = LibraryType.LINT
mavenVersion = LibraryVersions.MYLIBRARY
mavenGroup = LibraryGroups.MYLIBRARY
inceptionYear = "2019"
- description = "Android MyLibrary Lint Checks"
- url = AndroidXExtension.ARCHITECTURE_URL
- compilationTarget = CompilationTarget.HOST
+ description = "Lint checks for MyLibrary"
}
```
-Build the project and a `mylibrary-lint.iml` file should be created
-automatically in the module directory.
-
### Issue registry
Your new module will need to have a registry that contains a list of all of the
@@ -92,35 +70,35 @@
class provided by the tools team. Extend this class into your own
`IssueRegistry` class, and provide it with the issues in the module.
-MyLibraryIssueRegistry.kt
+`MyLibraryIssueRegistry.kt`
```kotlin
class MyLibraryIssueRegistry : IssueRegistry() {
- override val api = 6
+ override val api = 11
override val minApi = CURRENT_API
override val issues get() = listOf(MyLibraryDetector.ISSUE)
}
```
-The maximum version this Lint check will will work with is defined by `api = 6`,
-where versions 0-6 correspond to Lint/Studio versions 3.0-3.6.
+The maximum version this Lint check will will work with is defined by `api =
+11`, where versions `0`-`11` correspond to Lint/Studio versions `3.0`-`3.11`.
`minApi = CURRENT_API` sets the lowest version of Lint that this will work with.
`CURRENT_API` is defined by the Lint API version against which your project is
compiled, as defined in the module's `build.gradle` file. Jetpack Lint modules
-should compile using Lint API version 3.3 defined in
+should compile using the Lint API version referenced in
[Dependencies.kt](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:buildSrc/src/main/kotlin/androidx/build/dependencies/Dependencies.kt;l=176).
-We guarantee that our Lint checks work with versions 3.3-3.6 by running our
-tests with both versions 3.3 and 3.6. For newer versions of Android Studio (and
-consequently, Lint) the API variable will need to be updated.
+We guarantee that our Lint checks work with the versions referenced by `minApi`
+and `api` by running our tests with both versions. For newer versions of Android
+Studio (and consequently, Lint) the API variable will need to be updated.
The `IssueRegistry` requires a list of all of the issues to check. You must
override the `IssueRegistry.getIssues()` method. Here, we override that method
with a Kotlin `get()` property delegate:
-[Example IssueRegistry Implementation](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt)
+[Example `IssueRegistry` Implementation](https://cs.android.com/androidx/platform/frameworks/support/+/androidx-main:fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt)
There are 4 primary types of Lint checks:
@@ -607,7 +585,7 @@
Sometimes it is necessary to implement multiple different scanners in a Lint
detector. For example, the
[Unused Resource](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-master-dev:lint/libs/lint-checks/src/main/java/com/android/tools/lint/checks/UnusedResourceDetector.java)
-Lint check implements an XML and SourceCode Scanner in order to determine if
+Lint check implements an XML and SourceCodeScanner in order to determine if
resources defined in XML files are ever references in the Java/Kotlin source
code.
@@ -630,7 +608,7 @@
### [`SdkConstants`](https://cs.android.com/android-studio/platform/tools/base/+/mirror-goog-studio-master-dev:common/src/main/java/com/android/SdkConstants.java)
-Contains most of the canonical names for android core library classes, as well
+Contains most of the canonical names for Android core library classes, as well
as XML tag names.
## Helpful links
diff --git a/docs/onboarding.md b/docs/onboarding.md
index 1bbe627..e1c9537 100644
--- a/docs/onboarding.md
+++ b/docs/onboarding.md
@@ -8,8 +8,7 @@
This page does **not** cover best practices for the content of changes. Please
see [Life of a Jetpack Feature](loaf.md) for details on developing and releasing
a library, [API Guidelines](api_guidelines.md) for best practices regarding
-public APIs, or [Policies and Processes](policies.md) for an overview of the
-constraints placed on changes.
+public APIs and an overview of the constraints placed on changes.
## Workstation setup {#setup}
@@ -205,6 +204,17 @@
files, you can run `./studiow --clean main <project subset>` or `./studiow
--reinstall <project subset>` to clean generated files or reinstall Studio.
+> Tip: If you don't see a specific Gradle task listed in Studio's Gradle pane,
+> check the following:
+>
+> * Studio might be running a different project subset than the one intended.
+> For example, `./studiow main` only loads the `main` set of androidx
+> projects; run `./studiow compose` to load the tasks specific to Compose.
+>
+> * Gradle tasks aren't being loaded. Under Studio's settings => Experimental,
+> make sure that "Do not build Gradle task list during Gradle sync" is
+> unchecked. (Note that unchecking this can reduce Studio's performance)
+
## Making changes {#changes}
Similar to Android framework development, library development should occur in
@@ -379,9 +389,8 @@
./gradlew doclavaDocs
```
-To generate offline docs use '-PofflineDocs=true' parameter. Places the
-documentation in
-`{androidx-main}/out/dist/out/androidx/docs-tip-of-tree/build/javadoc`
+Places the documentation in
+`{androidx-main}/out/androidx/docs-tip-of-tree/build/javadoc`
#### KotlinDocs
@@ -395,6 +404,22 @@
Places the documentation in
`{androidx-main}/out/dist/out/androidx/docs-tip-of-tree/build/dokkaKotlinDocs`
+#### Dackka docs
+
+To build API reference docs for both Java and Kotlin source code using Dackka,
+run the Gradle task:
+
+```
+./gradlew dackkaDocs
+```
+
+Location of generated refdocs:
+
+* docs-public (what is published to DAC):
+ `{androidx-main}/out/dist/out/androidx/docs-public/build/dackkaDocs`
+* docs-tip-of-tree:
+ `{androidx-main}/out/dist/out/androidx/docs-tip-of-tree/build/dackkaDocs`
+
#### Release docs
To build API reference docs for published artifacts formatted for use on
@@ -426,6 +451,15 @@
This will create the artifact `{androidx-main}/out/dist/dokka-public-docs-0.zip`
+To generate a zip artifact for both Java and Kotlin source code using Dackka:
+
+```
+./gradlew zipDackkaDocs
+```
+
+This will create the artifact
+`{androidx-main}/out/dist/dackka-public-docs-0.zip`
+
### Updating public APIs {#updating-public-apis}
Public API tasks -- including tracking, linting, and verifying compatibility --
@@ -455,6 +489,20 @@
If you change the public APIs without updating the API file, your module will
still build **but** your CL will fail Treehugger presubmit checks.
+#### What are all these files in `api/`? {#updating-public-apis-glossary}
+
+Historical API surfaces are tracked for compatibility and docs generation
+purposes. For each version -- including `current` to represent the tip-of-tree
+version -- we record three different types of API surfaces.
+
+* `<version>.txt`: Public API surface, tracked for compatibility
+* `restricted_<version>.txt`: `@RestrictTo` API surface, tracked for
+ compatibility where necessary (see
+ [Restricted APIs](api_guidelines.md#restricted-api))
+* `public_plus_experimental_<version>.txt`: Public API surface plus
+ `@RequiresOptIn` experimental API surfaces used for documentation (see
+ [Experimental APIs](api_guidelines.md#experimental-api)) and API review
+
### Release notes & the `Relnote:` tag {#relnote}
Prior to releasing, release notes are pre-populated using a script and placed
@@ -622,11 +670,11 @@
The Android Studio instance started by `./studiow` uses a custom SDK directory,
which means any virtual devices created by a "standard" non-AndroidX instance of
-Android Studio will be _visible_ from the `./studiow` instance but will be
+Android Studio will be *visible* from the `./studiow` instance but will be
unable to locate the SDK artifacts -- they will display a `Download` button.
You can either use the `Download` button to download an extra copy of the SDK
-artifacts _or_ you can set up a symlink to your "standard" non-AndroidX SDK
+artifacts *or* you can set up a symlink to your "standard" non-AndroidX SDK
directory to expose your existing artifacts to the `./studiow` instance:
```shell
diff --git a/docs/open_source.md b/docs/open_source.md
index cc95a5c..b5504f0 100644
--- a/docs/open_source.md
+++ b/docs/open_source.md
@@ -117,11 +117,11 @@
limiting developer choice. Features in primary artifacts which may
delegate to proprietary services must allow developers to choose a
different delegate. Reflection on a fully-qualified class name does
- _not_ allow multiple delegates to exist on the classpath and is not a
+ *not* allow multiple delegates to exist on the classpath and is not a
suitable service discovery mechanism.
* **How to fix?** This library should use a more suitable service
discovery mechanism that allows multiple providers to coexist and
- ensures the the developer is able to choose among them.
+ ensures the developer is able to choose among them.
* A primary artifact provides a service discovery mechanism that allows
multiple providers and exposes an API that lets the developer specify a
preference. Communication with the service is managed through a `Bundle`
diff --git a/docs/testing.md b/docs/testing.md
index fdb4cab..97ed2a9 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -39,7 +39,7 @@
to determine what projects have changed since the last merge.
In presubmit, "affected" modules will run all host and device tests regardless
-of size. Modules that _depend_ on affected modules will run all host tests, but
+of size. Modules that *depend* on affected modules will run all host tests, but
will only run device tests annotated with `@SmallTest` or `@MediumTest`.
When changes are made that can't be associated with a module, are in the root of
@@ -60,7 +60,7 @@
* [`@MediumTest`](https://developer.android.com/reference/androidx/test/filters/MediumTest)
* [`@LargeTest`](https://developer.android.com/reference/androidx/test/filters/LargeTest)
-If a device test is _not_ annotated with its size, it will be run as if it were
+If a device test is *not* annotated with its size, it will be run as if it were
`@LargeTest` by default. Host tests do not need to be annotated with their size,
as all host tests are run regardless of size.
diff --git a/fragment/fragment-ktx/build.gradle b/fragment/fragment-ktx/build.gradle
index 2f24481..f48c186 100644
--- a/fragment/fragment-ktx/build.gradle
+++ b/fragment/fragment-ktx/build.gradle
@@ -16,6 +16,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -60,3 +61,15 @@
inceptionYear = "2018"
description = "Kotlin extensions for 'fragment' artifact"
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/fragment/fragment-lint/build.gradle b/fragment/fragment-lint/build.gradle
index f516f7c..ad535cc 100644
--- a/fragment/fragment-lint/build.gradle
+++ b/fragment/fragment-lint/build.gradle
@@ -25,6 +25,7 @@
dependencies {
compileOnly(libs.androidLintMinApi)
compileOnly(libs.kotlinStdlib)
+ compileOnly(libs.androidLintChecks)
testImplementation(libs.kotlinStdlib)
testImplementation(libs.kotlinReflect)
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/AttachAndDetachInSameTransactionDetector.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/AttachAndDetachInSameTransactionDetector.kt
new file mode 100644
index 0000000..93db36c
--- /dev/null
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/AttachAndDetachInSameTransactionDetector.kt
@@ -0,0 +1,166 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.fragment.lint
+
+import com.android.tools.lint.checks.DataFlowAnalyzer
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import com.android.tools.lint.detector.api.getMethodName
+import com.intellij.psi.PsiMethod
+import org.jetbrains.uast.UCallExpression
+import org.jetbrains.uast.UElement
+import org.jetbrains.uast.UMethod
+import org.jetbrains.uast.getParentOfType
+import org.jetbrains.uast.toUElement
+import org.jetbrains.uast.tryResolve
+
+/**
+ * Lint check for detecting calls to [androidx.fragment.app.FragmentTransaction.attach] and
+ * [androidx.fragment.app.FragmentTransaction.detach] in the same
+ * [androidx.fragment.app.FragmentTransaction] on the same [androidx.fragment.app.Fragment] instance
+ */
+class AttachAndDetachInSameTransactionDetector : Detector(), SourceCodeScanner {
+
+ companion object Issues {
+ val DETACH_ATTACH_OPERATIONS_ISSUE = Issue.create(
+ id = "DetachAndAttachSameFragment",
+ briefDescription = "Separate attach() and detach() into separate FragmentTransactions",
+ explanation = """When doing a FragmentTransaction that includes both attach() \
+ and detach() operations being committed on the same fragment instance, it is a \
+ no-op. The reason for this is that the FragmentManager optimizes all operations \
+ within a single transaction so the attach() and detach() cancel each other out \
+ and neither is actually executed. To get the desired behavior, you should separate \
+ the attach() and detach() calls into separate FragmentTransactions.""",
+ category = Category.CORRECTNESS,
+ severity = Severity.WARNING,
+ implementation = Implementation(
+ AttachAndDetachInSameTransactionDetector::class.java, Scope.JAVA_FILE_SCOPE
+ ),
+ androidSpecific = true
+ )
+
+ // Target method names
+ private const val ATTACH = "attach"
+ private const val BEGIN_TRANSACTION = "beginTransaction"
+ private const val DETACH = "detach"
+
+ private const val FRAGMENT_CLS = "androidx.fragment.app.Fragment"
+ private const val FRAGMENT_MANAGER_CLS = "androidx.fragment.app.FragmentManager"
+ private const val FRAGMENT_TRANSACTION_CLS = "androidx.fragment.app.FragmentTransaction"
+ }
+
+ override fun getApplicableMethodNames(): List<String> = listOf(BEGIN_TRANSACTION)
+
+ override fun visitMethodCall(
+ context: JavaContext,
+ node: UCallExpression,
+ method: PsiMethod
+ ) {
+ when (method.name) {
+ BEGIN_TRANSACTION -> checkTransactionCommits(context, node, method)
+ else -> super.visitMethodCall(context, node, method)
+ }
+ }
+
+ private fun checkTransactionCommits(
+ context: JavaContext,
+ node: UCallExpression,
+ calledMethod: PsiMethod
+ ) {
+ if (isBeginTransaction(context, calledMethod)) {
+ val method = node.getParentOfType(UMethod::class.java) ?: return
+ var attachingFragment: UElement? = null
+ var detachingFragment: UElement? = null
+ val visitor = object : DataFlowAnalyzer(setOf(node), emptyList()) {
+ override fun receiver(call: UCallExpression) {
+ if (isAttachFragmentMethodCall(context, call)) {
+ val arg = call.valueArguments.firstOrNull {
+ it.getExpressionType().extends(context, FRAGMENT_CLS, false)
+ }
+ attachingFragment = arg?.tryResolve()?.toUElement()
+ }
+ if (isDetachFragmentMethodCall(context, call)) {
+ val arg = call.valueArguments.firstOrNull {
+ it.getExpressionType().extends(context, FRAGMENT_CLS, false)
+ }
+ detachingFragment = arg?.tryResolve()?.toUElement()
+ }
+ }
+ }
+ method.accept(visitor)
+
+ if (attachingFragment != null && attachingFragment == detachingFragment) {
+ val message = "Calling detach() and attach() in the same FragmentTransaction is " +
+ "a no-op, meaning it does not recreate the Fragment's view. If you would " +
+ "like the view to be recreated, separate these operations into separate " +
+ "transactions."
+ context.report(
+ DETACH_ATTACH_OPERATIONS_ISSUE,
+ node,
+ context.getNameLocation(node),
+ message
+ )
+ }
+ }
+ }
+
+ private fun isBeginTransaction(
+ context: JavaContext,
+ method: PsiMethod
+ ): Boolean {
+ return BEGIN_TRANSACTION == method.name &&
+ context.evaluator.isMemberInSubClassOf(method, FRAGMENT_MANAGER_CLS)
+ }
+
+ internal fun isAttachFragmentMethodCall(
+ context: JavaContext,
+ call: UCallExpression
+ ): Boolean {
+ val methodName = getMethodName(call)
+ return ATTACH == methodName &&
+ isMethodOnFragmentClass(context, call, FRAGMENT_TRANSACTION_CLS, true)
+ }
+
+ internal fun isDetachFragmentMethodCall(
+ context: JavaContext,
+ call: UCallExpression
+ ): Boolean {
+ val methodName = getMethodName(call)
+ return DETACH == methodName &&
+ isMethodOnFragmentClass(context, call, FRAGMENT_TRANSACTION_CLS, true)
+ }
+
+ private fun isMethodOnFragmentClass(
+ context: JavaContext,
+ call: UCallExpression,
+ fragmentClass: String,
+ returnForUnresolved: Boolean
+ ): Boolean {
+ // If we *can't* resolve the method call, caller can decide
+ // whether to consider the method called or not
+ val method = call.resolve() ?: return returnForUnresolved
+ return context.evaluator.isMemberInSubClassOf(method, fragmentClass)
+ }
+}
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
index e045232..5152079 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/FragmentIssueRegistry.kt
@@ -28,11 +28,13 @@
override val minApi = CURRENT_API
override val issues get() = listOf(
FragmentTagDetector.ISSUE,
+ UnsafeFragmentLifecycleObserverDetector.ADD_MENU_PROVIDER_ISSUE,
UnsafeFragmentLifecycleObserverDetector.BACK_PRESSED_ISSUE,
UnsafeFragmentLifecycleObserverDetector.LIVEDATA_ISSUE,
UseRequireInsteadOfGet.ISSUE,
UseGetLayoutInflater.ISSUE,
OnCreateDialogIncorrectCallbackDetector.ISSUE,
- UnsafeRepeatOnLifecycleDetector.ISSUE
+ UnsafeRepeatOnLifecycleDetector.ISSUE,
+ AttachAndDetachInSameTransactionDetector.DETACH_ATTACH_OPERATIONS_ISSUE
)
}
diff --git a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt
index e38eb4e..8ed43ac 100644
--- a/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt
+++ b/fragment/fragment-lint/src/main/java/androidx/fragment/lint/UnsafeFragmentLifecycleObserverDetector.kt
@@ -18,6 +18,7 @@
package androidx.fragment.lint
+import androidx.fragment.lint.UnsafeFragmentLifecycleObserverDetector.Issues.ADD_MENU_PROVIDER_ISSUE
import androidx.fragment.lint.UnsafeFragmentLifecycleObserverDetector.Issues.BACK_PRESSED_ISSUE
import androidx.fragment.lint.UnsafeFragmentLifecycleObserverDetector.Issues.LIVEDATA_ISSUE
import com.android.tools.lint.detector.api.Category
@@ -86,6 +87,25 @@
),
androidSpecific = true
)
+
+ val ADD_MENU_PROVIDER_ISSUE = Issue.create(
+ id = "FragmentAddMenuProvider",
+ briefDescription = "Use getViewLifecycleOwner() as the LifecycleOwner instead of " +
+ "a Fragment instance.",
+ explanation = """The Fragment lifecycle can result in a Fragment being active \
+ longer than its view. This can lead to unexpected behavior from lifecycle aware \
+ objects remaining active longer than the Fragment's view. To solve this issue, \
+ getViewLifecycleOwner() should be used as a LifecycleOwner rather than the \
+ Fragment instance once it is safe to access the view lifecycle in a \
+ Fragment's onCreateView, onViewCreated, onActivityCreated, or \
+ onViewStateRestored methods.""",
+ category = Category.CORRECTNESS,
+ severity = Severity.ERROR,
+ implementation = Implementation(
+ UnsafeFragmentLifecycleObserverDetector::class.java, Scope.JAVA_FILE_SCOPE
+ ),
+ androidSpecific = true
+ )
}
private val lifecycleMethods = setOf(
@@ -149,8 +169,7 @@
* @return `true` if a lint error was found and reported, `false` otherwise.
*/
private fun checkCall(call: UCallExpression, psiMethod: PsiMethod): Boolean {
- val method = Method(psiMethod.containingClass?.qualifiedName, psiMethod.name)
- val issue = UNSAFE_METHODS[method] ?: return false
+ val issue = findIssueForMethod(psiMethod) ?: return false
val argMap = context.evaluator.computeArgumentMapping(call, psiMethod)
argMap.forEach { (arg, param) ->
if (arg.getExpressionType().extends(context, FRAGMENT_CLASS) &&
@@ -184,6 +203,24 @@
}
return false
}
+
+ /**
+ * Checks if the given [PsiMethod] should be associated with an [Issue]. It covers the case
+ * where the given [PsiMethod] is on the base class itself, or if it is on a class that
+ * extends the base class and calls the method instead.
+ *
+ * This allows us to catch the issue no matter where it may occur in the class hierarchy.
+ */
+ private fun findIssueForMethod(psiMethod: PsiMethod): Issue? {
+ UNSAFE_METHODS.keys.forEach { base ->
+ if (context.evaluator.extendsClass(psiMethod.containingClass, base.cls!!) &&
+ psiMethod.name == base.name
+ ) {
+ return UNSAFE_METHODS[base]
+ }
+ }
+ return null
+ }
}
/**
@@ -213,7 +250,9 @@
internal val UNSAFE_METHODS = mapOf(
Method("androidx.lifecycle.LiveData", "observe") to LIVEDATA_ISSUE,
Method("androidx.lifecycle.LiveDataKt", "observe") to LIVEDATA_ISSUE,
- Method("androidx.activity.OnBackPressedDispatcher", "addCallback") to BACK_PRESSED_ISSUE
+ Method("androidx.activity.OnBackPressedDispatcher", "addCallback") to BACK_PRESSED_ISSUE,
+ Method("androidx.core.view.MenuHost", "addMenuProvider") to ADD_MENU_PROVIDER_ISSUE,
+ Method("androidx.core.view.MenuHostHelper", "addMenuProvider") to ADD_MENU_PROVIDER_ISSUE,
)
private const val FRAGMENT_CLASS = "androidx.fragment.app.Fragment"
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/AddMenuProviderDetectorTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/AddMenuProviderDetectorTest.kt
new file mode 100644
index 0000000..51314e8
--- /dev/null
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/AddMenuProviderDetectorTest.kt
@@ -0,0 +1,306 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.fragment.lint
+
+import androidx.fragment.lint.stubs.ADD_MENU_PROVIDER_STUBS
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestLintResult
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class AddMenuProviderDetectorTest : LintDetectorTest() {
+
+ override fun getDetector(): Detector = UnsafeFragmentLifecycleObserverDetector()
+
+ override fun getIssues(): MutableList<Issue> =
+ mutableListOf(UnsafeFragmentLifecycleObserverDetector.ADD_MENU_PROVIDER_ISSUE)
+
+ private fun check(vararg files: TestFile): TestLintResult {
+ return lint().files(*files, *ADD_MENU_PROVIDER_STUBS)
+ .run()
+ }
+
+ @Test
+ fun pass() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+import com.example.test.Foo
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ requireActivity().addMenuProvider(this, getViewLifecycleOwner())
+ requireActivity().addMenuProvider(this, viewLifecycleOwner)
+ requireActivity().addMenuProvider(this, viewLifecycleOwner, Lifecycle.State.STARTED)
+ }
+
+ override fun onViewCreated() {
+ test()
+ val foo = Foo()
+ foo.addMenuProvider(requireActivity(), this)
+ foo.menuProvider(this)
+ }
+
+ private fun test() {
+ requireActivity().addMenuProvider(this, getViewLifecycleOwner())
+ test()
+ }
+}
+ """
+ ),
+ kotlin(
+ """
+package com.example.test
+
+import androidx.activity.ComponentActivity
+import androidx.fragment.app.Fragment
+import androidx.lifecycle.LifecycleOwner
+
+class Foo {
+ fun addMenuProvider(activity: ComponentActivity, fragment: Fragment) {
+ activity.addMenuProvider(fragment, LifecycleOwner())
+ activity.addMenuProvider(fragment, LifecycleOwner(), Lifecycle.State.STARTED)
+ }
+
+ fun menuProvider(fragment: Fragment) {}
+}
+ """
+ )
+ )
+ .expectClean()
+ }
+
+ @Test
+ fun inMethodFails() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ requireActivity().addMenuProvider(this, this)
+ }
+}
+ """
+ )
+ )
+ .expect(
+ """
+src/com/example/TestFragment.kt:9: Error: Use viewLifecycleOwner as the LifecycleOwner. [FragmentAddMenuProvider]
+ requireActivity().addMenuProvider(this, this)
+ ~~~~
+1 errors, 0 warnings
+ """
+ )
+ .checkFix(
+ null,
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ requireActivity().addMenuProvider(this, viewLifecycleOwner)
+ }
+}
+ """
+ )
+ )
+ }
+
+ @Test
+ fun helperMethodFails() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ test()
+ }
+
+ private fun test() {
+ requireActivity().addMenuProvider(this, this)
+ }
+}
+ """
+ )
+ )
+ .expect(
+ """
+src/com/example/TestFragment.kt:13: Error: Use viewLifecycleOwner as the LifecycleOwner. [FragmentAddMenuProvider]
+ requireActivity().addMenuProvider(this, this)
+ ~~~~
+1 errors, 0 warnings
+ """
+ )
+ .checkFix(
+ null,
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ test()
+ }
+
+ private fun test() {
+ requireActivity().addMenuProvider(this, viewLifecycleOwner)
+ }
+}
+ """
+ )
+ )
+ }
+
+ @Test
+ fun externalCallFails() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+import com.example.test.Foo
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ test()
+ }
+
+ private fun test() {
+ val foo = Foo()
+ foo.addMenuProvider(requireActivity(), this)
+ }
+}
+ """
+ ),
+ kotlin(
+ """
+package com.example.test
+
+import androidx.activity.ComponentActivity
+import androidx.fragment.app.Fragment
+
+class Foo {
+ fun addMenuProvider(activity:ComponentActivity, fragment: Fragment) {
+ activity.addMenuProvider(fragment, fragment)
+ activity.addMenuProvider(fragment, fragment, Lifecycle.State.STARTED)
+ }
+}
+ """
+ )
+ )
+ .expect(
+ """
+src/com/example/test/Foo.kt:9: Error: Unsafe call to addMenuProvider with Fragment instance as LifecycleOwner from TestFragment.onCreateView. [FragmentAddMenuProvider]
+ activity.addMenuProvider(fragment, fragment)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/com/example/test/Foo.kt:10: Error: Unsafe call to addMenuProvider with Fragment instance as LifecycleOwner from TestFragment.onCreateView. [FragmentAddMenuProvider]
+ activity.addMenuProvider(fragment, fragment, Lifecycle.State.STARTED)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+2 errors, 0 warnings
+ """
+ )
+ }
+
+ @Test
+ fun externalHelperMethodFails() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+import com.example.test.Foo
+
+class TestFragment : Fragment {
+
+ override fun onCreateView() {
+ test()
+ }
+
+ private fun test() {
+ val foo = Foo()
+ foo.addMenuProvider(requireActivity(), this)
+ }
+}
+ """
+ ),
+ kotlin(
+ """
+package com.example.test
+
+import androidx.activity.ComponentActivity
+import androidx.fragment.app.Fragment
+
+class Foo {
+ private lateinit val fragment: Fragment
+
+ fun addMenuProvider(activity:ComponentActivity, fragment: Fragment) {
+ this.fragment = fragment
+ menuProvider(activity)
+ }
+
+ private fun menuProvider(activity:ComponentActivity) {
+ activity.addMenuProvider(fragment, fragment)
+ activity.addMenuProvider(fragment, fragment, Lifecycle.State.STARTED)
+ }
+}
+ """
+ )
+ )
+ .expect(
+ """
+src/com/example/test/Foo.kt:16: Error: Unsafe call to addMenuProvider with Fragment instance as LifecycleOwner from TestFragment.onCreateView. [FragmentAddMenuProvider]
+ activity.addMenuProvider(fragment, fragment)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+src/com/example/test/Foo.kt:17: Error: Unsafe call to addMenuProvider with Fragment instance as LifecycleOwner from TestFragment.onCreateView. [FragmentAddMenuProvider]
+ activity.addMenuProvider(fragment, fragment, Lifecycle.State.STARTED)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+2 errors, 0 warnings
+ """
+ )
+ }
+}
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/ApiLintVersionsTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/ApiLintVersionsTest.kt
index c5e38ba..e360c3f 100644
--- a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/ApiLintVersionsTest.kt
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/ApiLintVersionsTest.kt
@@ -35,6 +35,6 @@
assertThat(registry.api).isEqualTo(CURRENT_API)
// Intentionally fails in IDE, because we use different API version in
// studio and command line
- assertThat(registry.minApi).isEqualTo(8)
+ assertThat(registry.minApi).isEqualTo(11)
}
}
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/AttachAndDetachInSameTransactionDetectorTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/AttachAndDetachInSameTransactionDetectorTest.kt
new file mode 100644
index 0000000..2763613
--- /dev/null
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/AttachAndDetachInSameTransactionDetectorTest.kt
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.fragment.lint
+
+import androidx.fragment.lint.stubs.FRAGMENT_TRANSACTION_STUBS
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestLintResult
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Issue
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class AttachAndDetachInSameTransactionDetectorTest : LintDetectorTest() {
+
+ override fun getDetector(): Detector = AttachAndDetachInSameTransactionDetector()
+
+ override fun getIssues(): MutableList<Issue> =
+ mutableListOf(AttachAndDetachInSameTransactionDetector.DETACH_ATTACH_OPERATIONS_ISSUE)
+
+ private fun check(vararg files: TestFile): TestLintResult {
+ return lint().files(*files, *FRAGMENT_TRANSACTION_STUBS)
+ .run()
+ }
+
+ @Test
+ fun pass() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import com.example.test.Foo
+
+class Test {
+ private fun testPassingToAnotherClass() {
+ val ft = FragmentManager().beginTransaction()
+ val foo = Foo().commitTransaction(ft)
+ }
+
+ private fun testTwoDifferentFragments() {
+ val fragment1 = Fragment()
+ val fragment2 = Fragment()
+ val ft = FragmentManager().beginTransaction()
+ ft.attach(fragment1)
+ ft.detach(fragment2)
+ ft.commit()
+ }
+
+ // If the variable is reassigned even though it is the same instance we won't warn
+ private fun testReassign() {
+ val fragment3 = Fragment()
+ val fragment4 = fragment3
+ val ft = FragmentManager().beginTransaction()
+ ft.attach(fragment3)
+ ft.detach(fragment4)
+ ft.commit()
+ }
+
+ // If the fragment is passed through to another function we won't warn
+ private fun testPassingToAnother() {
+ val fragment = Fragment()
+ val ft = FragmentManager().beginTransaction()
+ ft.attach(fragment)
+ helper(ft, fragment)
+ }
+
+ private fun helper(ft: FragmentTransaction, fragment: Fragment) {
+ ft.detach(fragment)
+ ft.commit()
+ }
+}
+ """
+ ),
+ kotlin(
+ """
+package com.example.test
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentTransaction
+
+class Foo {
+ fun commitTransaction(fragmentTransaction: FragmentTransaction, fragment: Fragment) {
+ val fragment1 = Fragment()
+ val fragment2 = Fragment()
+ fragmentTransaction.attach(fragment1)
+ fragmentTransaction.detach(fragment2)
+ fragmentTransaction.commit()
+ }
+}
+ """
+ )
+ )
+ .expectClean()
+ }
+
+ @Test
+ fun inMethodFails() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentTransaction
+
+class Test {
+ private fun testInternal() {
+ val fragment = Fragment()
+ val ft = FragmentManager().beginTransaction()
+ ft.attach(fragment)
+ ft.detach(fragment)
+ ft.commit()
+ }
+}
+ """
+ )
+ )
+ .expect(
+ """
+src/com/example/Test.kt:11: Warning: Calling detach() and attach() in the same FragmentTransaction is a no-op, meaning it does not recreate the Fragment's view. If you would like the view to be recreated, separate these operations into separate transactions. [DetachAndAttachSameFragment]
+ val ft = FragmentManager().beginTransaction()
+ ~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+ """
+ )
+ }
+
+ @Test
+ fun helperMethodFails() {
+ check(
+ kotlin(
+ """
+package com.example
+
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentManager
+import androidx.fragment.app.FragmentTransaction
+
+class Test {
+ private fun test() {
+ val fragment = Fragment()
+ helper(fragment)
+ }
+
+ private fun helper(fragment: Fragment) {
+ val ft = FragmentManager().beginTransaction()
+ ft.detach(fragment)
+ ft.attach(fragment)
+ ft.commit()
+ }
+}
+ """
+ )
+ )
+ .expect(
+ """
+src/com/example/Test.kt:15: Warning: Calling detach() and attach() in the same FragmentTransaction is a no-op, meaning it does not recreate the Fragment's view. If you would like the view to be recreated, separate these operations into separate transactions. [DetachAndAttachSameFragment]
+ val ft = FragmentManager().beginTransaction()
+ ~~~~~~~~~~~~~~~~
+0 errors, 1 warnings
+ """
+ )
+ }
+}
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/FragmentLiveDataObserveDetectorTest.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/FragmentLiveDataObserveDetectorTest.kt
index 85b5fef..2904a31 100644
--- a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/FragmentLiveDataObserveDetectorTest.kt
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/FragmentLiveDataObserveDetectorTest.kt
@@ -86,7 +86,7 @@
fun observeData(fragment: Fragment) {
val liveData = MutableLiveData<String>()
liveData.observe(LifecycleOwner(), Observer<String> {})
- liveData.observe(fragment, Observer<String> {}, true)
+ liveData.observe(fragment.viewLifecycleOwner, Observer<String> {}, true)
}
fun observe(fragment: Fragment) {}
@@ -493,7 +493,6 @@
"""
)
)
-
.expectClean()
}
}
diff --git a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt
index ffdb9c4..274e123 100644
--- a/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt
+++ b/fragment/fragment-lint/src/test/java/androidx/fragment/lint/stubs/Stubs.kt
@@ -40,16 +40,66 @@
"""
)
+private val COMPONENT_ACTIVITY = java(
+ """
+ package androidx.activity;
+
+ import androidx.core.view.MenuHost;
+ import androidx.core.view.MenuProvider;
+ import androidx.lifecycle.Lifecycle;
+ import androidx.lifecycle.LifecycleOwner;
+
+ public class ComponentActivity implements MenuHost {
+ public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner) {
+
+ }
+
+ public void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner,
+ @NonNull Lifecycle.State state) { }
+ }
+ """
+)
+
private val FRAGMENT = java(
"""
package androidx.fragment.app;
+ import androidx.activity.ComponentActivity;
+ import androidx.core.view.MenuProvider;
import androidx.lifecycle.Lifecycle;
import androidx.lifecycle.LifecycleOwner;
- public class Fragment implements LifecycleOwner {
+ public class Fragment implements LifecycleOwner, MenuProvider {
public LifecycleOwner getViewLifecycleOwner() {}
public Lifecycle getLifecycle() {}
+ public ComponentActivity requireActivity() {
+ return ComponentActivity();
+ }
+ }
+ """
+)
+
+private val FRAGMENT_MANAGER = java(
+ """
+ package androidx.fragment.app;
+
+ public class FragmentManager {
+ public FragmentTransaction beginTransaction() { }
+ }
+ """
+)
+
+private val FRAGMENT_TRANSACTION = java(
+ """
+ package androidx.fragment.app;
+
+ public class FragmentTransaction {
+ public FragmentTransaction attach(Fragment fragment) { }
+ public FragmentTransaction detach(Fragment fragment) { }
+ public int commit() { }
+ public int commitAllowingStateLoss() { }
+ public int commitNow() { }
+ public int commitNowAllowingStateLoss() { }
}
"""
)
@@ -142,6 +192,33 @@
"""
).indented().within("src")
+private val MENU_PROVIDER = java(
+ """
+ package androidx.core.view;
+
+ import androidx.annotation.NonNull;
+
+ public interface MenuProvider { }
+ """
+)
+
+private val MENU_HOST = java(
+ """
+ package androidx.core.view;
+
+ import androidx.annotation.NonNull;
+ import androidx.lifecycle.Lifecycle;
+ import androidx.lifecycle.LifecycleOwner;
+
+ public interface MenuHost {
+ void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner);
+
+ void addMenuProvider(@NonNull MenuProvider provider, @NonNull LifecycleOwner owner,
+ @NonNull Lifecycle.State state);
+ }
+ """
+)
+
private val COROUTINES = TestFiles.kt(
"kotlinx/coroutines/GlobalScope.kt",
"""
@@ -170,8 +247,21 @@
"""
).indented().within("src")
+// stubs for testing fragment transaction stubs
+internal val FRAGMENT_TRANSACTION_STUBS = arrayOf(
+ COMPONENT_ACTIVITY,
+ FRAGMENT,
+ FRAGMENT_MANAGER,
+ FRAGMENT_TRANSACTION,
+ LIFECYCLE,
+ LIFECYCLE_OWNER,
+ MENU_HOST,
+ MENU_PROVIDER
+)
+
// stubs for testing calls to LiveData.observe calls
internal val LIVEDATA_STUBS = arrayOf(
+ COMPONENT_ACTIVITY,
FRAGMENT,
DIALOG_FRAGMENT,
LIFECYCLE,
@@ -179,24 +269,42 @@
LIVEDATA,
MUTABLE_LIVEDATA,
OBSERVER,
- LIVEDATA_OBSERVE_EXTENSION
+ LIVEDATA_OBSERVE_EXTENSION,
+ MENU_HOST,
+ MENU_PROVIDER
)
// stubs for testing calls to OnBackPressedDispatcher.addCallback calls
internal val BACK_CALLBACK_STUBS = arrayOf(
+ COMPONENT_ACTIVITY,
BACK_PRESSED_CALLBACK,
BACK_PRESSED_DISPATCHER,
FRAGMENT,
LIFECYCLE,
- LIFECYCLE_OWNER
+ LIFECYCLE_OWNER,
+ MENU_HOST,
+ MENU_PROVIDER
)
// stubs for testing calls to LifecycleOwner.repeatOnLifecycle
internal val REPEAT_ON_LIFECYCLE_STUBS = arrayOf(
+ COMPONENT_ACTIVITY,
REPEAT_ON_LIFECYCLE,
DIALOG_FRAGMENT,
FRAGMENT,
COROUTINES,
LIFECYCLE,
- LIFECYCLE_OWNER
+ LIFECYCLE_OWNER,
+ MENU_HOST,
+ MENU_PROVIDER
+)
+
+// stubs for testing calls to MenuHost.addMenuProvider calls
+internal val ADD_MENU_PROVIDER_STUBS = arrayOf(
+ COMPONENT_ACTIVITY,
+ FRAGMENT,
+ LIFECYCLE,
+ LIFECYCLE_OWNER,
+ MENU_HOST,
+ MENU_PROVIDER
)
diff --git a/fragment/fragment-testing/build.gradle b/fragment/fragment-testing/build.gradle
index 6d3ac16..93569ee 100644
--- a/fragment/fragment-testing/build.gradle
+++ b/fragment/fragment-testing/build.gradle
@@ -16,6 +16,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -47,3 +48,15 @@
inceptionYear = "2018"
description = "Extensions for testing 'fragment' artifact"
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/fragment/fragment/build.gradle b/fragment/fragment/build.gradle
index 67ce884..eedd7b9 100644
--- a/fragment/fragment/build.gradle
+++ b/fragment/fragment/build.gradle
@@ -1,5 +1,6 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -72,3 +73,15 @@
inceptionYear = "2011"
description = "The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren\'t a part of the framework APIs. Compatible on devices running API 14 or later."
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
index 9a12236..4c241d2 100644
--- a/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
+++ b/fragment/fragment/src/androidTest/java/androidx/fragment/app/FragmentTransitionTest.kt
@@ -15,6 +15,7 @@
*/
package androidx.fragment.app
+import android.os.Build
import android.os.Bundle
import android.transition.Transition
import android.transition.TransitionSet
@@ -51,7 +52,7 @@
@MediumTest
@RunWith(Parameterized::class)
-@SdkSuppress(minSdkVersion = 31)
+@SdkSuppress(minSdkVersion = Build.VERSION_CODES.LOLLIPOP)
class FragmentTransitionTest(
private val reorderingAllowed: ReorderingAllowed
) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
index 0c3cbbf..c2f2434 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DefaultSpecialEffectsController.java
@@ -664,6 +664,13 @@
mergedTransition = transitionImpl.mergeTransitionsInSequence(mergedTransition,
mergedNonOverlappingTransition, sharedElementTransition);
+ // If there's no transitions playing together, no non-overlapping transitions,
+ // and no shared element transitions, mergedTransition will be null and
+ // there's nothing else we need to do
+ if (mergedTransition == null) {
+ return startedTransitions;
+ }
+
// Now set up our completion signal on the completely merged transition set
for (final TransitionInfo transitionInfo : transitionInfos) {
if (transitionInfo.isVisibilityUnchanged()) {
diff --git a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
index d30bf10..3fe29ea 100644
--- a/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
+++ b/fragment/fragment/src/main/java/androidx/fragment/app/DialogFragment.java
@@ -256,6 +256,7 @@
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
+ ft.setReorderingAllowed(true);
ft.add(this, tag);
ft.commit();
}
@@ -293,6 +294,7 @@
mDismissed = false;
mShownByMe = true;
FragmentTransaction ft = manager.beginTransaction();
+ ft.setReorderingAllowed(true);
ft.add(this, tag);
ft.commitNow();
}
@@ -348,6 +350,7 @@
mBackStackId = -1;
} else {
FragmentTransaction ft = getParentFragmentManager().beginTransaction();
+ ft.setReorderingAllowed(true);
ft.remove(this);
if (allowStateLoss) {
ft.commitAllowingStateLoss();
diff --git a/glance/OWNERS b/glance/OWNERS
index 2f69525..295f41f 100644
--- a/glance/OWNERS
+++ b/glance/OWNERS
@@ -1,3 +1,7 @@
andreykulikov@google.com
jgarside@google.com
pbdr@google.com
+zoepage@google.com
+kideckel@google.com
+boadway@google.com
+wvk@google.com
\ No newline at end of file
diff --git a/glance/glance-appwidget/api/current.txt b/glance/glance-appwidget/api/current.txt
index a2a4c1d..d20e647 100644
--- a/glance/glance-appwidget/api/current.txt
+++ b/glance/glance-appwidget/api/current.txt
@@ -12,6 +12,9 @@
public final class CoroutineBroadcastReceiverKt {
}
+ public final class GeneratedLayoutsKt {
+ }
+
public abstract class GlanceAppWidget {
ctor public GlanceAppWidget();
method @androidx.compose.runtime.Composable public abstract void Content();
@@ -32,6 +35,9 @@
public interface GlanceId {
}
+ public final class LayoutIdsKt {
+ }
+
public final class RemoteLazyListViewsTranslatorKt {
}
@@ -56,15 +62,31 @@
field public static final androidx.glance.appwidget.SizeMode.Single INSTANCE;
}
+ public final class UtilsKt {
+ }
+
}
package androidx.glance.appwidget.layout {
+ public final class AndroidRemoteViewsKt {
+ method @androidx.compose.runtime.Composable public static void AndroidRemoteViews(android.widget.RemoteViews remoteViews);
+ method @androidx.compose.runtime.Composable public static void AndroidRemoteViews(android.widget.RemoteViews remoteViews, @IdRes int containerViewId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ }
+
+ public final class CheckBoxKt {
+ method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+ }
+
@androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyItemScope {
}
public final class LazyListKt {
method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
@androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyListScope {
@@ -83,3 +105,13 @@
}
+package androidx.glance.appwidget.translators {
+
+ public final class CheckBoxTranslatorKt {
+ }
+
+ public final class TextTranslatorKt {
+ }
+
+}
+
diff --git a/glance/glance-appwidget/api/public_plus_experimental_current.txt b/glance/glance-appwidget/api/public_plus_experimental_current.txt
index a2a4c1d..d20e647 100644
--- a/glance/glance-appwidget/api/public_plus_experimental_current.txt
+++ b/glance/glance-appwidget/api/public_plus_experimental_current.txt
@@ -12,6 +12,9 @@
public final class CoroutineBroadcastReceiverKt {
}
+ public final class GeneratedLayoutsKt {
+ }
+
public abstract class GlanceAppWidget {
ctor public GlanceAppWidget();
method @androidx.compose.runtime.Composable public abstract void Content();
@@ -32,6 +35,9 @@
public interface GlanceId {
}
+ public final class LayoutIdsKt {
+ }
+
public final class RemoteLazyListViewsTranslatorKt {
}
@@ -56,15 +62,31 @@
field public static final androidx.glance.appwidget.SizeMode.Single INSTANCE;
}
+ public final class UtilsKt {
+ }
+
}
package androidx.glance.appwidget.layout {
+ public final class AndroidRemoteViewsKt {
+ method @androidx.compose.runtime.Composable public static void AndroidRemoteViews(android.widget.RemoteViews remoteViews);
+ method @androidx.compose.runtime.Composable public static void AndroidRemoteViews(android.widget.RemoteViews remoteViews, @IdRes int containerViewId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ }
+
+ public final class CheckBoxKt {
+ method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+ }
+
@androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyItemScope {
}
public final class LazyListKt {
method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
@androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyListScope {
@@ -83,3 +105,13 @@
}
+package androidx.glance.appwidget.translators {
+
+ public final class CheckBoxTranslatorKt {
+ }
+
+ public final class TextTranslatorKt {
+ }
+
+}
+
diff --git a/glance/glance-appwidget/api/restricted_current.txt b/glance/glance-appwidget/api/restricted_current.txt
index a2a4c1d..d20e647 100644
--- a/glance/glance-appwidget/api/restricted_current.txt
+++ b/glance/glance-appwidget/api/restricted_current.txt
@@ -12,6 +12,9 @@
public final class CoroutineBroadcastReceiverKt {
}
+ public final class GeneratedLayoutsKt {
+ }
+
public abstract class GlanceAppWidget {
ctor public GlanceAppWidget();
method @androidx.compose.runtime.Composable public abstract void Content();
@@ -32,6 +35,9 @@
public interface GlanceId {
}
+ public final class LayoutIdsKt {
+ }
+
public final class RemoteLazyListViewsTranslatorKt {
}
@@ -56,15 +62,31 @@
field public static final androidx.glance.appwidget.SizeMode.Single INSTANCE;
}
+ public final class UtilsKt {
+ }
+
}
package androidx.glance.appwidget.layout {
+ public final class AndroidRemoteViewsKt {
+ method @androidx.compose.runtime.Composable public static void AndroidRemoteViews(android.widget.RemoteViews remoteViews);
+ method @androidx.compose.runtime.Composable public static void AndroidRemoteViews(android.widget.RemoteViews remoteViews, @IdRes int containerViewId, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ }
+
+ public final class CheckBoxKt {
+ method @androidx.compose.runtime.Composable public static void CheckBox(boolean checked, optional androidx.glance.Modifier modifier, optional String text, optional androidx.glance.text.TextStyle? textStyle);
+ }
+
@androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyItemScope {
}
public final class LazyListKt {
method @androidx.compose.runtime.Composable public static void LazyColumn(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.appwidget.layout.LazyListScope,kotlin.Unit> content);
+ method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void items(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function1<? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function2<? super androidx.glance.appwidget.layout.LazyItemScope,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, java.util.List<? extends T> items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
+ method public static inline <T> void itemsIndexed(androidx.glance.appwidget.layout.LazyListScope, T![] items, optional kotlin.jvm.functions.Function2<? super java.lang.Integer,? super T,java.lang.Long> itemId, kotlin.jvm.functions.Function3<? super androidx.glance.appwidget.layout.LazyItemScope,? super java.lang.Integer,? super T,kotlin.Unit> itemContent);
}
@androidx.glance.appwidget.layout.LazyScopeMarker public interface LazyListScope {
@@ -83,3 +105,13 @@
}
+package androidx.glance.appwidget.translators {
+
+ public final class CheckBoxTranslatorKt {
+ }
+
+ public final class TextTranslatorKt {
+ }
+
+}
+
diff --git a/glance/glance-appwidget/build.gradle b/glance/glance-appwidget/build.gradle
index c5532cd..e8d6185 100644
--- a/glance/glance-appwidget/build.gradle
+++ b/glance/glance-appwidget/build.gradle
@@ -19,6 +19,7 @@
import androidx.build.LibraryGroups
import androidx.build.LibraryType
import androidx.build.Publish
+import androidx.glance.appwidget.layoutgenerator.gradle.LayoutGeneratorTask
plugins {
id("AndroidXPlugin")
@@ -27,7 +28,7 @@
}
// Disable multi-platform; this will only be used on Android.
-AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project, /* isMultiplatformEnabled= */false)
+AndroidXComposePlugin.applyAndConfigureKotlinPlugin(project, /* isMultiplatformEnabled= */ false)
dependencies {
kotlinPlugin(project(":compose:compiler:compiler"))
@@ -51,6 +52,7 @@
testImplementation(libs.testRules)
testImplementation(libs.testRunner)
testImplementation(libs.truth)
+ testImplementation(libs.kotlinReflect)
androidTestImplementation(project(":test:screenshot:screenshot"))
androidTestImplementation(project(":core:core-ktx"))
@@ -64,6 +66,7 @@
androidTestImplementation(libs.testRules)
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.truth)
+ androidTestImplementation(libs.kotlinReflect)
}
android {
@@ -73,6 +76,12 @@
sourceSets {
androidTest.assets.srcDirs += project.rootDir.absolutePath + "/../../golden/glance/glance-appwidget"
}
+
+ buildTypes {
+ debug {
+ pseudoLocalesEnabled true
+ }
+ }
}
androidx {
@@ -85,3 +94,9 @@
"using a Jetpack Compose-style API."
targetsJavaConsumers = false
}
+
+LayoutGeneratorTask.registerLayoutGenerator(
+ project,
+ android,
+ /* layoutDirectory= */ file("src/androidMain/layoutTemplates")
+)
diff --git a/glance/glance-appwidget/glance-layout-generator/build.gradle b/glance/glance-appwidget/glance-layout-generator/build.gradle
new file mode 100644
index 0000000..ae28bfd
--- /dev/null
+++ b/glance/glance-appwidget/glance-layout-generator/build.gradle
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+
+import androidx.build.LibraryGroups
+import androidx.build.LibraryType
+import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
+
+plugins {
+ id("AndroidXPlugin")
+ id("kotlin")
+}
+
+dependencies {
+ implementation(gradleApi())
+
+ implementation(libs.androidGradlePluginz)
+ implementation(libs.kotlinGradlePluginz)
+ implementation(libs.kotlinStdlib)
+ implementation(libs.kotlinPoet)
+}
+
+androidx {
+ name = "Glance AppWidget Layout Generator"
+ type = LibraryType.OTHER_CODE_PROCESSOR
+ publish = Publish.NONE
+ mavenGroup = LibraryGroups.GLANCE
+ inceptionYear = "2021"
+ description = "Generator module that generates the layouts Glance AppWidget needs."
+}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt
similarity index 69%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt
index 2ab52fb..86aa20f 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/ClearResources.kt
@@ -14,7 +14,12 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.glance.appwidget.layoutgenerator
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import java.io.File
+
+fun cleanResources(resourcesFolder: File, generatedFiles: Set<File>) {
+ checkNotNull(resourcesFolder.listFiles())
+ .filter { it !in generatedFiles }
+ .forEach { it.delete() }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt
new file mode 100644
index 0000000..7f513eb
--- /dev/null
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/GenerateRegistry.kt
@@ -0,0 +1,180 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.layoutgenerator
+
+import com.squareup.kotlinpoet.ClassName
+import com.squareup.kotlinpoet.CodeBlock
+import com.squareup.kotlinpoet.FileSpec
+import com.squareup.kotlinpoet.KModifier
+import com.squareup.kotlinpoet.MemberName
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.PropertySpec
+import com.squareup.kotlinpoet.asTypeName
+import com.squareup.kotlinpoet.buildCodeBlock
+import com.squareup.kotlinpoet.joinToCode
+import java.io.File
+
+/**
+ * Generate the registry: a mapping from `LayoutSelector` to `Layout`.
+ *
+ * For each generated layout, a selector is created describing what the layout can and cannot do.
+ * It is mapped to a `Layout`, an object describing the parameters needed to act on the layout.
+ */
+internal fun generateRegistry(
+ packageName: String,
+ layouts: Map<File, LayoutProperties>,
+ outputSourceDir: File,
+) {
+ outputSourceDir.mkdirs()
+ val file = FileSpec.builder(packageName, "GeneratedLayouts")
+ file.addComment(LicenseComment)
+ val generatedLayouts = PropertySpec.builder(
+ "generatedLayouts",
+ LayoutsMap,
+ KModifier.INTERNAL
+ ).apply {
+ initializer(buildInitializer(layouts))
+ }.build()
+ file.addProperty(generatedLayouts)
+ file.build().writeTo(outputSourceDir)
+}
+
+private fun buildInitializer(layouts: Map<File, LayoutProperties>): CodeBlock {
+ return buildCodeBlock {
+ addStatement("mapOf(")
+ withIndent {
+ add(
+ layouts.map {
+ it.key to createFileInitializer(it.key, it.value.mainViewId)
+ }
+ .sortedBy { it.first.nameWithoutExtension }
+ .map { it.second }
+ .joinToCode("")
+ )
+ }
+ addStatement(")")
+ }
+}
+
+private fun createFileInitializer(layout: File, mainViewId: String): CodeBlock = buildCodeBlock {
+ val viewType = layout.nameWithoutExtension.toLayoutType()
+ ValidSize.values().forEach { width ->
+ ValidSize.values().forEach { height ->
+ addLayout(
+ resourceName = makeSimpleResourceName(layout, width, height),
+ viewType = viewType,
+ width = width,
+ height = height,
+ canResize = false,
+ mainViewId = "R.id.$mainViewId",
+ sizeViewId = null
+ )
+ addLayout(
+ resourceName = makeComplexResourceName(layout, width, height),
+ viewType = viewType,
+ width = width,
+ height = height,
+ canResize = true,
+ mainViewId = "R.id.$mainViewId",
+ sizeViewId = "R.id.sizeView"
+ )
+ }
+ }
+}
+
+private fun CodeBlock.Builder.addLayout(
+ resourceName: String,
+ viewType: String,
+ width: ValidSize,
+ height: ValidSize,
+ canResize: Boolean,
+ mainViewId: String,
+ sizeViewId: String?
+) {
+ addStatement(
+ "%T(type = %M, width = %M, height = %M, canResize = $canResize) to ",
+ LayoutSelector,
+ makeViewType(viewType),
+ width.toValue(),
+ height.toValue(),
+ )
+ withIndent {
+ addStatement("%T(", LayoutIds)
+ withIndent {
+ addStatement("layoutId = R.layout.$resourceName,")
+ addStatement("mainViewId = $mainViewId,")
+ addStatement("sizeViewId = $sizeViewId,")
+ }
+ addStatement("),")
+ }
+}
+
+private val LayoutSelector = ClassName("androidx.glance.appwidget", "LayoutSelector")
+private val LayoutIds = ClassName("androidx.glance.appwidget", "LayoutIds")
+private val LayoutsMap = Map::class.asTypeName().parameterizedBy(LayoutSelector, LayoutIds)
+private const val LayoutSpecSize = "androidx.glance.appwidget.LayoutSelector.Size"
+private val WrapValue = MemberName("$LayoutSpecSize", "Wrap")
+private val FixedValue = MemberName("$LayoutSpecSize", "Fixed")
+private val MatchValue = MemberName("$LayoutSpecSize", "MatchParent")
+private val ExpandValue = MemberName("$LayoutSpecSize", "Expand")
+
+private fun makeViewType(name: String) =
+ MemberName("androidx.glance.appwidget.LayoutSelector.Type", name)
+
+private fun String.toLayoutType() =
+ snakeRegex.replace(this) {
+ it.value.replace("_", "").uppercase()
+ }.replaceFirstChar { it.uppercaseChar() }
+
+private val snakeRegex = "_[a-zA-Z0-9]".toRegex()
+
+private fun ValidSize.toValue() = when (this) {
+ ValidSize.Wrap -> WrapValue
+ ValidSize.Fixed -> FixedValue
+ ValidSize.Expand -> ExpandValue
+ ValidSize.Match -> MatchValue
+}
+
+internal fun makeSimpleResourceName(file: File, width: ValidSize, height: ValidSize) =
+ "${file.nameWithoutExtension}_simple_${width.resourceName}_${height.resourceName}"
+
+internal fun makeComplexResourceName(file: File, width: ValidSize, height: ValidSize) =
+ "${file.nameWithoutExtension}_complex_${width.resourceName}_${height.resourceName}"
+
+fun CodeBlock.Builder.withIndent(builderAction: CodeBlock.Builder.() -> Unit): CodeBlock.Builder {
+ indent()
+ apply(builderAction)
+ unindent()
+ return this
+}
+
+val LicenseComment =
+ """
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ """.trimIndent()
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt
new file mode 100644
index 0000000..b79fc53
--- /dev/null
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/LayoutGenerator.kt
@@ -0,0 +1,284 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.layoutgenerator
+
+import org.w3c.dom.Document
+import org.w3c.dom.Node
+import java.io.File
+import javax.xml.parsers.DocumentBuilderFactory
+import javax.xml.transform.OutputKeys
+import javax.xml.transform.TransformerFactory
+import javax.xml.transform.dom.DOMSource
+import javax.xml.transform.stream.StreamResult
+
+/**
+ * Generate the layouts from the templates provided to the task.
+ *
+ * For each layout template, 18 layouts are created: 9 simple and 9 complex. The simple layouts
+ * are there to create non-resizable views, while complex layouts are there to create resizable
+ * layouts (i.e. layout with at least one dimension sets explicitly in dip).
+ *
+ * A layout should be of the form:
+ *
+ * ```
+ * <TargetView prop1="" ... />
+ * ```
+ *
+ * For example, for the row:
+ *
+ * ```
+ * <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ * android:orientation="horizontal" />
+ * ```
+ *
+ * The template should not define the view id, or the desired width and height of the view.
+ */
+internal class LayoutGenerator {
+
+ private val documentBuilderFactory by lazy {
+ DocumentBuilderFactory.newInstance().apply {
+ isNamespaceAware = true
+ }
+ }
+
+ private val documentBuilder by lazy { documentBuilderFactory.newDocumentBuilder()!! }
+
+ private val transformerFactory by lazy { TransformerFactory.newInstance() }
+
+ fun parseLayoutTemplate(input: File): Document = documentBuilder.parse(input)
+
+ fun writeGeneratedLayout(document: Document, output: File) {
+ transformerFactory.newTransformer().apply {
+ setOutputProperty(OutputKeys.INDENT, "yes")
+ transform(DOMSource(document), StreamResult(output))
+ }
+ }
+
+ fun extractMainViewId(document: Document) =
+ document.documentElement.androidId?.textContent?.replace("@id/", "") ?: "glanceView"
+
+ /**
+ * Generate files and return a mapping from File object to a structure defining useful
+ * information extracted from the input.
+ */
+ fun generateAllFiles(files: List<File>, outputResourcesDir: File): Map<File, LayoutProperties> {
+ val outputLayoutDir = outputResourcesDir.resolve("layout")
+ outputLayoutDir.mkdirs()
+ return files.associate {
+ it to generateForFile(it, outputLayoutDir)
+ }
+ }
+
+ private fun generateForFile(file: File, outputLayoutDir: File): LayoutProperties {
+ val document = parseLayoutTemplate(file)
+ ValidSize.values().forEach { width ->
+ ValidSize.values().forEach { height ->
+ val simpleLayout = generateSimpleLayout(document, width, height)
+ writeGeneratedLayout(
+ simpleLayout,
+ outputLayoutDir.resolve("${makeSimpleResourceName(file, width, height)}.xml")
+ )
+ val complexLayout = generateComplexLayout(document, width, height)
+ writeGeneratedLayout(
+ complexLayout,
+ outputLayoutDir.resolve("${makeComplexResourceName(file, width, height)}.xml")
+ )
+ }
+ }
+ return LayoutProperties(mainViewId = extractMainViewId(document))
+ }
+
+ /**
+ * Generate a simple layout.
+ *
+ * A simple layout only contains the view itself, set up for a given width and height.
+ * On Android R-, simple layouts are non-resizable.
+ */
+ fun generateSimpleLayout(
+ document: Document,
+ width: ValidSize,
+ height: ValidSize
+ ): Document {
+ val generated = documentBuilder.newDocument()
+ val root = generated.importNode(document.documentElement, true)
+ generated.appendChild(generated.createComment(LicenseComment))
+ generated.appendChild(root)
+ root.attributes.apply {
+ setNamedItem(generated.androidNamespace)
+ if (root.androidId == null) {
+ setNamedItemNS(generated.androidId("@id/glanceView"))
+ }
+ setNamedItemNS(generated.androidWidth(width))
+ setNamedItemNS(generated.androidHeight(height))
+ if (width == ValidSize.Expand || height == ValidSize.Expand) {
+ setNamedItemNS(generated.androidWeight("1"))
+ }
+ setNamedItemNS(generated.androidLayoutDirection("locale"))
+ }
+ return generated
+ }
+
+ /**
+ * Generate a complex layout.
+ *
+ * A complex layout contains a RelativeLayout containing the target view and a TextView,
+ * which will be used to resize the target view.
+ *
+ * Complex layouts are always resizable.
+ *
+ * The complex layouts follow the following pattern:
+ *
+ * ```
+ * <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ * android:id="@id/relativeLayout"
+ * android:layout_height="match_parent"
+ * android:layout_width="wrap_content">
+ *
+ * <TextView
+ * android:id="@id/sizeView"
+ * android:layout_height="match_parent"
+ * android:layout_width="wrap_content"/>
+ *
+ * <TargetView
+ * android:id="@id/glanceView"
+ * android:layout_height="wrap_content"
+ * android:layout_width="wrap_content"
+ * android:layout_alignBottom="@id/sizeView"
+ * android:layout_alignLeft="@id/sizeView"
+ * android:layout_alignRight="@id/sizeView"
+ * android:layout_alignTop="@id/sizeView" />
+ * </RelativeLayout>
+ * ```
+ *
+ * The width and height of the target view are always set to `wrap_content`, so
+ * `wrap_content` on the `TextView` works properly.
+ *
+ * The width and height on the `RelativeLayout` are set to be what we want to achieve. If the
+ * desired dimension is `Expand`, a weight of 1 is specified. This implies we cannot let the
+ * developer control the proportion of the space used by a particular view, but there is no
+ * way to control this programmatically, and allowing even a few standard values would
+ * increase drastically the number of generated layouts.
+ *
+ * The width and height of the `TextView` are `match_parent` by default, unless the desired
+ * dimension is `wrap_content`, in which case it is also set to `wrap_content`.
+ */
+ fun generateComplexLayout(
+ document: Document,
+ width: ValidSize,
+ height: ValidSize
+ ): Document {
+ val generated = documentBuilder.newDocument()
+ val root = generated.createElement("RelativeLayout")
+ generated.appendChild(generated.createComment(LicenseComment))
+ generated.appendChild(root)
+ root.attributes.apply {
+ setNamedItemNS(generated.androidId("@id/relativeLayout"))
+ setNamedItemNS(generated.androidWidth(width))
+ setNamedItemNS(generated.androidHeight(height))
+ if (width == ValidSize.Expand || height == ValidSize.Expand) {
+ setNamedItemNS(generated.androidWeight("1"))
+ }
+ }
+ val sizeView = generated.createElement("TextView")
+ root.appendChild(sizeView)
+ sizeView.attributes.apply {
+ setNamedItemNS(generated.androidId("@id/sizeView"))
+ setNamedItemNS(generated.androidWidth(width.toSizeViewDimension()))
+ setNamedItemNS(generated.androidHeight(height.toSizeViewDimension()))
+ }
+ val mainNode = generated.importNode(document.documentElement, true)
+ root.appendChild(mainNode)
+ mainNode.attributes.apply {
+ if (mainNode.androidId == null) {
+ setNamedItemNS(generated.androidId("@id/glanceView"))
+ }
+
+ if (width == ValidSize.Wrap) {
+ setNamedItemNS(generated.androidWidth(ValidSize.Wrap))
+ } else {
+ // If the view's width isn't wrap_content, its width is determined by sizeView. Use
+ // 0dp width for efficiency.
+ setNamedItemNS(generated.androidWidth(ValidSize.Expand))
+ setNamedItemNS(generated.androidAttr("layout_alignLeft", "@id/sizeView"))
+ setNamedItemNS(generated.androidAttr("layout_alignRight", "@id/sizeView"))
+ }
+
+ if (height == ValidSize.Wrap) {
+ setNamedItemNS(generated.androidHeight(ValidSize.Wrap))
+ } else {
+ // If the view's height isn't wrap_content, its height is determined by sizeView.
+ // Use 0dp height for efficiency.
+ setNamedItemNS(generated.androidHeight(ValidSize.Expand))
+ setNamedItemNS(generated.androidAttr("layout_alignTop", "@id/sizeView"))
+ setNamedItemNS(generated.androidAttr("layout_alignBottom", "@id/sizeView"))
+ }
+ setNamedItemNS(generated.androidLayoutDirection("locale"))
+ }
+ return generated
+ }
+}
+
+internal data class LayoutProperties(
+ val mainViewId: String
+)
+
+internal enum class ValidSize(val androidValue: String, val resourceName: String) {
+ Wrap("wrap_content", "wrap"),
+ Fixed("wrap_content", "fixed"),
+ Match("match_parent", "match"),
+ Expand("0dp", "expand")
+}
+
+private val AndroidNS = "http://schemas.android.com/apk/res/android"
+
+internal fun Document.androidAttr(name: String, value: String) =
+ createAttributeNS(AndroidNS, "android:$name").apply {
+ textContent = value
+ }
+
+internal fun Node.androidAttr(name: String): Node? =
+ attributes.getNamedItemNS(AndroidNS, name)
+
+internal fun Document.androidId(value: String) = androidAttr("id", value)
+
+internal val Node.androidId: Node?
+ get() = androidAttr("id")
+
+internal fun Document.androidWidth(value: ValidSize) =
+ androidAttr("layout_width", value.androidValue)
+
+internal fun Document.androidHeight(value: ValidSize) =
+ androidAttr("layout_height", value.androidValue)
+
+internal fun Document.androidWeight(value: String) = androidAttr("layout_weight", value)
+
+internal fun Document.androidLayoutDirection(value: String) =
+ androidAttr("layoutDirection", value)
+
+internal val Document.androidNamespace
+ get() = createAttribute("xmlns:android").apply {
+ textContent = AndroidNS
+ }
+
+/**
+ * Returns the [ValidSize] to be used for the sizing TextView given the [ValidSize] for the main
+ * view.
+ */
+internal fun ValidSize.toSizeViewDimension() = when (this) {
+ ValidSize.Wrap, ValidSize.Fixed -> ValidSize.Wrap
+ ValidSize.Match, ValidSize.Expand -> ValidSize.Match
+}
diff --git a/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt
new file mode 100644
index 0000000..f2e73cb
--- /dev/null
+++ b/glance/glance-appwidget/glance-layout-generator/src/main/kotlin/androidx/glance/appwidget/layoutgenerator/gradle/LayoutGeneratorTask.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.layoutgenerator.gradle
+
+import androidx.glance.appwidget.layoutgenerator.LayoutGenerator
+import androidx.glance.appwidget.layoutgenerator.cleanResources
+import androidx.glance.appwidget.layoutgenerator.generateRegistry
+import com.android.build.gradle.LibraryExtension
+import org.gradle.api.DefaultTask
+import org.gradle.api.Project
+import org.gradle.api.file.DirectoryProperty
+import org.gradle.api.tasks.InputDirectory
+import org.gradle.api.tasks.OutputDirectory
+import org.gradle.api.tasks.PathSensitive
+import org.gradle.api.tasks.PathSensitivity
+import org.gradle.api.tasks.TaskAction
+import java.io.File
+
+/**
+ * Task generating the layouts from a set of Layout templates.
+ *
+ * See [LayoutGenerator] for details on the template format, and [generateRegistry] for details
+ * on the Kotlin code generated to access those layouts from code.
+ */
+abstract class LayoutGeneratorTask : DefaultTask() {
+
+ @get:PathSensitive(PathSensitivity.NAME_ONLY)
+ @get:InputDirectory
+ abstract val layoutDirectory: DirectoryProperty
+
+ @get:OutputDirectory
+ abstract val outputSourceDir: DirectoryProperty
+
+ @get:OutputDirectory
+ abstract val outputResourcesDir: DirectoryProperty
+
+ @TaskAction
+ fun execute() {
+ val generatedFiles = LayoutGenerator().generateAllFiles(
+ checkNotNull(layoutDirectory.get().asFile.listFiles()).asList(),
+ outputResourcesDir.get().asFile
+ )
+ generateRegistry(outputModule, generatedFiles, outputSourceDir.get().asFile)
+ cleanResources(outputResourcesDir.get().asFile, generatedFiles.keys)
+ }
+
+ companion object {
+ /**
+ * Registers [LayoutGeneratorTask] in [project] for all variants in [libraryExtension].
+ */
+ @JvmStatic
+ fun registerLayoutGenerator(
+ project: Project,
+ libraryExtension: LibraryExtension,
+ layoutDirectory: File
+ ) {
+ libraryExtension.libraryVariants.all { variant ->
+ val variantName = variant.name
+ val outputDirectory = project.buildDir.resolve("generatedLayouts/$variantName")
+ val outputResourcesDir = outputDirectory.resolve("res/layouts")
+ val outputSourceDir = outputDirectory.resolve("kotlin")
+ val taskName =
+ "generateLayouts" + variantName.replaceFirstChar { it.uppercaseChar() }
+ outputResourcesDir.mkdirs()
+ outputSourceDir.mkdirs()
+ val task = project.tasks.register(taskName, LayoutGeneratorTask::class.java) {
+ it.layoutDirectory.set(layoutDirectory)
+ it.outputResourcesDir.set(outputResourcesDir)
+ it.outputSourceDir.set(outputSourceDir)
+ }
+ variant.registerGeneratedResFolders(
+ project.files(outputResourcesDir).builtBy(task)
+ )
+ variant.registerJavaGeneratingTask(task, outputSourceDir)
+ }
+ }
+ }
+}
+
+private const val outputModule: String = "androidx.glance.appwidget"
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml b/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
index 68a4649..57f8c28 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/AndroidManifest.xml
@@ -28,10 +28,36 @@
android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+ <action android:name="android.intent.action.LOCALE_CHANGED" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/responsive_app_widget_info" />
</receiver>
+
+ <receiver
+ android:name="androidx.glance.appwidget.demos.ResizingAppWidgetReceiver"
+ android:label="@string/resizing_widget_name"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+ <action android:name="android.intent.action.LOCALE_CHANGED" />
+ </intent-filter>
+ <meta-data
+ android:name="android.appwidget.provider"
+ android:resource="@xml/resizing_app_widget_info" />
+ </receiver>
+
+ <receiver
+ android:name="androidx.glance.appwidget.demos.CheckBoxAppWidgetReceiver"
+ android:label="@string/check_box_widget_name"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
+ </intent-filter>
+ <meta-data
+ android:name="android.appwidget.provider"
+ android:resource="@xml/check_box_app_widget_info" />
+ </receiver>
</application>
</manifest>
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CheckBoxAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CheckBoxAppWidget.kt
new file mode 100644
index 0000000..d537f032
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/CheckBoxAppWidget.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.demos
+
+import androidx.compose.runtime.Composable
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.GlanceAppWidgetReceiver
+import androidx.glance.appwidget.layout.CheckBox
+import androidx.glance.layout.Column
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextStyle
+import androidx.glance.unit.sp
+
+class CheckBoxAppWidget : GlanceAppWidget() {
+ @Composable
+ override fun Content() {
+ Column {
+ CheckBox(checked = true, text = "Checkbox 1")
+
+ CheckBox(
+ checked = false,
+ text = "Checkbox 2",
+ textStyle = TextStyle(
+ fontSize = 16.sp,
+ fontWeight = FontWeight.Bold,
+ fontStyle = FontStyle.Italic
+ )
+ )
+ }
+ }
+}
+
+class CheckBoxAppWidgetReceiver : GlanceAppWidgetReceiver() {
+ override val glanceAppWidget: GlanceAppWidget by lazy { CheckBoxAppWidget() }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
new file mode 100644
index 0000000..bcac141
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResizingAppWidget.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.demos
+
+import androidx.compose.runtime.Composable
+import androidx.glance.Modifier
+import androidx.glance.appwidget.GlanceAppWidget
+import androidx.glance.appwidget.GlanceAppWidgetReceiver
+import androidx.glance.appwidget.SizeMode
+import androidx.glance.layout.Column
+import androidx.glance.layout.Row
+import androidx.glance.layout.Text
+import androidx.glance.layout.fillMaxHeight
+import androidx.glance.layout.fillMaxSize
+import androidx.glance.layout.fillMaxWidth
+import androidx.glance.layout.height
+import androidx.glance.layout.padding
+import androidx.glance.layout.width
+import androidx.glance.text.TextAlign
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
+import androidx.glance.unit.dp
+
+class ResizingAppWidget : GlanceAppWidget() {
+
+ override val sizeMode: SizeMode = SizeMode.Single
+
+ @Composable
+ override fun Content() {
+ Column(modifier = Modifier.fillMaxSize().padding(16.dp)) {
+ Row(modifier = Modifier.fillMaxWidth()) {
+ Text("first")
+ Text(
+ "second",
+ style = TextStyle(
+ textDecoration = TextDecoration.LineThrough,
+ textAlign = TextAlign.Center,
+ ),
+ modifier = Modifier.defaultWeight().height(50.dp)
+ )
+ Text("third")
+ }
+ Text("middle", modifier = Modifier.fillMaxHeight().width(50.dp))
+ Row(modifier = Modifier.fillMaxWidth()) {
+ Text("", modifier = Modifier.defaultWeight())
+ Text("bottom center")
+ Text("", modifier = Modifier.defaultWeight())
+ }
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text(
+ "left",
+ style = TextStyle(textAlign = TextAlign.Left),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "right",
+ style = TextStyle(textAlign = TextAlign.Right),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "start",
+ style = TextStyle(textAlign = TextAlign.Start),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "end",
+ style = TextStyle(textAlign = TextAlign.End),
+ modifier = Modifier.fillMaxWidth()
+ )
+ }
+ }
+ }
+}
+
+class ResizingAppWidgetReceiver : GlanceAppWidgetReceiver() {
+ override val glanceAppWidget: GlanceAppWidget by lazy { ResizingAppWidget() }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
index a868eb4..1a9764f 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/ResponsiveAppWidget.kt
@@ -23,12 +23,12 @@
import androidx.glance.appwidget.GlanceAppWidgetReceiver
import androidx.glance.appwidget.SizeMode
import androidx.glance.layout.Column
-import androidx.glance.layout.FontWeight
import androidx.glance.layout.Row
import androidx.glance.layout.Text
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
import androidx.glance.layout.padding
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.glance.unit.DpSize
import androidx.glance.unit.dp
import androidx.glance.unit.sp
@@ -55,14 +55,14 @@
Text(
"Responsive",
style = TextStyle(
- size = 15.sp, fontWeight = FontWeight.Bold,
+ fontSize = 15.sp, fontWeight = FontWeight.Bold,
textDecoration = TextDecoration.Underline
)
)
Text(
" layout",
style = TextStyle(
- size = 15.sp, fontWeight = FontWeight.Medium,
+ fontSize = 15.sp, fontWeight = FontWeight.Medium,
textDecoration = TextDecoration.Underline
)
)
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/check_box_preview_image.png b/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/check_box_preview_image.png
new file mode 100644
index 0000000..33e41d4
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/check_box_preview_image.png
Binary files differ
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/resizing_preview_image.png b/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/resizing_preview_image.png
new file mode 100644
index 0000000..9865856
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/drawable/resizing_preview_image.png
Binary files differ
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
index 0b50dda..ea405f9 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/values/strings.xml
@@ -19,4 +19,6 @@
<!-- Name of the app widget with a responsive layout. -->
<string name="responsive_widget_name">Responsive Widget</string>
<string name="responsive_widget_title"><u>Responsive</u></string>
-</resources>
\ No newline at end of file
+ <string name="resizing_widget_name">Resizing Widget</string>
+ <string name="check_box_widget_name">CheckBox Widget</string>
+</resources>
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/check_box_app_widget_info.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/check_box_app_widget_info.xml
new file mode 100644
index 0000000..35335ff
--- /dev/null
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/check_box_app_widget_info.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="100dp"
+ android:minHeight="100dp"
+ android:minResizeWidth="40dp"
+ android:minResizeHeight="40dp"
+ android:initialLayout="@layout/empty_layout"
+ android:previewImage="@drawable/check_box_preview_image"
+ android:resizeMode="horizontal|vertical"
+ android:widgetCategory="home_screen">
+</appwidget-provider>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/resizing_app_widget_info.xml
similarity index 63%
copy from glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
copy to glance/glance-appwidget/integration-tests/demos/src/main/res/xml/resizing_app_widget_info.xml
index 8e05759..f353f04 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/res/xml/resizing_app_widget_info.xml
@@ -14,8 +14,11 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
\ No newline at end of file
+<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
+ android:minWidth="100dp"
+ android:minHeight="100dp"
+ android:initialLayout="@layout/empty_layout"
+ android:previewImage="@drawable/resizing_preview_image"
+ android:resizeMode="horizontal|vertical"
+ android:widgetCategory="home_screen">
+</appwidget-provider>
diff --git a/glance/glance-appwidget/src/androidAndroidTest/AndroidManifest.xml b/glance/glance-appwidget/src/androidAndroidTest/AndroidManifest.xml
index 41d3b77..0c32dbf 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/AndroidManifest.xml
+++ b/glance/glance-appwidget/src/androidAndroidTest/AndroidManifest.xml
@@ -17,7 +17,8 @@
package="androidx.glance.appwidget">
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
- <application>
+ <application
+ android:supportsRtl="true">
<uses-library android:name="android.test.runner" />
<activity
android:name="androidx.glance.appwidget.AppWidgetHostTestActivity"
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/Utils.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
similarity index 97%
rename from glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/Utils.kt
rename to glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
index fe0b8dd..6fee7a2 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/Utils.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AndroidTestUtils.kt
@@ -30,7 +30,7 @@
inline fun <reified T : View> View.findChild(noinline pred: (T) -> Boolean) =
findChild(pred, T::class.java)
-inline fun <reified T : View> View.findViewByType() =
+inline fun <reified T : View> View.findChildByType() =
findChild({ true }, T::class.java)
fun <T : View> View.findChild(predicate: (T) -> Boolean, klass: Class<T>): T? {
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
index 07a8aea..a7c8848 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
@@ -45,6 +45,11 @@
private var mLandscapeSize: DpSize = DpSize(300.dp, 200.dp)
) : TestRule {
+ val portraitSize: DpSize
+ get() = mPortraitSize
+ val landscapeSize: DpSize
+ get() = mLandscapeSize
+
private val mUiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
private val mActivityRule: ActivityScenarioRule<AppWidgetHostTestActivity> =
@@ -168,7 +173,7 @@
) {
val latch = CountDownLatch(1)
val onDrawListener = ViewTreeObserver.OnDrawListener {
- if (mHostView.childCount > 0) latch.countDown()
+ if (mHostView.childCount > 0 && test()) latch.countDown()
}
mActivityRule.scenario.onActivity {
mHostView.viewTreeObserver.addOnDrawListener(onDrawListener)
@@ -176,11 +181,20 @@
run()
- val countedDown = latch.await(5, TimeUnit.SECONDS)
- mActivityRule.scenario.onActivity {
- mHostView.viewTreeObserver.removeOnDrawListener(onDrawListener)
+ try {
+ if (test()) return
+ val interval = 200L
+ for (timeout in 0..5000L step interval) {
+ val countedDown = latch.await(interval, TimeUnit.MILLISECONDS)
+ if (countedDown || test()) return
+ }
+ fail(condition)
+ } finally {
+ latch.countDown() // make sure it's released in all conditions
+ mActivityRule.scenario.onActivity {
+ mHostView.viewTreeObserver.removeOnDrawListener(onDrawListener)
+ }
}
- if (!countedDown && !test()) fail(condition)
}
private fun runAndWaitForChildren(action: () -> Unit) {
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
index 0e61404..76e9f04 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
@@ -26,17 +26,21 @@
import android.content.res.Configuration
import android.graphics.Color
import android.os.Bundle
+import android.os.LocaleList
import android.util.Log
import android.view.Gravity
+import android.view.View
import android.view.WindowManager
import android.widget.FrameLayout
import android.widget.RemoteViews
import androidx.annotation.RequiresApi
+import androidx.core.text.layoutDirection
import org.junit.Assert.fail
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import androidx.glance.appwidget.test.R
import androidx.glance.unit.DpSize
+import java.util.Locale
@RequiresApi(26)
class AppWidgetHostTestActivity : Activity() {
@@ -81,7 +85,13 @@
}
val info = appWidgetManager.getAppWidgetInfo(appWidgetId)
- val hostView = host.createView(this, appWidgetId, info) as TestAppWidgetHostView
+ val locale = Locale.getDefault()
+ val config = resources.configuration
+ config.setLocales(LocaleList(locale))
+ config.setLayoutDirection(locale)
+ val context = this.createConfigurationContext(config)
+
+ val hostView = host.createView(context, appWidgetId, info) as TestAppWidgetHostView
hostView.setPadding(0, 0, 0, 0)
val contentFrame = findViewById<FrameLayout>(R.id.content)
contentFrame.addView(hostView)
@@ -121,6 +131,7 @@
init {
// Prevent asynchronous inflation of the App Widget
setExecutor(null)
+ layoutDirection = View.LAYOUT_DIRECTION_LOCALE
}
private var mLatch: CountDownLatch? = null
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt
new file mode 100644
index 0000000..96a90a1
--- /dev/null
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CheckBoxTest.kt
@@ -0,0 +1,150 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget
+
+import android.content.Context
+import android.view.ViewGroup
+import android.widget.ImageView
+import android.widget.TextView
+import androidx.compose.runtime.Composable
+import androidx.glance.Modifier
+import androidx.glance.appwidget.layout.CheckBox
+import androidx.glance.layout.Box
+import androidx.glance.layout.padding
+import androidx.glance.unit.Dp
+import androidx.glance.unit.dp
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.MediumTest
+import androidx.test.filters.SdkSuppress
+import com.google.common.truth.Truth.assertThat
+import org.junit.Rule
+import org.junit.Test
+import kotlin.test.assertIs
+import kotlin.test.assertNotNull
+
+@SdkSuppress(minSdkVersion = 29)
+@MediumTest
+class CheckBoxTest {
+
+ @get:Rule
+ val mHostRule = AppWidgetHostRule()
+
+ private val context = ApplicationProvider.getApplicationContext<Context>()
+
+ private val checkedCheckBox: @Composable () -> Unit = {
+ Box {
+ CheckBox(checked = true, text = "Hello world")
+ }
+ }
+
+ private val uncheckedCheckBox: @Composable () -> Unit = {
+ Box {
+ CheckBox(checked = false, text = "Hola mundo")
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = 31)
+ @Test
+ fun check_box_checked_31() {
+ TestGlanceAppWidget.uiDefinition = checkedCheckBox
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = hostView.findChildByType<android.widget.CheckBox>()
+ assertNotNull(child)
+ assertThat(child.text.toString()).isEqualTo("Hello world")
+ assertThat(child.isChecked).isTrue()
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 30)
+ @Test
+ fun check_box_checked_29_30() {
+ TestGlanceAppWidget.uiDefinition = checkedCheckBox
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertIs<ViewGroup>(hostView.getChildAt(0))
+ val textView = child.findViewById<TextView>(R.id.checkBoxText)
+ assertThat(textView.text.toString()).isEqualTo("Hello world")
+
+ val image = child.findViewById<ImageView>(R.id.checkBoxIcon)
+ assertThat(image.isEnabled).isTrue()
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = 31)
+ @Test
+ fun check_box_unchecked_31() {
+ TestGlanceAppWidget.uiDefinition = uncheckedCheckBox
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = hostView.findChildByType<android.widget.CheckBox>()
+ assertNotNull(child)
+ assertThat(child.text.toString()).isEqualTo("Hola mundo")
+ assertThat(child.isChecked).isFalse()
+ }
+ }
+
+ @SdkSuppress(minSdkVersion = 29, maxSdkVersion = 30)
+ @Test
+ fun check_box_unchecked_29_30() {
+ TestGlanceAppWidget.uiDefinition = uncheckedCheckBox
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertIs<ViewGroup>(hostView.getChildAt(0))
+ val textView = child.findViewById<TextView>(R.id.checkBoxText)
+ assertThat(textView.text.toString()).isEqualTo("Hola mundo")
+
+ val image = child.findViewById<ImageView>(R.id.checkBoxIcon)
+ assertThat(image.isEnabled).isFalse()
+ }
+ }
+
+ @Test
+ fun check_box_modifiers() {
+ TestGlanceAppWidget.uiDefinition = {
+ Box {
+ CheckBox(checked = true, modifier = Modifier.padding(5.dp, 6.dp, 7.dp, 8.dp))
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+
+ val checkboxRoot = (hostView.getChildAt(0) as ViewGroup).getChildAt(0)
+ assertThat(checkboxRoot.paddingStart).isEqualTo(5.dp.toPx())
+ assertThat(checkboxRoot.paddingTop).isEqualTo(6.dp.toPx())
+ assertThat(checkboxRoot.paddingEnd).isEqualTo(7.dp.toPx())
+ assertThat(checkboxRoot.paddingBottom).isEqualTo(8.dp.toPx())
+ }
+ }
+
+ private fun Dp.toPx() = toPixels(context.resources.displayMetrics)
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
similarity index 79%
rename from glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
rename to glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
index 3085e20..5dd11fc 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/CoroutineBroadcastReceiverTest.kt
@@ -20,27 +20,21 @@
import android.content.Context
import android.content.Intent
import android.content.IntentFilter
-import android.os.Looper.getMainLooper
-import android.util.Log
-import androidx.glance.GlanceInternalApi
import androidx.test.core.app.ApplicationProvider
-import androidx.test.filters.FlakyTest
import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.launch
import org.junit.Test
-import org.junit.runner.RunWith
-import org.robolectric.RobolectricTestRunner
-import org.robolectric.Shadows.shadowOf
+import java.io.FileInputStream
+import java.nio.charset.StandardCharsets
import java.util.concurrent.CountDownLatch
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicReference
-@OptIn(GlanceInternalApi::class)
-@RunWith(RobolectricTestRunner::class)
class CoroutineBroadcastReceiverTest {
private val context = ApplicationProvider.getApplicationContext<Context>()
@@ -57,12 +51,10 @@
try {
awaitCancellation()
} catch (ex: CancellationException) {
- Log.i("CoroutineBRTest", "Scope cancelled")
scopeCancelled.countDown()
throw ex
}
}
- Log.i("CoroutineBRTest", "Broadcast executed")
broadcastExecuted.countDown()
}
}
@@ -70,7 +62,6 @@
@MediumTest
@Test
- @FlakyTest
fun onReceive() {
val broadcastReceiver = TestBroadcast()
context.registerReceiver(
@@ -79,8 +70,12 @@
)
val value = "value"
- context.sendBroadcast(Intent(BROADCAST_ACTION).putExtra(EXTRA_STRING, value))
- shadowOf(getMainLooper()).idle()
+ context.sendBroadcast(
+ Intent(BROADCAST_ACTION)
+ .putExtra(EXTRA_STRING, value)
+ .addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
+ )
+ waitForBroadcastIdle()
assertWithMessage("Broadcast receiver did not execute")
.that(broadcastReceiver.broadcastExecuted.await(5, TimeUnit.SECONDS))
@@ -91,6 +86,15 @@
assertThat(broadcastReceiver.extraValue.get()).isEqualTo(value)
}
+ private fun waitForBroadcastIdle() {
+ val uiAutomation = InstrumentationRegistry.getInstrumentation().uiAutomation
+ val outputFd = uiAutomation.executeShellCommand("am wait-for-broadcast-idle")
+ val output = FileInputStream(outputFd.fileDescriptor).use { it.readBytes() }
+
+ assertThat(String(output, StandardCharsets.US_ASCII))
+ .contains("All broadcast queues are idle!")
+ }
+
private companion object {
const val BROADCAST_ACTION = "androidx.glance.appwidget.utils.TEST_ACTION"
const val EXTRA_STRING = "extra_string"
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt
index 4fa5153..6a02d98 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverScreenshotTest.kt
@@ -16,11 +16,18 @@
package androidx.glance.appwidget
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
+import androidx.compose.runtime.Composable
+import androidx.glance.Modifier
+import androidx.glance.appwidget.layout.CheckBox
+import androidx.glance.layout.Column
+import androidx.glance.layout.Row
import androidx.glance.layout.Text
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
+import androidx.glance.layout.fillMaxWidth
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextAlign
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import org.junit.Rule
@@ -37,6 +44,7 @@
@Rule
@JvmField
val mRule: TestRule = RuleChain.outerRule(mHostRule).around(mScreenshotRule)
+ .around(WithRtlRule)
@Test
fun createSimpleAppWidget() {
@@ -55,4 +63,122 @@
mScreenshotRule.checkScreenshot(mHostRule.mHostView, "simpleAppWidget")
}
-}
\ No newline at end of file
+
+ @Test
+ fun createCheckBoxAppWidget() {
+ TestGlanceAppWidget.uiDefinition = {
+ Column {
+ CheckBox(
+ checked = true,
+ text = "Hello Checked Checkbox",
+ textStyle = TextStyle(
+ fontWeight = FontWeight.Bold,
+ fontStyle = FontStyle.Normal,
+ )
+ )
+
+ CheckBox(
+ checked = false,
+ text = "Hello Unchecked Checkbox",
+ textStyle = TextStyle(
+ textDecoration = TextDecoration.Underline,
+ fontWeight = FontWeight.Medium,
+ fontStyle = FontStyle.Italic,
+ )
+ )
+ }
+ }
+
+ mHostRule.startHost()
+
+ mScreenshotRule.checkScreenshot(mHostRule.mHostView, "checkBoxWidget")
+ }
+
+ @Test
+ fun createRowWidget() {
+ TestGlanceAppWidget.uiDefinition = { RowTest() }
+
+ mHostRule.startHost()
+
+ mScreenshotRule.checkScreenshot(mHostRule.mHostView, "rowWidget")
+ }
+
+ @WithRtl
+ @Test
+ fun createRowWidget_rtl() {
+ TestGlanceAppWidget.uiDefinition = { RowTest() }
+
+ mHostRule.startHost()
+
+ mScreenshotRule.checkScreenshot(mHostRule.mHostView, "rowWidget_rtl")
+ }
+
+ @Test
+ fun checkTextAlignment() {
+ TestGlanceAppWidget.uiDefinition = { TextAlignmentTest() }
+
+ mHostRule.startHost()
+
+ mScreenshotRule.checkScreenshot(mHostRule.mHostView, "textAlignment")
+ }
+
+ @WithRtl
+ @Test
+ fun checkTextAlignment_rtl() {
+ TestGlanceAppWidget.uiDefinition = { TextAlignmentTest() }
+
+ mHostRule.startHost()
+
+ mScreenshotRule.checkScreenshot(mHostRule.mHostView, "textAlignment_rtl")
+ }
+}
+
+@Composable
+private fun TextAlignmentTest() {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text(
+ "Center",
+ style = TextStyle(textAlign = TextAlign.Center),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "Left",
+ style = TextStyle(textAlign = TextAlign.Left),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "Right",
+ style = TextStyle(textAlign = TextAlign.Right),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "Start",
+ style = TextStyle(textAlign = TextAlign.Start),
+ modifier = Modifier.fillMaxWidth()
+ )
+ Text(
+ "End",
+ style = TextStyle(textAlign = TextAlign.End),
+ modifier = Modifier.fillMaxWidth()
+ )
+ }
+}
+
+@Composable
+private fun RowTest() {
+ Row(modifier = Modifier.fillMaxWidth()) {
+ Text(
+ "Start",
+ style = TextStyle(textAlign = TextAlign.Start),
+ modifier = Modifier.defaultWeight()
+ )
+ Text(
+ "Center",
+ style = TextStyle(textAlign = TextAlign.Center),
+ modifier = Modifier.defaultWeight()
+ )
+ Text("End",
+ style = TextStyle(textAlign = TextAlign.End),
+ modifier = Modifier.defaultWeight())
+ }
+}
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
index 57525cc..9cadd02 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiverTest.kt
@@ -22,21 +22,37 @@
import android.text.style.StyleSpan
import android.text.style.TextAppearanceSpan
import android.text.style.UnderlineSpan
+import android.view.View
+import android.widget.LinearLayout
+import android.widget.RelativeLayout
import android.widget.TextView
+import androidx.glance.LocalContext
import androidx.glance.LocalSize
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
+import androidx.glance.Modifier
+import androidx.glance.layout.Box
+import androidx.glance.layout.Column
+import androidx.glance.layout.Row
import androidx.glance.layout.Text
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
+import androidx.glance.layout.fillMaxHeight
+import androidx.glance.layout.fillMaxWidth
+import androidx.glance.layout.height
+import androidx.glance.layout.width
+import androidx.glance.layout.wrapContentHeight
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
+import androidx.glance.unit.Dp
import androidx.glance.unit.DpSize
import androidx.glance.unit.dp
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
+import org.junit.Before
import org.junit.Rule
import org.junit.Test
import kotlin.test.assertIs
+import kotlin.test.assertNotNull
@SdkSuppress(minSdkVersion = 29)
@MediumTest
@@ -44,9 +60,19 @@
@get:Rule
val mHostRule = AppWidgetHostRule()
+ @Before
+ fun setUp() {
+ // Reset the size mode to the default
+ TestGlanceAppWidget.sizeMode = SizeMode.Single
+ }
+
@Test
fun createSimpleAppWidget() {
TestGlanceAppWidget.uiDefinition = {
+ val density = LocalContext.current.resources.displayMetrics.density
+ val size = LocalSize.current
+ assertThat(size.width.value).isWithin(1 / density).of(40f)
+ assertThat(size.height.value).isWithin(1 / density).of(40f)
Text(
"text content",
style = TextStyle(
@@ -143,10 +169,240 @@
}
}
+ @Test
+ fun createTextWithFillMaxDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Text("expanded text", modifier = Modifier.fillMaxWidth().fillMaxHeight())
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertIs<TextView>(hostView.getChildAt(0))
+ assertViewSize(child, mHostRule.portraitSize)
+ }
+ }
+
+ @Test
+ fun createTextViewWithExactDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Text("expanded text", modifier = Modifier.width(150.dp).height(100.dp))
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertIs<TextView>(hostView.getChildAt(0).getTargetView())
+ assertViewSize(child, DpSize(150.dp, 100.dp))
+ }
+ }
+
+ @Test
+ fun createTextViewWithMixedDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Text("expanded text", modifier = Modifier.fillMaxWidth().height(110.dp))
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertIs<TextView>(hostView.getChildAt(0).getTargetView())
+ assertViewSize(child, DpSize(mHostRule.portraitSize.width, 110.dp))
+ }
+ }
+
+ @Test
+ fun createBoxWithExactDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Box(modifier = Modifier.width(150.dp).height(180.dp)) {
+ Text("Inside")
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertNotNull(
+ hostView.findChild<RelativeLayout> {
+ it.id == R.id.glanceView
+ }
+ )
+ assertViewSize(child, DpSize(150.dp, 180.dp))
+ }
+ }
+
+ @Test
+ fun createBoxWithMixedDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Box(modifier = Modifier.width(150.dp).wrapContentHeight()) {
+ Text("Inside")
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertNotNull(hostView.findChildByType<RelativeLayout>())
+ val text = assertNotNull(child.findChildByType<TextView>())
+ assertThat(child.height).isEqualTo(text.height)
+ assertViewDimension(child, child.width, 150.dp)
+ }
+ }
+
+ @Test
+ fun createColumnWithMixedDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Column(modifier = Modifier.width(150.dp).fillMaxHeight()) {
+ Text("Inside 1")
+ Text("Inside 2")
+ Text("Inside 3")
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertNotNull(
+ hostView.findChild<LinearLayout> {
+ it.orientation == LinearLayout.VERTICAL
+ }
+ )
+ assertViewSize(child, DpSize(150.dp, mHostRule.portraitSize.height))
+ }
+ }
+
+ @Test
+ fun createRowWithMixedDimensions() {
+ TestGlanceAppWidget.uiDefinition = {
+ Row(modifier = Modifier.fillMaxWidth().height(200.dp)) {
+ Text("Inside 1")
+ Text("Inside 2")
+ Text("Inside 3")
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val child = assertNotNull(
+ hostView.findChild<LinearLayout> {
+ it.orientation == LinearLayout.HORIZONTAL
+ }
+ )
+ assertViewSize(child, DpSize(mHostRule.portraitSize.width, 200.dp))
+ }
+ }
+
+ @Test
+ fun createRowWithTwoTexts() {
+ TestGlanceAppWidget.uiDefinition = {
+ Row(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
+ Text("Inside 1", modifier = Modifier.defaultWeight().height(100.dp))
+ Text("Inside 2", modifier = Modifier.defaultWeight().fillMaxHeight())
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val row = assertIs<LinearLayout>(hostView.getChildAt(0))
+ assertThat(row.orientation).isEqualTo(LinearLayout.HORIZONTAL)
+ assertThat(row.childCount).isEqualTo(2)
+ val child1 = assertIs<TextView>(row.getChildAt(0).getTargetView())
+ val child2 = assertIs<TextView>(row.getChildAt(1))
+ assertViewSize(child1, DpSize(mHostRule.portraitSize.width / 2, 100.dp))
+ assertViewSize(
+ child2,
+ DpSize(mHostRule.portraitSize.width / 2, mHostRule.portraitSize.height),
+ )
+ }
+ }
+
+ @Test
+ fun createColumnWithTwoTexts() {
+ TestGlanceAppWidget.uiDefinition = {
+ Column(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
+ Text("Inside 1", modifier = Modifier.fillMaxWidth().defaultWeight())
+ Text("Inside 2", modifier = Modifier.width(100.dp).defaultWeight())
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val row = assertIs<LinearLayout>(hostView.getChildAt(0))
+ assertThat(row.orientation).isEqualTo(LinearLayout.VERTICAL)
+ assertThat(row.childCount).isEqualTo(2)
+ val child1 = assertIs<TextView>(row.getChildAt(0))
+ val child2 = assertIs<TextView>(row.getChildAt(1).getTargetView())
+ assertViewSize(
+ child1,
+ DpSize(mHostRule.portraitSize.width, mHostRule.portraitSize.height / 2),
+ )
+ assertViewSize(child2, DpSize(100.dp, mHostRule.portraitSize.height / 2))
+ }
+ }
+
+ @Test
+ fun createColumnWithTwoTexts2() {
+ TestGlanceAppWidget.uiDefinition = {
+ Column(modifier = Modifier.fillMaxWidth().fillMaxHeight()) {
+ Text("Inside 1", modifier = Modifier.fillMaxWidth().defaultWeight())
+ Text("Inside 2", modifier = Modifier.width(100.dp).fillMaxHeight())
+ }
+ }
+
+ mHostRule.startHost()
+
+ mHostRule.onHostView { hostView ->
+ assertThat(hostView.childCount).isEqualTo(1)
+ val row = assertIs<LinearLayout>(hostView.getChildAt(0))
+ assertThat(row.orientation).isEqualTo(LinearLayout.VERTICAL)
+ assertThat(row.childCount).isEqualTo(2)
+ val child1 = assertIs<TextView>(row.getChildAt(0))
+ val child2 = assertIs<TextView>(row.getChildAt(1).getTargetView())
+ assertViewSize(
+ child1,
+ DpSize(mHostRule.portraitSize.width, 0.dp),
+ )
+ assertViewSize(child2, DpSize(100.dp, mHostRule.portraitSize.height))
+ }
+ }
+
// Check there is a single span of the given type and that it passes the [check].
private inline fun <reified T> SpannedString.checkHasSingleTypedSpan(check: (T) -> Unit) {
val spans = getSpans(0, length, T::class.java)
assertThat(spans).hasLength(1)
check(spans[0])
}
+
+ private fun assertViewSize(view: View, expectedSize: DpSize) {
+ val density = view.context.resources.displayMetrics.density
+ assertThat(view.width / density).isWithin(1.1f / density).of(expectedSize.width.value)
+ assertThat(view.height / density).isWithin(1.1f / density).of(expectedSize.height.value)
+ }
+
+ private fun assertViewDimension(view: View, sizePx: Int, expectedSize: Dp) {
+ val density = view.context.resources.displayMetrics.density
+ assertThat(sizePx / density).isWithin(1.1f / density).of(expectedSize.value)
+ }
+}
+
+// Extract the target view if it is a complex view in Android R-.
+private fun View.getTargetView(): View {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ return this
+ }
+ val layout = assertIs<RelativeLayout>(this)
+ assertThat(layout.childCount).isEqualTo(2)
+ return layout.getChildAt(1)
}
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
index 4b79e15..d7f7b37 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/LazyColumnTest.kt
@@ -17,15 +17,19 @@
package androidx.glance.appwidget
import android.os.Build
-import android.view.View
+import android.view.Gravity
import android.view.ViewGroup
import android.widget.ListView
import android.widget.RelativeLayout
import android.widget.TextView
+import androidx.glance.Modifier
import androidx.glance.appwidget.layout.LazyColumn
import androidx.glance.appwidget.layout.ReservedItemIdRangeEnd
+import androidx.glance.layout.Alignment
import androidx.glance.layout.Text
-import androidx.test.filters.FlakyTest
+import androidx.glance.layout.padding
+import androidx.glance.unit.Dp
+import androidx.glance.unit.dp
import androidx.test.filters.MediumTest
import androidx.test.filters.SdkSuppress
import com.google.common.truth.Truth.assertThat
@@ -39,7 +43,26 @@
@get:Rule
val mHostRule = AppWidgetHostRule()
- @FlakyTest
+ @Test
+ fun modifier_modifiesColumn() {
+ TestGlanceAppWidget.uiDefinition = {
+ LazyColumn(modifier = Modifier.padding(5.dp, 6.dp, 7.dp, 8.dp)) {
+ item { Text("1") }
+ item { Text("2") }
+ }
+ }
+
+ mHostRule.startHost()
+
+ waitForListViewChildren { list ->
+ fun Dp.toPx() = toPixels(list.context.resources.displayMetrics)
+ assertThat(list.paddingStart).isEqualTo(5.dp.toPx())
+ assertThat(list.paddingTop).isEqualTo(6.dp.toPx())
+ assertThat(list.paddingEnd).isEqualTo(7.dp.toPx())
+ assertThat(list.paddingBottom).isEqualTo(8.dp.toPx())
+ }
+ }
+
@Test
fun item_withoutItemIds_createsNonStableList() {
TestGlanceAppWidget.uiDefinition = {
@@ -47,11 +70,6 @@
item { Text("First row") }
item { Text("Second row") }
}
-
- LazyColumn {
- item { Text("First row") }
- item { Text("Second row") }
- }
}
mHostRule.startHost()
@@ -65,7 +83,6 @@
}
}
- @FlakyTest
@Test
fun item_withItemIds_createsStableList() {
TestGlanceAppWidget.uiDefinition = {
@@ -86,7 +103,6 @@
}
}
- @FlakyTest
@Test
fun items_withoutItemIds_createsNonStableList() {
TestGlanceAppWidget.uiDefinition = {
@@ -107,7 +123,6 @@
}
}
- @FlakyTest
@Test
fun items_withItemIds_createsStableList() {
TestGlanceAppWidget.uiDefinition = {
@@ -143,10 +158,10 @@
mHostRule.startHost()
waitForListViewChildren { list ->
- val textView1 = list.getListChildAt<TextView>(0)
- val textView2 = list.getListChildAt<TextView>(1)
- val textView3 = list.getListChildAt<TextView>(2)
- val textView4 = list.getListChildAt<TextView>(3)
+ val textView1 = assertIs<TextView>(list.getListItemAt(0).getChildAt(0))
+ val textView2 = assertIs<TextView>(list.getListItemAt(1).getChildAt(0))
+ val textView3 = assertIs<TextView>(list.getListItemAt(2).getChildAt(0))
+ val textView4 = assertIs<TextView>(list.getListItemAt(3).getChildAt(0))
assertThat(textView1.text.toString()).isEqualTo("Row 0")
assertThat(textView2.text.toString()).isEqualTo("Row 1")
assertThat(textView3.text.toString()).isEqualTo("Row 2")
@@ -167,10 +182,10 @@
mHostRule.startHost()
waitForListViewChildren { list ->
- val textView1 = list.getListChildAt<TextView>(0)
- val textView2 = list.getListChildAt<TextView>(1)
- val textView3 = list.getListChildAt<TextView>(2)
- val textView4 = list.getListChildAt<TextView>(3)
+ val textView1 = assertIs<TextView>(list.getListItemAt(0).getChildAt(0))
+ val textView2 = assertIs<TextView>(list.getListItemAt(1).getChildAt(0))
+ val textView3 = assertIs<TextView>(list.getListItemAt(2).getChildAt(0))
+ val textView4 = assertIs<TextView>(list.getListItemAt(3).getChildAt(0))
assertThat(textView1.text.toString()).isEqualTo("Row 0")
assertThat(textView2.text.toString()).isEqualTo("Row 1")
assertThat(textView3.text.toString()).isEqualTo("Row 2")
@@ -179,18 +194,56 @@
}
@Test
- fun itemContent_emptyItem() {
+ fun itemContent_defaultAlignment_setsGravityStart() {
TestGlanceAppWidget.uiDefinition = {
LazyColumn {
- item { }
+ item {
+ Text("Row item 0")
+ }
}
}
mHostRule.startHost()
waitForListViewChildren { list ->
- val row = list.getListChildAt<RelativeLayout>(0)
- assertThat(row.childCount).isEqualTo(0)
+ val listItem = list.getListItemAt(0)
+ assertThat(listItem.gravity).isEqualTo(Gravity.START or Gravity.CENTER_VERTICAL)
+ }
+ }
+
+ @Test
+ fun itemContent_centerAlignment_setsGravityCenter() {
+ TestGlanceAppWidget.uiDefinition = {
+ LazyColumn(horizontalAlignment = Alignment.Horizontal.CenterHorizontally) {
+ item {
+ Text("Row item 0")
+ }
+ }
+ }
+
+ mHostRule.startHost()
+
+ waitForListViewChildren { list ->
+ val listItem = list.getListItemAt(0)
+ assertThat(listItem.gravity).isEqualTo(Gravity.CENTER)
+ }
+ }
+
+ @Test
+ fun itemContent_endAlignment_setsGravityEnd() {
+ TestGlanceAppWidget.uiDefinition = {
+ LazyColumn(horizontalAlignment = Alignment.Horizontal.End) {
+ item {
+ Text("Row item 0")
+ }
+ }
+ }
+
+ mHostRule.startHost()
+
+ waitForListViewChildren { list ->
+ val listItem = list.getListItemAt(0)
+ assertThat(listItem.gravity).isEqualTo(Gravity.END + Gravity.CENTER_VERTICAL)
}
}
@@ -208,7 +261,7 @@
mHostRule.startHost()
waitForListViewChildren { list ->
- val row = list.getListChildAt<RelativeLayout>(0)
+ val row = list.getListItemAt(0)
val rowItem0 = assertIs<TextView>(row.getChildAt(0))
val rowItem1 = assertIs<TextView>(row.getChildAt(1))
assertThat(rowItem0.text.toString()).isEqualTo("Row item 0")
@@ -221,19 +274,19 @@
mHostRule.runAndObserveUntilDraw(condition = "ListView did not load in time") {
mHostRule.mHostView.let { host ->
- val list = host.findViewByType<ListView>()
+ val list = host.findChildByType<ListView>()
host.childCount > 0 &&
list?.let { it.childCount > 0 && it.adapter != null } ?: false
}
}
mHostRule.onHostView {
- action(mHostRule.mHostView.findViewByType<ListView>()!!)
+ action(mHostRule.mHostView.findChildByType<ListView>()!!)
}
}
- private inline fun <reified V : View> ListView.getListChildAt(position: Int): V {
- return assertIs<V>(
+ private fun ListView.getListItemAt(position: Int): RelativeLayout {
+ return assertIs<RelativeLayout>(
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
this.getChildAt(position)
} else {
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/WithRtl.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/WithRtl.kt
new file mode 100644
index 0000000..b15b830
--- /dev/null
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/WithRtl.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget
+
+import org.junit.rules.TestRule
+import org.junit.runner.Description
+import org.junit.runners.model.Statement
+import java.lang.reflect.AnnotatedElement
+import java.lang.reflect.Method
+import java.util.Locale
+
+/**
+ * Annotation for specifying a per-test or per-method override of the default locale. Multiple
+ * values may be passed to specify a locale list.
+ */
+@Retention(AnnotationRetention.RUNTIME)
+@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION)
+internal annotation class WithRtl(val value: Boolean = true)
+
+/** [TestRule] for using [WithRtl] on a test class or method. */
+internal object WithRtlRule : TestRule {
+ override fun apply(base: Statement, description: Description) =
+ object : Statement() {
+ override fun evaluate() {
+ val override =
+ description.testMethod.isRtl ?: description.testClass.isRtl ?: false
+ forceRtl = override
+ val savedLocale = Locale.getDefault()
+ val locale = if (override) Locale("he") else Locale.US
+ Locale.setDefault(locale)
+ try {
+ base.evaluate()
+ } finally {
+ Locale.setDefault(savedLocale)
+ forceRtl = null
+ }
+ }
+ }
+
+ private val AnnotatedElement.isRtl: Boolean?
+ get() = getAnnotation(WithRtl::class.java)?.value
+}
+
+private val Description.testMethod: Method
+ get() = testClass.getMethod(methodName)
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt
index 4646a40..f68a8a5 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/ApplyModifiers.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -21,22 +20,30 @@
import android.content.Context
import android.content.Intent
import android.content.res.Resources
-import android.util.DisplayMetrics
+import android.os.Build
import android.util.TypedValue
-import android.view.View
+import android.view.ViewGroup
import android.widget.RemoteViews
-import androidx.glance.GlanceInternalApi
+import androidx.annotation.DoNotInline
+import androidx.annotation.IdRes
+import androidx.annotation.RequiresApi
+import androidx.core.widget.setTextViewHeight
+import androidx.core.widget.setTextViewWidth
import androidx.glance.Modifier
import androidx.glance.action.Action
import androidx.glance.action.ActionModifier
import androidx.glance.action.LaunchActivityAction
+import androidx.glance.layout.Dimension
+import androidx.glance.layout.HeightModifier
import androidx.glance.layout.PaddingModifier
-import androidx.glance.unit.Dp
+import androidx.glance.layout.WidthModifier
+import androidx.glance.unit.dp
private fun applyAction(
rv: RemoteViews,
action: Action,
- context: Context
+ context: Context,
+ @IdRes viewId: Int
) {
when (action) {
is LaunchActivityAction -> {
@@ -48,7 +55,7 @@
intent,
PendingIntent.FLAG_MUTABLE
)
- rv.setOnClickPendingIntent(R.id.glanceView, pendingIntent)
+ rv.setOnClickPendingIntent(viewId, pendingIntent)
}
else -> throw IllegalArgumentException("Unrecognized action type.")
}
@@ -57,15 +64,15 @@
private fun applyPadding(
rv: RemoteViews,
modifier: PaddingModifier,
- resources: Resources
+ translationContext: TranslationContext,
+ @IdRes viewId: Int
) {
- val displayMetrics = resources.displayMetrics
- val isRtl = modifier.rtlAware &&
- resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
+ val displayMetrics = translationContext.context.resources.displayMetrics
+ val isRtl = modifier.rtlAware && translationContext.isRtl
val start = modifier.start.toPixels(displayMetrics)
val end = modifier.end.toPixels(displayMetrics)
rv.setViewPadding(
- R.id.glanceView,
+ viewId,
if (isRtl) end else start,
modifier.top.toPixels(displayMetrics),
if (isRtl) start else end,
@@ -73,14 +80,125 @@
)
}
-internal fun applyModifiers(context: Context, rv: RemoteViews, modifiers: Modifier) {
+internal fun applyModifiers(
+ translationContext: TranslationContext,
+ rv: RemoteViews,
+ modifiers: Modifier,
+ layoutDef: LayoutIds
+) {
+ val context = translationContext.context
modifiers.foldOut(Unit) { modifier, _ ->
when (modifier) {
- is ActionModifier -> applyAction(rv, modifier.action, context)
- is PaddingModifier -> applyPadding(rv, modifier, context.resources)
+ is ActionModifier -> applyAction(rv, modifier.action, context, layoutDef.mainViewId)
+ is PaddingModifier -> applyPadding(
+ rv,
+ modifier,
+ translationContext,
+ layoutDef.mainViewId
+ )
+ is WidthModifier -> applyWidthModifier(
+ rv,
+ modifier,
+ context.resources,
+ layoutDef
+ )
+ is HeightModifier -> applyHeightModifier(
+ rv,
+ modifier,
+ context.resources,
+ layoutDef
+ )
}
}
}
-internal fun Dp.toPixels(displayMetrics: DisplayMetrics) =
- TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, displayMetrics).toInt()
+private fun applyWidthModifier(
+ rv: RemoteViews,
+ modifier: WidthModifier,
+ resources: Resources,
+ layoutDef: LayoutIds?,
+) {
+ checkNotNull(layoutDef) { "No layout spec, cannot change size" }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ if (modifier.width is Dimension.Expand) {
+ ApplyModifiersApi31Impl.setViewWidth(rv, layoutDef.mainViewId, Dimension.Dp(0.dp))
+ } else {
+ ApplyModifiersApi31Impl.setViewWidth(rv, layoutDef.mainViewId, modifier.width)
+ }
+ return
+ }
+ val width = modifier.width
+ if (width !is Dimension.Dp) return
+ checkNotNull(layoutDef.sizeViewId) { "The layout specified does not allow specifying the size" }
+ rv.setTextViewWidth(layoutDef.sizeViewId, width.dp.toPixels(resources.displayMetrics))
+}
+
+private fun applyHeightModifier(
+ rv: RemoteViews,
+ modifier: HeightModifier,
+ resources: Resources,
+ layoutDef: LayoutIds?,
+) {
+ checkNotNull(layoutDef) { "No layout spec, cannot change size" }
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ if (modifier.height is Dimension.Expand) {
+ ApplyModifiersApi31Impl.setViewHeight(rv, layoutDef.mainViewId, Dimension.Dp(0.dp))
+ } else {
+ ApplyModifiersApi31Impl.setViewHeight(rv, layoutDef.mainViewId, modifier.height)
+ }
+ return
+ }
+ val height = modifier.height
+ if (height !is Dimension.Dp) return
+ checkNotNull(layoutDef.sizeViewId) { "The layout specified does not allow specifying the size" }
+ rv.setTextViewHeight(layoutDef.sizeViewId, height.dp.toPixels(resources.displayMetrics))
+}
+
+@RequiresApi(Build.VERSION_CODES.S)
+private object ApplyModifiersApi31Impl {
+ @DoNotInline
+ fun setViewWidth(rv: RemoteViews, viewId: Int, width: Dimension) {
+ when (width) {
+ is Dimension.Wrap -> {
+ rv.setViewLayoutWidth(
+ viewId,
+ ViewGroup.LayoutParams.WRAP_CONTENT.toFloat(),
+ TypedValue.COMPLEX_UNIT_PX
+ )
+ }
+ is Dimension.Expand -> {
+ rv.setViewLayoutWidth(
+ viewId,
+ ViewGroup.LayoutParams.MATCH_PARENT.toFloat(),
+ TypedValue.COMPLEX_UNIT_PX
+ )
+ }
+ is Dimension.Dp -> {
+ rv.setViewLayoutWidth(viewId, width.dp.value, TypedValue.COMPLEX_UNIT_DIP)
+ }
+ }
+ }
+
+ @DoNotInline
+ fun setViewHeight(rv: RemoteViews, viewId: Int, height: Dimension) {
+ when (height) {
+ is Dimension.Wrap -> {
+ rv.setViewLayoutHeight(
+ viewId,
+ ViewGroup.LayoutParams.WRAP_CONTENT.toFloat(),
+ TypedValue.COMPLEX_UNIT_PX
+ )
+ }
+ is Dimension.Expand -> {
+ rv.setViewLayoutHeight(
+ viewId,
+ ViewGroup.LayoutParams.MATCH_PARENT.toFloat(),
+ TypedValue.COMPLEX_UNIT_PX
+ )
+ }
+ is Dimension.Dp -> {
+ rv.setViewLayoutHeight(viewId, height.dp.value, TypedValue.COMPLEX_UNIT_DIP)
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
index 5265979..c12cc96 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
@@ -21,6 +21,7 @@
import android.content.Context
import android.os.Build
import android.os.Bundle
+import android.util.DisplayMetrics
import android.util.SizeF
import android.widget.RemoteViews
import androidx.annotation.DoNotInline
@@ -32,7 +33,6 @@
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.runtime.Recomposer
import androidx.glance.Applier
-import androidx.glance.GlanceInternalApi
import androidx.glance.LocalContext
import androidx.glance.LocalSize
import androidx.glance.unit.DpSize
@@ -53,7 +53,6 @@
* the composition and translate [Content] into a [RemoteViews] which is then sent to the
* [AppWidgetManager].
*/
-@OptIn(GlanceInternalApi::class)
public abstract class GlanceAppWidget {
/**
* Definition of the UI.
@@ -112,7 +111,11 @@
// Retrieves the minimum size of an App Widget, as configured by the App Widget provider.
@VisibleForTesting
- internal fun appWidgetMinSize(appWidgetManager: AppWidgetManager, appWidgetId: Int): DpSize {
+ internal fun appWidgetMinSize(
+ displayMetrics: DisplayMetrics,
+ appWidgetManager: AppWidgetManager,
+ appWidgetId: Int
+ ): DpSize {
val info = appWidgetManager.getAppWidgetInfo(appWidgetId)
val minWidth = min(
info.minWidth,
@@ -130,7 +133,7 @@
Int.MAX_VALUE
}
)
- return DpSize(minWidth.dp, minHeight.dp)
+ return DpSize(minWidth.pixelsToDp(displayMetrics), minHeight.pixelsToDp(displayMetrics))
}
// Trigger the composition of the View to create the RemoteViews.
@@ -147,7 +150,11 @@
context,
appWidgetId,
options,
- appWidgetMinSize(appWidgetManager, appWidgetId),
+ appWidgetMinSize(
+ context.resources.displayMetrics,
+ appWidgetManager,
+ appWidgetId
+ ),
)
}
is SizeMode.Exact -> {
@@ -157,7 +164,13 @@
context,
appWidgetId,
options,
- options.extractAllSizes { appWidgetMinSize(appWidgetManager, appWidgetId) }
+ options.extractAllSizes {
+ appWidgetMinSize(
+ context.resources.displayMetrics,
+ appWidgetManager,
+ appWidgetId
+ )
+ }
)
} else {
composeExactMode(context, appWidgetManager, appWidgetId, options)
@@ -193,7 +206,7 @@
context,
appWidgetId,
options,
- appWidgetMinSize(appWidgetManager, appWidgetId),
+ appWidgetMinSize(context.resources.displayMetrics, appWidgetManager, appWidgetId),
)
}
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
index 7a8f821..ed35a5f 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetReceiver.kt
@@ -18,7 +18,9 @@
import android.appwidget.AppWidgetManager
import android.appwidget.AppWidgetProvider
+import android.content.ComponentName
import android.content.Context
+import android.content.Intent
import android.os.Build
import android.os.Bundle
import android.util.Log
@@ -80,4 +82,19 @@
glanceAppWidget.resize(context, appWidgetManager, appWidgetId, newOptions)
}
}
+
+ override fun onReceive(context: Context, intent: Intent) {
+ if (intent.action == Intent.ACTION_LOCALE_CHANGED) {
+ val appWidgetManager = AppWidgetManager.getInstance(context)
+ val componentName =
+ ComponentName(context.packageName, checkNotNull(javaClass.canonicalName))
+ onUpdate(
+ context,
+ appWidgetManager,
+ appWidgetManager.getAppWidgetIds(componentName)
+ )
+ return
+ }
+ super.onReceive(context, intent)
+ }
}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt
new file mode 100644
index 0000000..fa6b5fd
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/LayoutIds.kt
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget
+
+import android.os.Build
+import androidx.glance.Modifier
+import androidx.glance.findModifier
+import androidx.glance.layout.Dimension
+import androidx.glance.layout.HeightModifier
+import androidx.glance.layout.WidthModifier
+
+/**
+ * Set of ids defining a layout.
+ *
+ * It contains the id of the layout itself, and the ids of the elements within the layout that
+ * the code may need to access.
+ */
+internal data class LayoutIds(
+ val layoutId: Int,
+ val mainViewId: Int = R.id.glanceView,
+ val sizeViewId: Int? = null,
+)
+
+/**
+ * Layout selector.
+ *
+ * This class is used to select a particular layout in [generatedLayouts].
+ */
+internal data class LayoutSelector(
+ val type: Type,
+ val width: Size,
+ val height: Size,
+ val canResize: Boolean,
+) {
+
+ internal enum class Size {
+ Wrap,
+ Fixed,
+ Expand,
+ MatchParent,
+ }
+
+ internal enum class Type {
+ Row,
+ Column,
+ Box,
+ Text,
+ List1,
+ List2,
+ List3,
+ ListItem,
+ CheckBox,
+ CheckBoxBackport
+ }
+}
+
+/**
+ * Select the layout based on the specification.
+ *
+ * @param type Type of layout
+ * @param modifier Modifier applied to the layout. Modifiers of interest will be extracted to get
+ * the layout they can be applied on.
+ */
+internal fun selectLayout(
+ type: LayoutSelector.Type,
+ modifier: Modifier
+): LayoutIds {
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ return selectApi31Layout(type, modifier)
+ }
+ val widthMod = modifier.findModifier<WidthModifier>()?.width ?: Dimension.Wrap
+ val heightMod = modifier.findModifier<HeightModifier>()?.height ?: Dimension.Wrap
+ val needResize = widthMod is Dimension.Dp || heightMod is Dimension.Dp
+ val width = widthMod.toSpecSize()
+ val height = heightMod.toSpecSize()
+ return generatedLayouts[LayoutSelector(type, width, height, needResize)]
+ ?: (if (!needResize) generatedLayouts[LayoutSelector(type, width, height, true)] else null)
+ ?: throw IllegalArgumentException(
+ "Could not find layout for $type, width=$width, height=$height, canResize=$needResize"
+ )
+}
+
+private fun Dimension.toSpecSize(): LayoutSelector.Size =
+ when (this) {
+ is Dimension.Dp -> LayoutSelector.Size.Fixed
+ is Dimension.Wrap -> LayoutSelector.Size.Wrap
+ is Dimension.Expand -> LayoutSelector.Size.Expand
+ is Dimension.Fill -> LayoutSelector.Size.MatchParent
+ }
+
+/**
+ * For API 31, we will always select layouts marked as non-resizable, as starting Android S, we
+ * can always resize views and we want the simplest layout possible.
+ */
+private fun selectApi31Layout(
+ type: LayoutSelector.Type,
+ modifier: Modifier
+): LayoutIds {
+ val widthMod = modifier.findModifier<WidthModifier>()?.width ?: Dimension.Wrap
+ val heightMod = modifier.findModifier<HeightModifier>()?.height ?: Dimension.Wrap
+ val width = widthMod.toSpecSize()
+ val height = heightMod.toSpecSize()
+ return generatedLayouts[LayoutSelector(type, width, height, canResize = false)]
+ ?: throw IllegalArgumentException(
+ "Could not find layout for $type, width=$width, height=$height, canResize=false"
+ )
+}
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteLazyListViewsTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteLazyListViewsTranslator.kt
index ff93e19..1b138c3 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteLazyListViewsTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteLazyListViewsTranslator.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -18,55 +17,63 @@
package androidx.glance.appwidget
import android.widget.RemoteViews
-import androidx.annotation.IdRes
-import androidx.annotation.LayoutRes
import androidx.core.widget.RemoteViewsCompat
-import androidx.glance.GlanceInternalApi
import androidx.glance.appwidget.layout.EmittableLazyColumn
import androidx.glance.appwidget.layout.EmittableLazyList
import androidx.glance.appwidget.layout.EmittableLazyListItem
import androidx.glance.appwidget.layout.ReservedItemIdRangeEnd
import androidx.glance.layout.EmittableBox
+import androidx.glance.layout.fillMaxWidth
-@OptIn(GlanceInternalApi::class)
internal fun translateEmittableLazyColumn(
translationContext: TranslationContext,
element: EmittableLazyColumn,
): RemoteViews {
- val listLayout = requireNotNull(listLayouts.getOrNull(translationContext.listCount)) {
- """
+ val listLayoutType =
+ requireNotNull(listLayouts.getOrNull(translationContext.listCount.getAndIncrement())) {
+ """
Glance widgets only support ${listLayouts.size} lazy lists per widget. If you need more
lists provide a non-composable [RemoteViews].
- """.trimIndent()
- }
- translationContext.listCount++
+ """.trimIndent()
+ }
+ val listLayout =
+ selectLayout(listLayoutType, element.modifier)
return translateEmittableLazyList(
translationContext,
element,
- listLayout.viewId,
- listLayout.layoutId
+ listLayout,
)
}
-@OptIn(GlanceInternalApi::class)
private fun translateEmittableLazyList(
- state: TranslationContext,
+ translationContext: TranslationContext,
element: EmittableLazyList,
- @IdRes viewId: Int,
- @LayoutRes layoutId: Int
-): RemoteViews = remoteViews(state, layoutId)
- .also { rv ->
- val items = RemoteViewsCompat.RemoteCollectionItems.Builder().apply {
- element.children.fold(false) { previous, itemEmittable ->
- val itemId = (itemEmittable as EmittableLazyListItem).itemId
- addItem(itemId, translateChild(state, itemEmittable))
- // If the user specifies any explicit ids, we assume the list to be stable
- previous || (itemId > ReservedItemIdRangeEnd)
- }.let { setHasStableIds(it) }
- // TODO(b/198618359): assign an explicit view type count
- }.build()
- RemoteViewsCompat.setRemoteAdapter(state.context, rv, state.appWidgetId, viewId, items)
- }
+ layoutDef: LayoutIds,
+): RemoteViews =
+ remoteViews(translationContext, layoutDef.layoutId)
+ .also { rv ->
+ check(translationContext.areLazyCollectionsAllowed) {
+ "Glance does not support nested list views."
+ }
+ val items = RemoteViewsCompat.RemoteCollectionItems.Builder().apply {
+ val childContext = translationContext.copy(areLazyCollectionsAllowed = false)
+ element.children.fold(false) { previous, itemEmittable ->
+ val itemId = (itemEmittable as EmittableLazyListItem).itemId
+ addItem(itemId, translateChild(childContext, itemEmittable))
+ // If the user specifies any explicit ids, we assume the list to be stable
+ previous || (itemId > ReservedItemIdRangeEnd)
+ }.let { setHasStableIds(it) }
+ // TODO(b/198618359): assign an explicit view type count
+ }.build()
+ RemoteViewsCompat.setRemoteAdapter(
+ translationContext.context,
+ rv,
+ translationContext.appWidgetId,
+ layoutDef.mainViewId,
+ items
+ )
+ applyModifiers(translationContext, rv, element.modifier, layoutDef)
+ }
/**
* Translates a list item either to its immediate only child, or a column layout wrapping all its
@@ -76,19 +83,17 @@
translationContext: TranslationContext,
element: EmittableLazyListItem
): RemoteViews =
- if (element.children.size == 1) {
- translateChild(translationContext, element.children.single())
- } else {
- translateChild(
- translationContext,
- EmittableBox().also { it.children.addAll(element.children) }
- )
- }
+ translateChild(
+ translationContext,
+ EmittableBox().apply {
+ modifier = modifier.fillMaxWidth()
+ contentAlignment = element.alignment
+ children.addAll(element.children)
+ }
+ )
-private data class LazyListLayout(@IdRes val viewId: Int, @LayoutRes val layoutId: Int)
-
-private val listLayouts: List<LazyListLayout> = listOf(
- LazyListLayout(R.id.glanceListView1, R.layout.list_layout_1),
- LazyListLayout(R.id.glanceListView2, R.layout.list_layout_2),
- LazyListLayout(R.id.glanceListView2, R.layout.list_layout_3),
+private val listLayouts: List<LayoutSelector.Type> = listOf(
+ LayoutSelector.Type.List1,
+ LayoutSelector.Type.List2,
+ LayoutSelector.Type.List3,
)
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt
index 40eab01..2a76fd5 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsRoot.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -18,7 +17,6 @@
package androidx.glance.appwidget
import androidx.glance.EmittableWithChildren
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
/**
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt
index 754fa36..a0a3605 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/RemoteViewsTranslator.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -18,39 +17,42 @@
package androidx.glance.appwidget
import android.content.Context
-import android.graphics.Typeface
import android.os.Build
-import android.text.ParcelableSpan
-import android.text.SpannableString
-import android.text.Spanned
-import android.text.style.StrikethroughSpan
-import android.text.style.StyleSpan
-import android.text.style.TextAppearanceSpan
-import android.text.style.UnderlineSpan
-import android.util.TypedValue
import android.view.Gravity
+import android.view.View
import android.widget.RemoteViews
import androidx.annotation.DoNotInline
import androidx.annotation.LayoutRes
import androidx.annotation.RequiresApi
+import androidx.annotation.VisibleForTesting
import androidx.core.widget.setLinearLayoutGravity
import androidx.core.widget.setRelativeLayoutGravity
import androidx.glance.Emittable
-import androidx.glance.GlanceInternalApi
+import androidx.glance.appwidget.layout.EmittableAndroidRemoteViews
+import androidx.glance.appwidget.layout.EmittableCheckBox
import androidx.glance.appwidget.layout.EmittableLazyColumn
import androidx.glance.appwidget.layout.EmittableLazyListItem
+import androidx.glance.appwidget.translators.translateEmittableCheckBox
+import androidx.glance.appwidget.translators.translateEmittableText
import androidx.glance.layout.Alignment
import androidx.glance.layout.EmittableBox
import androidx.glance.layout.EmittableColumn
import androidx.glance.layout.EmittableRow
import androidx.glance.layout.EmittableText
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
+import java.util.concurrent.atomic.AtomicInteger
internal fun translateComposition(context: Context, appWidgetId: Int, element: RemoteViewsRoot) =
- translateComposition(TranslationContext(context, appWidgetId), element)
+ translateComposition(
+ TranslationContext(context, appWidgetId, context.isRtl),
+ element
+ )
+
+@VisibleForTesting
+internal var forceRtl: Boolean? = null
+
+private val Context.isRtl: Boolean
+ get() = forceRtl
+ ?: (resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL)
private fun translateComposition(
translationContext: TranslationContext,
@@ -68,7 +70,9 @@
internal data class TranslationContext(
val context: Context,
val appWidgetId: Int,
- var listCount: Int = 0
+ val isRtl: Boolean,
+ val listCount: AtomicInteger = AtomicInteger(0),
+ val areLazyCollectionsAllowed: Boolean = true
)
internal fun translateChild(
@@ -82,6 +86,10 @@
is EmittableText -> translateEmittableText(translationContext, element)
is EmittableLazyListItem -> translateEmittableLazyListItem(translationContext, element)
is EmittableLazyColumn -> translateEmittableLazyColumn(translationContext, element)
+ is EmittableAndroidRemoteViews -> {
+ translateEmittableAndroidRemoteViews(translationContext, element)
+ }
+ is EmittableCheckBox -> translateEmittableCheckBox(translationContext, element)
else -> throw IllegalArgumentException("Unknown element type ${element::javaClass}")
}
}
@@ -105,89 +113,100 @@
else -> throw IllegalArgumentException("Unknown vertical alignment: $this")
}
-private fun Alignment.toGravity() = horizontal.toGravity() or vertical.toGravity()
+internal fun Alignment.toGravity() = horizontal.toGravity() or vertical.toGravity()
private fun translateEmittableBox(
translationContext: TranslationContext,
element: EmittableBox
-): RemoteViews =
- remoteViews(translationContext, R.layout.box_layout)
+): RemoteViews {
+ val layoutDef =
+ selectLayout(LayoutSelector.Type.Box, element.modifier)
+ return remoteViews(translationContext, layoutDef.layoutId)
.also { rv ->
- rv.setRelativeLayoutGravity(R.id.glanceView, element.contentAlignment.toGravity())
- applyModifiers(translationContext.context, rv, element.modifier)
- rv.setChildren(translationContext, R.id.glanceView, element.children)
+ rv.setRelativeLayoutGravity(layoutDef.mainViewId, element.contentAlignment.toGravity())
+ applyModifiers(
+ translationContext,
+ rv,
+ element.modifier,
+ layoutDef
+ )
+ rv.setChildren(
+ translationContext,
+ layoutDef.mainViewId,
+ element.children
+ )
}
+}
private fun translateEmittableRow(
translationContext: TranslationContext,
element: EmittableRow
-): RemoteViews =
- remoteViews(translationContext, R.layout.row_layout)
+): RemoteViews {
+ val layoutDef =
+ selectLayout(LayoutSelector.Type.Row, element.modifier)
+ return remoteViews(translationContext, layoutDef.layoutId)
.also { rv ->
rv.setLinearLayoutGravity(
- R.id.glanceView,
+ layoutDef.mainViewId,
element.horizontalAlignment.toGravity() or element.verticalAlignment.toGravity()
)
- applyModifiers(translationContext.context, rv, element.modifier)
- rv.setChildren(translationContext, R.id.glanceView, element.children)
+ applyModifiers(
+ translationContext,
+ rv,
+ element.modifier,
+ layoutDef
+ )
+ rv.setChildren(
+ translationContext,
+ layoutDef.mainViewId,
+ element.children
+ )
}
+}
private fun translateEmittableColumn(
translationContext: TranslationContext,
element: EmittableColumn
-): RemoteViews =
- remoteViews(translationContext, R.layout.column_layout)
+): RemoteViews {
+ val layoutDef =
+ selectLayout(LayoutSelector.Type.Column, element.modifier)
+ return remoteViews(translationContext, layoutDef.layoutId)
.also { rv ->
rv.setLinearLayoutGravity(
- R.id.glanceView,
+ layoutDef.mainViewId,
element.horizontalAlignment.toGravity() or element.verticalAlignment.toGravity()
)
- applyModifiers(translationContext.context, rv, element.modifier)
- rv.setChildren(translationContext, R.id.glanceView, element.children)
+ applyModifiers(
+ translationContext,
+ rv,
+ element.modifier,
+ layoutDef
+ )
+ rv.setChildren(
+ translationContext,
+ layoutDef.mainViewId,
+ element.children
+ )
}
+}
-private fun translateEmittableText(
+private fun translateEmittableAndroidRemoteViews(
translationContext: TranslationContext,
- element: EmittableText
-): RemoteViews =
- remoteViews(translationContext, R.layout.text_layout)
- .also { rv ->
- rv.setText(translationContext.context, element.text, element.style)
- applyModifiers(translationContext.context, rv, element.modifier)
+ element: EmittableAndroidRemoteViews
+): RemoteViews {
+ if (element.children.isNotEmpty()) {
+ check(element.containerViewId != View.NO_ID) {
+ "To add children to an `AndroidRemoteViews`, its `containerViewId` must be set."
}
-
-private fun RemoteViews.setText(context: Context, text: String, style: TextStyle?) {
- if (style == null) {
- setTextViewText(R.id.glanceView, text)
- return
- }
- val content = SpannableString(text)
- val length = content.length
- style.size?.let { setTextViewTextSize(R.id.glanceView, TypedValue.COMPLEX_UNIT_SP, it.value) }
- val spans = mutableListOf<ParcelableSpan>()
- style.textDecoration?.let {
- if (TextDecoration.LineThrough in it) {
- spans.add(StrikethroughSpan())
- }
- if (TextDecoration.Underline in it) {
- spans.add(UnderlineSpan())
+ return element.remoteViews.copy().apply {
+ setChildren(
+ translationContext,
+ element.containerViewId,
+ element.children
+ )
}
}
- style.fontStyle?.let {
- spans.add(StyleSpan(if (it == FontStyle.Italic) Typeface.ITALIC else Typeface.NORMAL))
- }
- style.fontWeight?.let {
- val textAppearance = when (it) {
- FontWeight.Bold -> R.style.TextAppearance_Bold
- FontWeight.Medium -> R.style.TextAppearance_Medium
- else -> R.style.TextAppearance_Normal
- }
- spans.add(TextAppearanceSpan(context, textAppearance))
- }
- spans.forEach { span ->
- content.setSpan(span, 0, length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
- }
- setTextViewText(R.id.glanceView, content)
+ return element.remoteViews
}
// Sets the emittables as children to the view. This first remove any previously added view, the
@@ -200,21 +219,44 @@
) {
removeAllViews(viewId)
children.forEachIndexed { index, child ->
- addChildView(viewId, translateChild(translationContext, child), index)
+ addChildView(
+ viewId,
+ translateChild(translationContext, child),
+ index
+ )
}
}
-// Add stable view if on Android S+, otherwise simply add the view.
+/**
+ * Add stable view if on Android S+, otherwise simply add the view.
+ */
private fun RemoteViews.addChildView(viewId: Int, childView: RemoteViews, stableId: Int) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
- Api31Impl.addChildView(this, viewId, childView, stableId)
+ RemoteViewsTranslatorApi31Impl.addChildView(this, viewId, childView, stableId)
return
}
addView(viewId, childView)
}
+/**
+ * Copy a RemoteViews (the exact method depends on the version of Android)
+ */
+@Suppress("DEPRECATION") // RemoteViews.clone must be used before Android P.
+private fun RemoteViews.copy(): RemoteViews =
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
+ RemoteViewsTranslatorApi28Impl.copyRemoteViews(this)
+ } else {
+ clone()
+ }
+
+@RequiresApi(Build.VERSION_CODES.P)
+private object RemoteViewsTranslatorApi28Impl {
+ @DoNotInline
+ fun copyRemoteViews(rv: RemoteViews) = RemoteViews(rv)
+}
+
@RequiresApi(Build.VERSION_CODES.S)
-private object Api31Impl {
+private object RemoteViewsTranslatorApi31Impl {
@DoNotInline
fun addChildView(rv: RemoteViews, viewId: Int, childView: RemoteViews, stableId: Int) {
rv.addStableView(viewId, childView, stableId)
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt
new file mode 100644
index 0000000..40f8c9d5
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/Utils.kt
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget
+
+import android.util.DisplayMetrics
+import android.util.TypedValue
+import androidx.glance.unit.Dp
+import androidx.glance.unit.dp
+
+internal fun Dp.toPixels(displayMetrics: DisplayMetrics) =
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, displayMetrics).toInt()
+
+internal fun Int.pixelsToDp(displayMetrics: DisplayMetrics) =
+ (this / displayMetrics.density).dp
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt
new file mode 100644
index 0000000..467e9be
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/AndroidRemoteViews.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.layout
+
+import android.view.View
+import android.widget.RemoteViews
+import androidx.annotation.IdRes
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposeNode
+import androidx.glance.Applier
+import androidx.glance.EmittableWithChildren
+import androidx.glance.Modifier
+
+/**
+ * Add [RemoteViews] into a glance composition.
+ *
+ * @param remoteViews the views to add to the composition.
+ */
+@Composable
+fun AndroidRemoteViews(remoteViews: RemoteViews) {
+ AndroidRemoteViews(remoteViews, View.NO_ID) { }
+}
+
+/**
+ * Add [RemoteViews] into a glance composition as a container.
+ *
+ * @param remoteViews the views to add to the composition.
+ * @param containerViewId defines the view id of the container in the [RemoteViews] provided. Any
+ * pre-existing children of that view will be removed with [RemoteViews.removeAllViews], and
+ * any children defined in the [content] block will be added with [RemoteViews.addView] (or
+ * [RemoteViews.addStableView] if available on the system).
+ */
+@Composable
+fun AndroidRemoteViews(
+ remoteViews: RemoteViews,
+ @IdRes containerViewId: Int,
+ content: @Composable () -> Unit,
+) {
+ ComposeNode<EmittableAndroidRemoteViews, Applier>(
+ factory = ::EmittableAndroidRemoteViews,
+ update = {
+ this.set(remoteViews) { this.remoteViews = it }
+ this.set(containerViewId) { this.containerViewId = it }
+ },
+ content = content
+ )
+}
+
+internal class EmittableAndroidRemoteViews : EmittableWithChildren() {
+ override var modifier: Modifier = Modifier
+
+ lateinit var remoteViews: RemoteViews
+
+ var containerViewId: Int = View.NO_ID
+}
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt
new file mode 100644
index 0000000..5a85930
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/CheckBox.kt
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.layout
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposeNode
+import androidx.glance.Applier
+import androidx.glance.Emittable
+import androidx.glance.Modifier
+import androidx.glance.text.TextStyle
+
+/**
+ * Adds a check box view to the glance view.
+ */
+@Composable
+public fun CheckBox(
+ checked: Boolean,
+ modifier: Modifier = Modifier,
+ text: String = "",
+ textStyle: TextStyle? = null
+) {
+ ComposeNode<EmittableCheckBox, Applier>(
+ factory = ::EmittableCheckBox,
+ update = {
+ this.set(checked) { this.checked = it }
+ this.set(text) { this.text = it }
+ this.set(modifier) { this.modifier = it }
+ this.set(textStyle) { this.textStyle = it }
+ }
+ )
+}
+
+internal class EmittableCheckBox : Emittable {
+ override var modifier: Modifier = Modifier
+ var checked: Boolean = false
+ var text: String = ""
+ var textStyle: TextStyle? = null
+
+ override fun toString(): String = "EmittableCheckBox(" +
+ "$text, " +
+ "checked=$checked, " +
+ "textStyle=$textStyle, " +
+ "modifier=$modifier" +
+ ")"
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt
index ea84e9b..379eee8 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/layout/LazyList.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -22,7 +21,6 @@
import androidx.compose.runtime.ComposeNode
import androidx.glance.Applier
import androidx.glance.EmittableWithChildren
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.layout.Alignment
@@ -34,9 +32,8 @@
* @param horizontalAlignment the horizontal alignment applied to the items.
* @param content a block which describes the content. Inside this block you can use methods like
* [LazyListScope.item] to add a single item or [LazyListScope.items] to add a list of items.
- *
- * TODO(b/198618359): apply modifiers for column and column items, support alignment, click handling
*/
+// TODO(b/198618359): interaction handling
@Composable
public fun LazyColumn(
modifier: Modifier = Modifier,
@@ -49,11 +46,17 @@
this.set(modifier) { this.modifier = it }
this.set(horizontalAlignment) { this.horizontalAlignment = it }
},
- content = applyListScope(content)
+ content = applyListScope(
+ Alignment(horizontalAlignment, Alignment.Vertical.CenterVertically),
+ content
+ )
)
}
-private fun applyListScope(content: LazyListScope.() -> Unit): @Composable () -> Unit {
+private fun applyListScope(
+ alignment: Alignment,
+ content: LazyListScope.() -> Unit
+): @Composable () -> Unit {
var nextImplicitItemId = ReservedItemIdRangeEnd
val itemList = mutableListOf<Pair<Long?, @Composable LazyItemScope.() -> Unit>>()
val listScopeImpl = object : LazyListScope {
@@ -82,23 +85,24 @@
itemList.forEach { (itemId, composable) ->
val id = itemId.takeIf { it != LazyListScope.UnspecifiedItemId } ?: nextImplicitItemId--
check(id != LazyListScope.UnspecifiedItemId) { "Implicit list item ids exhausted." }
- LazyListItem(id) {
+ LazyListItem(id, alignment) {
object : LazyItemScope { }.apply { composable() }
}
}
}
}
-@OptIn(GlanceInternalApi::class)
@Composable
private fun LazyListItem(
itemId: Long,
+ alignment: Alignment,
content: @Composable () -> Unit
) {
ComposeNode<EmittableLazyListItem, Applier>(
factory = ::EmittableLazyListItem,
update = {
this.set(itemId) { this.itemId = it }
+ this.set(alignment) { this.alignment = it }
},
content = content
)
@@ -157,24 +161,96 @@
}
}
-// TODO(b/198618359): Add inline helper functions with List<T> and Array<T> params.
+/**
+ * Adds a list of items.
+ *
+ * @param items the data list
+ * @param itemId a factory of stable and unique ids representing the item. The value may not be
+ * less than or equal to -2^62, as these values are reserved by the Glance API. Specifying
+ * the list item ids will maintain the scroll position through app widget updates in Android
+ * S and higher devices.
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.items(
+ items: List<T>,
+ crossinline itemId: ((item: T) -> Long) = { LazyListScope.UnspecifiedItemId },
+ crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items.size, { index: Int -> itemId(items[index]) }) {
+ itemContent(items[it])
+}
-@OptIn(GlanceInternalApi::class)
-internal abstract class EmittableLazyList : EmittableWithChildren() {
+/**
+ * Adds a list of items where the content of an item is aware of its index.
+ *
+ * @param items the data list
+ * @param itemId a factory of stable and unique ids representing the item. The value may not be
+ * less than or equal to -2^62, as these values are reserved by the Glance API. Specifying
+ * the list item ids will maintain the scroll position through app widget updates in Android
+ * S and higher devices.
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.itemsIndexed(
+ items: List<T>,
+ crossinline itemId: ((index: Int, item: T) -> Long) =
+ { _, _ -> LazyListScope.UnspecifiedItemId },
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = items(items.size, { index: Int -> itemId(index, items[index]) }) {
+ itemContent(it, items[it])
+}
+
+/**
+ * Adds an array of items.
+ *
+ * @param items the data array
+ * @param itemId a factory of stable and unique list item ids. Using the same itemId for multiple
+ * items in the array is not allowed. When you specify the itemId, the scroll position will be
+ * maintained based on the itemId, which means if you add/remove items before the current visible
+ * item the item with the given itemId will be kept as the first visible one.
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.items(
+ items: Array<T>,
+ noinline itemId: ((item: T) -> Long) = { LazyListScope.UnspecifiedItemId },
+ crossinline itemContent: @Composable LazyItemScope.(item: T) -> Unit
+) = items(items.size, { index: Int -> itemId(items[index]) }) {
+ itemContent(items[it])
+}
+
+/**
+ * Adds a array of items where the content of an item is aware of its index.
+ *
+ * @param items the data array
+ * @param itemId a factory of stable and unique list item ids. Using the same itemId for multiple
+ * items in the array is not allowed. When you specify the itemId the scroll position will be
+ * maintained based on the itemId, which means if you add/remove items before the current visible
+ * item the item with the given itemId will be kept as the first visible one.
+ * @param itemContent the content displayed by a single item
+ */
+inline fun <T> LazyListScope.itemsIndexed(
+ items: Array<T>,
+ noinline itemId: ((index: Int, item: T) -> Long) = { _, _ -> LazyListScope.UnspecifiedItemId },
+ crossinline itemContent: @Composable LazyItemScope.(index: Int, item: T) -> Unit
+) = items(items.size, { index: Int -> itemId(index, items[index]) }) {
+ itemContent(it, items[it])
+}
+
+internal abstract class EmittableLazyList : EmittableWithChildren(resetsDepthForChildren = true) {
override var modifier: Modifier = Modifier
public var horizontalAlignment: Alignment.Horizontal = Alignment.Start
override fun toString() =
- "EmittableLazyList(modifier=$modifier, children=[\n${childrenToString()}\n])"
+ "EmittableLazyList(modifier=$modifier, horizontalAlignment=$horizontalAlignment, " +
+ "children=[\n${childrenToString()}\n])"
}
-@OptIn(GlanceInternalApi::class)
internal class EmittableLazyListItem : EmittableWithChildren() {
override var modifier: Modifier = Modifier
var itemId: Long = 0
+ var alignment: Alignment = Alignment.CenterStart
override fun toString() =
- "EmittableLazyListItem(modifier=$modifier, children=[\n${childrenToString()}\n])"
+ "EmittableLazyListItem(modifier=$modifier, alignment=$alignment, " +
+ "children=[\n${childrenToString()}\n])"
}
internal class EmittableLazyColumn : EmittableLazyList()
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt
new file mode 100644
index 0000000..46454cd
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/CheckBoxTranslator.kt
@@ -0,0 +1,72 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.translators
+
+import android.os.Build
+import android.widget.RemoteViews
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.glance.appwidget.LayoutSelector
+import androidx.glance.appwidget.R
+import androidx.glance.appwidget.TranslationContext
+import androidx.glance.appwidget.applyModifiers
+import androidx.glance.appwidget.layout.EmittableCheckBox
+import androidx.glance.appwidget.remoteViews
+import androidx.glance.appwidget.selectLayout
+
+internal fun translateEmittableCheckBox(
+ translationContext: TranslationContext,
+ element: EmittableCheckBox
+): RemoteViews {
+
+ val layoutType = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ LayoutSelector.Type.CheckBox
+ } else {
+ LayoutSelector.Type.CheckBoxBackport
+ }
+
+ val layoutDef = selectLayout(layoutType, element.modifier)
+ val rv = remoteViews(translationContext, layoutDef.layoutId)
+ val textViewId: Int
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ textViewId = layoutDef.mainViewId
+ CheckBoxTranslatorApi31Impl.setCompoundButtonChecked(
+ rv,
+ layoutDef.mainViewId,
+ element.checked
+ )
+ } else {
+ textViewId = R.id.checkBoxText
+ // Special case for needing the reflection method. View.setEnabled is only safe on
+ // TextViews from API 24, but is safe for other views before that, which is why
+ // RemoteViews.kt sets required api 24 on setViewEnabled.
+ rv.setBoolean(R.id.checkBoxIcon, "setEnabled", element.checked)
+ }
+
+ rv.setText(translationContext, textViewId, element.text, element.textStyle)
+ applyModifiers(translationContext, rv, element.modifier, layoutDef)
+ return rv
+}
+
+@RequiresApi(Build.VERSION_CODES.S)
+private object CheckBoxTranslatorApi31Impl {
+ @DoNotInline
+ fun setCompoundButtonChecked(rv: RemoteViews, viewId: Int, checked: Boolean) {
+ rv.setCompoundButtonChecked(viewId, checked)
+ }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt
new file mode 100644
index 0000000..23d3f49
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/translators/TextTranslator.kt
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.translators
+
+import android.graphics.Typeface
+import android.os.Build
+import android.text.Layout.Alignment
+import android.text.ParcelableSpan
+import android.text.SpannableString
+import android.text.Spanned
+import android.text.style.AlignmentSpan
+import android.text.style.StrikethroughSpan
+import android.text.style.StyleSpan
+import android.text.style.TextAppearanceSpan
+import android.text.style.UnderlineSpan
+import android.util.TypedValue
+import android.view.Gravity
+import android.widget.RemoteViews
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
+import androidx.core.widget.setTextViewGravity
+import androidx.glance.appwidget.LayoutSelector
+import androidx.glance.appwidget.R
+import androidx.glance.appwidget.TranslationContext
+import androidx.glance.appwidget.applyModifiers
+import androidx.glance.appwidget.remoteViews
+import androidx.glance.appwidget.selectLayout
+import androidx.glance.layout.EmittableText
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextAlign
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
+
+internal fun translateEmittableText(
+ translationContext: TranslationContext,
+ element: EmittableText
+): RemoteViews {
+ val layoutDef = selectLayout(LayoutSelector.Type.Text, element.modifier)
+ return remoteViews(translationContext, layoutDef.layoutId)
+ .also { rv ->
+ rv.setText(
+ translationContext,
+ layoutDef.mainViewId,
+ element.text,
+ element.style
+ )
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ element.style?.textAlign?.let { align ->
+ TextTranslatorApi31Impl
+ .setTextViewGravity(rv, layoutDef.mainViewId, align.toGravity())
+ }
+ }
+ applyModifiers(translationContext, rv, element.modifier, layoutDef)
+ }
+}
+
+internal fun RemoteViews.setText(
+ translationContext: TranslationContext,
+ resId: Int,
+ text: String,
+ style: TextStyle?
+) {
+ if (style == null) {
+ setTextViewText(resId, text)
+ return
+ }
+ val content = SpannableString(text)
+ val length = content.length
+ style.fontSize?.let {
+ setTextViewTextSize(resId, TypedValue.COMPLEX_UNIT_SP, it.value)
+ }
+ val spans = mutableListOf<ParcelableSpan>()
+ style.textDecoration?.let {
+ if (TextDecoration.LineThrough in it) {
+ spans.add(StrikethroughSpan())
+ }
+ if (TextDecoration.Underline in it) {
+ spans.add(UnderlineSpan())
+ }
+ }
+ style.fontStyle?.let {
+ spans.add(StyleSpan(if (it == FontStyle.Italic) Typeface.ITALIC else Typeface.NORMAL))
+ }
+ style.fontWeight?.let {
+ val textAppearance = when (it) {
+ FontWeight.Bold -> R.style.TextAppearance_Bold
+ FontWeight.Medium -> R.style.TextAppearance_Medium
+ else -> R.style.TextAppearance_Normal
+ }
+ spans.add(TextAppearanceSpan(translationContext.context, textAppearance))
+ }
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.S) {
+ style.textAlign?.let { align ->
+ spans.add(AlignmentSpan.Standard(align.toAlignment(translationContext.isRtl)))
+ }
+ }
+ spans.forEach { span ->
+ content.setSpan(span, 0, length, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)
+ }
+ setTextViewText(resId, content)
+}
+
+private fun TextAlign.toGravity(): Int =
+ when (this) {
+ TextAlign.Center -> Gravity.CENTER_HORIZONTAL
+ TextAlign.Left -> Gravity.LEFT
+ TextAlign.Right -> Gravity.RIGHT
+ TextAlign.Start -> Gravity.START
+ TextAlign.End -> Gravity.END
+ else -> throw IllegalArgumentException("Unknown TextAlign: $this")
+ }
+
+private fun TextAlign.toAlignment(isRtl: Boolean): Alignment =
+ when (this) {
+ TextAlign.Center -> Alignment.ALIGN_CENTER
+ TextAlign.Left -> if (isRtl) Alignment.ALIGN_OPPOSITE else Alignment.ALIGN_NORMAL
+ TextAlign.Right -> if (isRtl) Alignment.ALIGN_NORMAL else Alignment.ALIGN_OPPOSITE
+ TextAlign.Start -> Alignment.ALIGN_NORMAL
+ TextAlign.End -> Alignment.ALIGN_OPPOSITE
+ else -> throw IllegalArgumentException("Unknown TextAlign: $this")
+ }
+
+@RequiresApi(Build.VERSION_CODES.S)
+private object TextTranslatorApi31Impl {
+ @DoNotInline
+ fun setTextViewGravity(rv: RemoteViews, viewId: Int, gravity: Int) {
+ rv.setTextViewGravity(viewId, gravity)
+ }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml
similarity index 77%
copy from glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
copy to glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml
index b627d38..80c4152 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/box.xml
@@ -14,7 +14,4 @@
limitations under the License.
-->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+<RelativeLayout />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml
similarity index 81%
copy from glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
copy to glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml
index b627d38..47c3a39 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box.xml
@@ -14,7 +14,6 @@
limitations under the License.
-->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
+<CheckBox xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:textDirection="locale" />
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml
new file mode 100644
index 0000000..1756ca7
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/check_box_backport.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ android:id="@id/glanceView"
+ android:orientation="horizontal"
+ android:gravity="center">
+ <!-- Note: A separate ImageView is used for the icon rather than using the drawable of the
+ TextView as TextView.setEnabled is only remotable since API 24, whereas View.setEnabled is
+ remotable on all APIs. -->
+ <ImageView
+ android:id="@id/checkBoxIcon"
+ android:layout_width="32dp"
+ android:layout_height="32dp"
+ android:src="@drawable/abc_btn_check_material_anim_enabled"
+ android:layout_centerVertical="true"
+ android:tint="?android:attr/colorAccent"/>
+ <TextView
+ android:id="@id/checkBoxText"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:textDirection="locale" />
+</LinearLayout>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml
similarity index 86%
rename from glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
rename to glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml
index 8e05759..0757ba7 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/column.xml
@@ -15,7 +15,4 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
android:orientation="vertical" />
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
similarity index 84%
rename from glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
rename to glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
index 86afc60..28c77a6 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/list1.xml
@@ -15,6 +15,4 @@
-->
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView2"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:id="@id/glanceListView1" />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/list2.xml
similarity index 84%
copy from glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
copy to glance/glance-appwidget/src/androidMain/layoutTemplates/list2.xml
index 86afc60..3cef3f4 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/list2.xml
@@ -15,6 +15,4 @@
-->
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView2"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:id="@id/glanceListView2" />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/list3.xml
similarity index 84%
copy from glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
copy to glance/glance-appwidget/src/androidMain/layoutTemplates/list3.xml
index 86afc60..b4e31dd 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/list3.xml
@@ -15,6 +15,4 @@
-->
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView2"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+ android:id="@id/glanceListView3" />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/row_layout.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml
similarity index 86%
rename from glance/glance-appwidget/src/androidMain/res/layout/row_layout.xml
rename to glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml
index 5e402de..573ee98 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/row_layout.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/row.xml
@@ -15,7 +15,4 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
android:orientation="horizontal" />
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml b/glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml
similarity index 85%
rename from glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
rename to glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml
index b627d38..4fb65a6 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
+++ b/glance/glance-appwidget/src/androidMain/layoutTemplates/text.xml
@@ -15,6 +15,4 @@
-->
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+ android:textDirection="locale"/>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml
new file mode 100644
index 0000000..8d892c1
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_box_inner_merged_animation.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="pathData"
+ android:valueFrom="M -7.0,-7.0 l 14.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,14.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -14.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-14.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueTo="M 0.0,-0.05 l 0.0,0.0 c 0.02761423749,0.0 0.05,0.02238576251 0.05,0.05 l 0.0,0.0 c 0.0,0.02761423749 -0.02238576251,0.05 -0.05,0.05 l 0.0,0.0 c -0.02761423749,0.0 -0.05,-0.02238576251 -0.05,-0.05 l 0.0,0.0 c 0.0,-0.02761423749 0.02238576251,-0.05 0.05,-0.05 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1"/>
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:interpolator="@android:interpolator/linear"/>
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0"/>
+ </set>
+</set>
diff --git a/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml
new file mode 100644
index 0000000..57fc365
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_box_outer_merged_animation.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -1.4234161377,-1.40159606934 -1.4234161377,-1.40159606934 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 0.00932312011719,-0.0124053955078 0.00932312011719,-0.0124053955078 c 0.0,0.0 0.0234069824219,-0.0235137939453 0.0234069824219,-0.0235137939453 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -1.4375,1.43751525879 -1.4375,1.43751525879 Z"
+ android:valueTo="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -1.4234161377,-1.40159606934 -1.4234161377,-1.40159606934 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 0.00932312011719,-0.0124053955078 0.00932312011719,-0.0124053955078 c 0.0,0.0 0.0234069824219,-0.0235137939453 0.0234069824219,-0.0235137939453 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -1.4375,1.43751525879 -1.4375,1.43751525879 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear"/>
+ <objectAnimator
+ android:duration="300"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -1.4234161377,-1.40159606934 -1.4234161377,-1.40159606934 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 0.00932312011719,-0.0124053955078 0.00932312011719,-0.0124053955078 c 0.0,0.0 0.0234069824219,-0.0235137939453 0.0234069824219,-0.0235137939453 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -1.4375,1.43751525879 -1.4375,1.43751525879 Z"
+ android:valueTo="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -5.0,-5.00001525879 -5.0,-5.00001525879 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 3.58590698242,3.58601379395 3.58590698242,3.58601379395 c 0.0,0.0 7.58590698242,-7.58601379395 7.58590698242,-7.58601379395 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -9.0,9.00001525879 -9.0,9.00001525879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1"/>
+ </set>
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:interpolator="@android:interpolator/linear"/>
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0"/>
+ </set>
+</set>
diff --git a/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_icon_null_animation.xml b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_icon_null_animation.xml
new file mode 100644
index 0000000..a6ef064
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_checked_icon_null_animation.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleX"
+ android:valueFrom="0.2"
+ android:valueTo="0.18"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1"/>
+ <objectAnimator
+ android:duration="300"
+ android:propertyName="scaleX"
+ android:valueFrom="0.18"
+ android:valueTo="0.2"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1"/>
+ </set>
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="200"
+ android:propertyName="scaleY"
+ android:valueFrom="0.2"
+ android:valueTo="0.18"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1"/>
+ <objectAnimator
+ android:duration="300"
+ android:propertyName="scaleY"
+ android:valueFrom="0.18"
+ android:valueTo="0.2"
+ android:interpolator="@interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1"/>
+ </set>
+</set>
diff --git a/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml
new file mode 100644
index 0000000..0f13aaf
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_box_inner_merged_animation.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0,-1.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,0.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,0.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueTo="M 0.0,-1.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,0.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,0.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@android:interpolator/linear"/>
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="pathData"
+ android:valueFrom="M 0.0,-1.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,0.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,0.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueTo="M -7.0,-7.0 l 14.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,14.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -14.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-14.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1"/>
+ </set>
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="133"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.0"
+ android:valueTo="0.0"
+ android:interpolator="@android:interpolator/linear"/>
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="fillAlpha"
+ android:valueFrom="0.0"
+ android:valueTo="1.0"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0"/>
+ </set>
+</set>
diff --git a/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml
new file mode 100644
index 0000000..188e706
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_check_path_merged_animation.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="pathData"
+ android:valueFrom="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -5.0,-5.00001525879 -5.0,-5.00001525879 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 3.58590698242,3.58601379395 3.58590698242,3.58601379395 c 0.0,0.0 7.58590698242,-7.58601379395 7.58590698242,-7.58601379395 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -9.0,9.00001525879 -9.0,9.00001525879 Z"
+ android:valueTo="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M 0.0,1.42500305176 c 0.0,0.0 -1.4234161377,-1.40159606934 -1.4234161377,-1.40159606934 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 0.00932312011719,-0.0124053955078 0.00932312011719,-0.0124053955078 c 0.0,0.0 0.0234069824219,-0.0235137939453 0.0234069824219,-0.0235137939453 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -1.4375,1.43751525879 -1.4375,1.43751525879 Z"
+ android:valueType="pathType"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1" />
+ <set android:ordering="sequentially" >
+ <objectAnimator
+ android:duration="133"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="1.0"
+ android:interpolator="@android:interpolator/linear" />
+ <objectAnimator
+ android:duration="33"
+ android:propertyName="fillAlpha"
+ android:valueFrom="1.0"
+ android:valueTo="0.0"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0" />
+ </set>
+</set>
diff --git a/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_icon_null_animation.xml b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_icon_null_animation.xml
new file mode 100644
index 0000000..8b63d01
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/anim/btn_checkbox_to_unchecked_icon_null_animation.xml
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<set xmlns:android="http://schemas.android.com/apk/res/android">
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="scaleX"
+ android:valueFrom="0.2"
+ android:valueTo="0.18"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1" />
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="scaleX"
+ android:valueFrom="0.18"
+ android:valueTo="0.2"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1" />
+ </set>
+ <set android:ordering="sequentially">
+ <objectAnimator
+ android:duration="166"
+ android:propertyName="scaleY"
+ android:valueFrom="0.2"
+ android:valueTo="0.18"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1" />
+ <objectAnimator
+ android:duration="333"
+ android:propertyName="scaleY"
+ android:valueFrom="0.18"
+ android:valueTo="0.2"
+ android:interpolator="@interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1" />
+ </set>
+</set>
diff --git a/glance/glance-appwidget/src/androidMain/res/drawable/abc_btn_check_material_anim_enabled.xml b/glance/glance-appwidget/src/androidMain/res/drawable/abc_btn_check_material_anim_enabled.xml
new file mode 100644
index 0000000..40460a5
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/drawable/abc_btn_check_material_anim_enabled.xml
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<!-- This is a copy of abc_btn_check_material_anim.xml but using android:state_enabled instead of
+ android:state_checked as the former is available in RemoteViews before API 31. -->
+<animated-selector
+ xmlns:android="http://schemas.android.com/apk/res/android">
+ <item
+ android:id="@+id/checked"
+ android:state_enabled="true"
+ android:drawable="@drawable/btn_checkbox_checked_mtrl" />
+ <item
+ android:id="@+id/unchecked"
+ android:drawable="@drawable/btn_checkbox_unchecked_mtrl" />
+ <transition
+ android:fromId="@+id/unchecked"
+ android:toId="@+id/checked"
+ android:drawable="@drawable/btn_checkbox_unchecked_to_checked_mtrl_animation" />
+ <transition
+ android:fromId="@+id/checked"
+ android:toId="@+id/unchecked"
+
+ android:drawable="@drawable/btn_checkbox_checked_to_unchecked_mtrl_animation" />
+</animated-selector>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_checked_mtrl.xml b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_checked_mtrl.xml
new file mode 100644
index 0000000..464a450
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_checked_mtrl.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="btn_checkbox_checked"
+ android:width="32dp"
+ android:height="32dp"
+ android:viewportWidth="48"
+ android:viewportHeight="48">
+ <group
+ android:name="icon_null"
+ android:translateX="24"
+ android:translateY="24"
+ android:scaleX="0.2"
+ android:scaleY="0.2">
+ <group
+ android:name="check"
+ android:scaleX="7.5"
+ android:scaleY="7.5">
+ <path
+ android:name="check_path_merged"
+ android:pathData="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -5.0,-5.00001525879 -5.0,-5.00001525879 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 3.58590698242,3.58601379395 3.58590698242,3.58601379395 c 0.0,0.0 7.58590698242,-7.58601379395 7.58590698242,-7.58601379395 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -9.0,9.00001525879 -9.0,9.00001525879 Z"
+ android:fillColor="#FF000000"/>
+ </group>
+ <group
+ android:name="box_dilate"
+ android:scaleX="7.5"
+ android:scaleY="7.5">
+ <path
+ android:name="box_inner_merged"
+ android:pathData="M 0.0,-1.0 l 0.0,0.0 c 0.5522847498,0.0 1.0,0.4477152502 1.0,1.0 l 0.0,0.0 c 0.0,0.5522847498 -0.4477152502,1.0 -1.0,1.0 l 0.0,0.0 c -0.5522847498,0.0 -1.0,-0.4477152502 -1.0,-1.0 l 0.0,0.0 c 0.0,-0.5522847498 0.4477152502,-1.0 1.0,-1.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:fillColor="#FF000000"
+ android:fillAlpha="0"/>
+ </group>
+ </group>
+</vector>
diff --git a/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml
new file mode 100644
index 0000000..77d5418
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_checked_to_unchecked_mtrl_animation.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<animated-vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:drawable="@drawable/btn_checkbox_checked_mtrl"
+ tools:ignore="NewApi">
+ <target
+ android:name="icon_null"
+ android:animation="@anim/btn_checkbox_to_unchecked_icon_null_animation" />
+ <target
+ android:name="check_path_merged"
+ android:animation="@anim/btn_checkbox_to_unchecked_check_path_merged_animation" />
+ <target
+ android:name="box_inner_merged"
+ android:animation="@anim/btn_checkbox_to_unchecked_box_inner_merged_animation" />
+</animated-vector>
diff --git a/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_unchecked_mtrl.xml b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_unchecked_mtrl.xml
new file mode 100644
index 0000000..f21429f
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_unchecked_mtrl.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:name="btn_checkbox_unchecked"
+ android:width="32dp"
+ android:viewportWidth="48"
+ android:height="32dp"
+ android:viewportHeight="48">
+ <group
+ android:name="icon_null"
+ android:translateX="24"
+ android:translateY="24"
+ android:scaleX="0.2"
+ android:scaleY="0.2">
+ <group
+ android:name="check"
+ android:scaleX="7.5"
+ android:scaleY="7.5">
+ <path
+ android:name="box_outer_merged"
+ android:pathData="M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M -2.0,5.00001525879 c 0.0,0.0 -1.4234161377,-1.40159606934 -1.4234161377,-1.40159606934 c 0.0,0.0 1.41409301758,-1.41409301758 1.41409301758,-1.41409301758 c 0.0,0.0 0.00932312011719,-0.0124053955078 0.00932312011719,-0.0124053955078 c 0.0,0.0 0.0234069824219,-0.0235137939453 0.0234069824219,-0.0235137939453 c 0.0,0.0 1.41409301758,1.41409301758 1.41409301758,1.41409301758 c 0.0,0.0 -1.4375,1.43751525879 -1.4375,1.43751525879 Z"
+ android:fillColor="#FF000000"
+ android:fillAlpha="0"/>
+ </group>
+ <group
+ android:name="box_dilate"
+ android:scaleX="7.5"
+ android:scaleY="7.5">
+ <path
+ android:name="box_inner_merged"
+ android:pathData="M -7.0,-7.0 l 14.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,14.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l -14.0,0.0 c 0.0,0.0 0.0,0.0 0.0,0.0 l 0.0,-14.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z M 7.0,-9.0 c 0.0,0.0 -14.0,0.0 -14.0,0.0 c -1.1044921875,0.0 -2.0,0.8955078125 -2.0,2.0 c 0.0,0.0 0.0,14.0 0.0,14.0 c 0.0,1.1044921875 0.8955078125,2.0 2.0,2.0 c 0.0,0.0 14.0,0.0 14.0,0.0 c 1.1044921875,0.0 2.0,-0.8955078125 2.0,-2.0 c 0.0,0.0 0.0,-14.0 0.0,-14.0 c 0.0,-1.1044921875 -0.8955078125,-2.0 -2.0,-2.0 c 0.0,0.0 0.0,0.0 0.0,0.0 Z"
+ android:fillColor="#FF000000"/>
+ </group>
+ </group>
+</vector>
diff --git a/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml
new file mode 100644
index 0000000..9d30913
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/drawable/btn_checkbox_unchecked_to_checked_mtrl_animation.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<animated-vector
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:drawable="@drawable/btn_checkbox_unchecked_mtrl"
+ tools:ignore="NewApi">
+ <target
+ android:name="icon_null"
+ android:animation="@anim/btn_checkbox_to_checked_icon_null_animation" />
+ <target
+ android:name="box_outer_merged"
+ android:animation="@anim/btn_checkbox_to_checked_box_outer_merged_animation" />
+ <target
+ android:name="box_inner_merged"
+ android:animation="@anim/btn_checkbox_to_checked_box_inner_merged_animation" />
+</animated-vector>
diff --git a/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml
new file mode 100644
index 0000000..3db122b
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_0.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 l 1.0,0.0 l 0.0,1.0"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml
new file mode 100644
index 0000000..47f65a0
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_checked_mtrl_animation_interpolator_1.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.33333333,0.0 0.0,1.0 1.0,1.0"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml
new file mode 100644
index 0000000..3db122b
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_0.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 l 1.0,0.0 l 0.0,1.0"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml
new file mode 100644
index 0000000..47f65a0
--- /dev/null
+++ b/glance/glance-appwidget/src/androidMain/res/interpolator/btn_checkbox_unchecked_mtrl_animation_interpolator_1.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright 2018 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+
+<pathInterpolator
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:pathData="M 0.0,0.0 c 0.33333333,0.0 0.0,1.0 1.0,1.0"/>
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/box_layout.xml b/glance/glance-appwidget/src/androidMain/res/layout/box_layout.xml
deleted file mode 100644
index cee2309..0000000
--- a/glance/glance-appwidget/src/androidMain/res/layout/box_layout.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_item_layout.xml b/glance/glance-appwidget/src/androidMain/res/layout/list_item_layout.xml
deleted file mode 100644
index d580dbf..0000000
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_item_layout.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_1.xml b/glance/glance-appwidget/src/androidMain/res/layout/list_layout_1.xml
deleted file mode 100644
index 8bc0820..0000000
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_1.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView1"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_3.xml b/glance/glance-appwidget/src/androidMain/res/layout/list_layout_3.xml
deleted file mode 100644
index 5446ac9..0000000
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_3.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- -->
-
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView3"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
diff --git a/glance/glance-appwidget/src/androidMain/res/values/ids.xml b/glance/glance-appwidget/src/androidMain/res/values/ids.xml
index 91c9e91..4989b42 100644
--- a/glance/glance-appwidget/src/androidMain/res/values/ids.xml
+++ b/glance/glance-appwidget/src/androidMain/res/values/ids.xml
@@ -15,8 +15,12 @@
-->
<resources>
+ <id name="checkBoxIcon"/>
+ <id name="checkBoxText"/>
<id name="glanceView"/>
<id name="glanceListView1"/>
<id name="glanceListView2"/>
<id name="glanceListView3"/>
+ <id name="relativeLayout"/>
+ <id name="sizeView"/>
</resources>
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
index 37104f7..cbda718 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/GlanceAppWidgetTest.kt
@@ -26,7 +26,6 @@
import android.widget.TextView
import androidx.compose.runtime.Composable
import androidx.core.os.bundleOf
-import androidx.glance.GlanceInternalApi
import androidx.glance.LocalSize
import androidx.glance.layout.Text
import androidx.glance.unit.DpSize
@@ -47,12 +46,13 @@
import org.robolectric.annotation.Config
import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(RobolectricTestRunner::class)
class GlanceAppWidgetTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
private val context = ApplicationProvider.getApplicationContext<Context>()
+ private val displayMetrics = context.resources.displayMetrics
@Before
fun setUp() {
@@ -261,7 +261,8 @@
)
}
- assertThat(composer.appWidgetMinSize(appWidgetManager, 1)).isEqualTo(DpSize(50.dp, 50.dp))
+ assertThat(composer.appWidgetMinSize(displayMetrics, appWidgetManager, 1))
+ .isEqualTo(DpSize(50.dp, 50.dp))
}
@Test
@@ -279,7 +280,8 @@
)
}
- assertThat(composer.appWidgetMinSize(appWidgetManager, 1)).isEqualTo(DpSize(40.dp, 50.dp))
+ assertThat(composer.appWidgetMinSize(displayMetrics, appWidgetManager, 1))
+ .isEqualTo(DpSize(40.dp, 50.dp))
}
@Test
@@ -297,7 +299,8 @@
)
}
- assertThat(composer.appWidgetMinSize(appWidgetManager, 1)).isEqualTo(DpSize(50.dp, 30.dp))
+ assertThat(composer.appWidgetMinSize(displayMetrics, appWidgetManager, 1))
+ .isEqualTo(DpSize(50.dp, 30.dp))
}
@Test
@@ -315,7 +318,8 @@
)
}
- assertThat(composer.appWidgetMinSize(appWidgetManager, 1)).isEqualTo(DpSize(50.dp, 50.dp))
+ assertThat(composer.appWidgetMinSize(displayMetrics, appWidgetManager, 1))
+ .isEqualTo(DpSize(50.dp, 50.dp))
}
private fun optionsBundleOf(vararg sizes: DpSize): Bundle {
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt
index 21dea89..1abfac7 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/RemoteViewsTranslatorKtTest.kt
@@ -18,44 +18,38 @@
import android.annotation.TargetApi
import android.content.Context
-import android.content.res.Configuration
-import android.graphics.Typeface
import android.os.Build
import android.text.SpannedString
-import android.text.TextUtils
import android.text.style.StrikethroughSpan
-import android.text.style.StyleSpan
-import android.text.style.TextAppearanceSpan
import android.text.style.UnderlineSpan
-import android.util.TypedValue
import android.view.Gravity
import android.view.View
import android.view.ViewGroup
+import android.widget.ImageView
import android.widget.LinearLayout
import android.widget.ListView
import android.widget.RelativeLayout
import android.widget.RemoteViews
import android.widget.TextView
import androidx.compose.runtime.Composable
-import androidx.glance.GlanceInternalApi
+import androidx.core.view.children
import androidx.glance.Modifier
+import androidx.glance.appwidget.layout.AndroidRemoteViews
+import androidx.glance.appwidget.layout.CheckBox
import androidx.glance.appwidget.layout.LazyColumn
import androidx.glance.appwidget.layout.ReservedItemIdRangeEnd
+import androidx.glance.appwidget.test.R
import androidx.glance.layout.Alignment
import androidx.glance.layout.Box
import androidx.glance.layout.Column
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
import androidx.glance.layout.Row
import androidx.glance.layout.Text
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
import androidx.glance.layout.absolutePadding
import androidx.glance.layout.padding
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.glance.unit.Dp
-import androidx.glance.unit.Sp
import androidx.glance.unit.dp
-import androidx.glance.unit.sp
import androidx.test.core.app.ApplicationProvider
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -67,11 +61,11 @@
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config
import java.lang.IllegalArgumentException
-import java.util.Locale
+import java.lang.IllegalStateException
import kotlin.test.assertFailsWith
import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
@RunWith(RobolectricTestRunner::class)
class RemoteViewsTranslatorKtTest {
@@ -86,7 +80,7 @@
@Test
fun canTranslateBox() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate { Box {} }
+ val rv = context.runAndTranslate { Box {} }
val view = context.applyRemoteViews(rv)
assertIs<RelativeLayout>(view)
@@ -95,7 +89,7 @@
@Test
fun canTranslateBoxWithAlignment() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Box(contentAlignment = Alignment.BottomEnd) { }
}
val view = context.applyRemoteViews(rv)
@@ -106,7 +100,7 @@
@Test
fun canTranslateBoxWithChildren() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Box {
Box(contentAlignment = Alignment.Center) {}
Box(contentAlignment = Alignment.BottomEnd) {}
@@ -126,7 +120,7 @@
@Test
fun canReapplyTranslateBox() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Box {
Box(contentAlignment = Alignment.Center) {}
Box(contentAlignment = Alignment.BottomEnd) {}
@@ -159,7 +153,7 @@
@Test
fun canTranslateMultipleNodes() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Box(contentAlignment = Alignment.Center) {}
Box(contentAlignment = Alignment.BottomEnd) {}
}
@@ -177,7 +171,7 @@
@Test
fun canTranslatePaddingModifier() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Box(
modifier = Modifier.padding(
start = 4.dp,
@@ -198,7 +192,7 @@
@Test
fun canTranslatePaddingRTL() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslateInRtl {
+ val rv = context.runAndTranslateInRtl {
Box(
modifier = Modifier.padding(
start = 4.dp,
@@ -219,7 +213,7 @@
@Test
fun canTranslateAbsolutePaddingRTL() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslateInRtl {
+ val rv = context.runAndTranslateInRtl {
Box(
modifier = Modifier.absolutePadding(
left = 4.dp,
@@ -240,7 +234,7 @@
@Test
fun canTranslateRow() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate { Row { } }
+ val rv = context.runAndTranslate { Row { } }
val view = context.applyRemoteViews(rv)
assertIs<LinearLayout>(view)
@@ -249,7 +243,7 @@
@Test
fun canTranslateColumn() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate { Column { } }
+ val rv = context.runAndTranslate { Column { } }
val view = context.applyRemoteViews(rv)
assertIs<LinearLayout>(view)
@@ -259,7 +253,7 @@
@Test
@TargetApi(24)
fun canTranslateRowWithAlignment() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Row(
horizontalAlignment = Alignment.End,
verticalAlignment = Alignment.Bottom
@@ -274,7 +268,7 @@
@Test
@TargetApi(24)
fun canTranslateColumnWithAlignment() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Column(
horizontalAlignment = Alignment.Start,
verticalAlignment = Alignment.Bottom
@@ -289,7 +283,7 @@
@Test
@TargetApi(24)
fun canTranslateRowWithChildren() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Row {
Row(
horizontalAlignment = Alignment.CenterHorizontally,
@@ -323,7 +317,7 @@
@Test
@TargetApi(24)
fun canTranslateColumnWithChildren() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Column {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
@@ -356,7 +350,7 @@
@Test
fun canTranslateRowPaddingModifier() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Row(
modifier = Modifier.padding(
start = 17.dp,
@@ -377,7 +371,7 @@
@Test
fun canTranslateColumnPaddingModifier() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
+ val rv = context.runAndTranslate {
Column(
modifier = Modifier.padding(
start = 13.dp,
@@ -398,7 +392,7 @@
@Test
fun canTranslateRowPaddingRTL() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslateInRtl {
+ val rv = context.runAndTranslateInRtl {
Row(
modifier = Modifier.padding(
start = 4.dp,
@@ -419,7 +413,7 @@
@Test
fun canTranslateColumnPaddingRTL() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslateInRtl {
+ val rv = context.runAndTranslateInRtl {
Column(
modifier = Modifier.padding(
start = 8.dp,
@@ -440,7 +434,7 @@
@Test
fun canTranslateRowAbsolutePaddingRTL() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslateInRtl {
+ val rv = context.runAndTranslateInRtl {
Row(
modifier = Modifier.absolutePadding(
left = 12.dp,
@@ -461,7 +455,7 @@
@Test
fun canTranslateColumnAbsolutePaddingRTL() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslateInRtl {
+ val rv = context.runAndTranslateInRtl {
Column(
modifier = Modifier.absolutePadding(
left = 16.dp,
@@ -481,119 +475,6 @@
}
@Test
- fun canTranslateText() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
- Text("test")
- }
- val view = context.applyRemoteViews(rv)
-
- assertIs<TextView>(view)
- assertThat(view.text.toString()).isEqualTo("test")
- }
-
- @Test
- @Config(sdk = [23, 29])
- fun canTranslateText_withStyleWeightAndSize() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
- Text(
- "test",
- style = TextStyle(fontWeight = FontWeight.Medium, size = 12.sp),
- )
- }
- val view = context.applyRemoteViews(rv)
-
- assertIs<TextView>(view)
- assertThat(view.textSize).isEqualTo(12.sp.toPixels())
- val content = view.text as SpannedString
- assertThat(content.toString()).isEqualTo("test")
- content.checkSingleSpan<TextAppearanceSpan> {
- if (Build.VERSION.SDK_INT >= 29) {
- assertThat(it.textFontWeight).isEqualTo(FontWeight.Medium.value)
- // Note: textStyle is always set, but to NORMAL if unspecified
- assertThat(it.textStyle).isEqualTo(Typeface.NORMAL)
- } else {
- assertThat(it.textStyle).isEqualTo(Typeface.BOLD)
- }
- }
- }
-
- @Test
- fun canTranslateText_withStyleStrikeThrough() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
- Text("test", style = TextStyle(textDecoration = TextDecoration.LineThrough))
- }
- val view = context.applyRemoteViews(rv)
-
- assertIs<TextView>(view)
- val content = view.text as SpannedString
- assertThat(content.toString()).isEqualTo("test")
- content.checkSingleSpan<StrikethroughSpan> { }
- }
-
- @Test
- fun canTranslateText_withStyleUnderline() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
- Text("test", style = TextStyle(textDecoration = TextDecoration.Underline))
- }
- val view = context.applyRemoteViews(rv)
-
- assertIs<TextView>(view)
- val content = view.text as SpannedString
- assertThat(content.toString()).isEqualTo("test")
- content.checkSingleSpan<UnderlineSpan> { }
- }
-
- @Test
- fun canTranslateText_withStyleItalic() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
- Text("test", style = TextStyle(fontStyle = FontStyle.Italic))
- }
- val view = context.applyRemoteViews(rv)
-
- assertIs<TextView>(view)
- val content = view.text as SpannedString
- assertThat(content.toString()).isEqualTo("test")
- content.checkSingleSpan<StyleSpan> {
- assertThat(it.style).isEqualTo(Typeface.ITALIC)
- }
- }
-
- @Test
- @Config(sdk = [23, 29])
- fun canTranslateText_withComplexStyle() = fakeCoroutineScope.runBlockingTest {
- val rv = runAndTranslate {
- Text(
- "test",
- style = TextStyle(
- textDecoration = TextDecoration.Underline + TextDecoration.LineThrough,
- fontStyle = FontStyle.Italic,
- fontWeight = FontWeight.Bold,
- ),
- )
- }
- val view = context.applyRemoteViews(rv)
-
- assertIs<TextView>(view)
- val content = view.text as SpannedString
- assertThat(content.toString()).isEqualTo("test")
- assertThat(content.getSpans(0, content.length, Any::class.java)).hasLength(4)
- content.checkHasSingleTypedSpan<UnderlineSpan> { }
- content.checkHasSingleTypedSpan<StrikethroughSpan> { }
- content.checkHasSingleTypedSpan<StyleSpan> {
- assertThat(it.style).isEqualTo(Typeface.ITALIC)
- }
- content.checkHasSingleTypedSpan<TextAppearanceSpan> {
- if (Build.VERSION.SDK_INT >= 29) {
- assertThat(it.textFontWeight).isEqualTo(FontWeight.Bold.value)
- // Note: textStyle is always set, but to NORMAL if unspecified
- assertThat(it.textStyle).isEqualTo(Typeface.NORMAL)
- } else {
- assertThat(it.textStyle).isEqualTo(Typeface.BOLD)
- }
- }
- }
-
- @Test
fun canTranslateLazyColumn_emptyList() = fakeCoroutineScope.runBlockingTest {
val rv = runAndTranslate {
LazyColumn { }
@@ -675,6 +556,123 @@
}
}
+ @Test
+ fun cannotTranslateNestedLists() = fakeCoroutineScope.runBlockingTest {
+ assertFailsWith<IllegalStateException> {
+ runAndTranslate {
+ LazyColumn {
+ item {
+ LazyColumn {
+ item {
+ Text("Crash expected")
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ fun canTranslateAndroidRemoteViews() = fakeCoroutineScope.runBlockingTest {
+ val layoutDef = selectLayout(LayoutSelector.Type.Text, Modifier)
+ val providedViews = RemoteViews(context.packageName, layoutDef.layoutId).also {
+ it.setTextViewText(R.id.glanceView, "Android Remote Views")
+ }
+
+ val result = runAndTranslate {
+ Box {
+ AndroidRemoteViews(providedViews)
+ }
+ }
+
+ val rootLayout = assertIs<ViewGroup>(context.applyRemoteViews(result))
+ val actual = assertIs<TextView>(rootLayout.children.single())
+ assertThat(actual.text).isEqualTo("Android Remote Views")
+ }
+
+ @Test
+ fun canTranslateAndroidRemoteViews_Container() = fakeCoroutineScope.runBlockingTest {
+ val result = runAndTranslate {
+ val providedViews = RemoteViews(context.packageName, R.layout.raw_container)
+ AndroidRemoteViews(
+ providedViews,
+ R.id.raw_container_view
+ ) {
+ Text("inner text 1")
+ Text("inner text 2")
+ }
+ }
+
+ val rootLayout = assertIs<LinearLayout>(context.applyRemoteViews(result))
+ assertThat(rootLayout.orientation).isEqualTo(LinearLayout.VERTICAL)
+ assertThat(rootLayout.childCount).isEqualTo(2)
+ val child1 = assertIs<TextView>(rootLayout.getChildAt(0))
+ assertThat(child1.text.toString()).isEqualTo("inner text 1")
+ val child2 = assertIs<TextView>(rootLayout.getChildAt(1))
+ assertThat(child2.text.toString()).isEqualTo("inner text 2")
+ }
+
+ @Test
+ fun canTranslateAndroidRemoteViews_Container_BadSetupShouldFail() =
+ fakeCoroutineScope.runBlockingTest {
+ assertFailsWith<IllegalStateException> {
+ runAndTranslate {
+ val providedViews = RemoteViews(context.packageName, R.layout.raw_container)
+ AndroidRemoteViews(providedViews, View.NO_ID) {
+ Text("inner text 1")
+ Text("inner text 2")
+ }
+ }
+ }
+ }
+
+ @Test
+ @Config(maxSdk = 30)
+ fun canTranslateCheckbox_pre31_unchecked() = fakeCoroutineScope.runBlockingTest {
+ val rv = runAndTranslate {
+ CheckBox(
+ checked = false,
+ text = "test",
+ textStyle = TextStyle(textDecoration = TextDecoration.Underline),
+ )
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<ViewGroup>(view)
+ val iconView = view.findViewById<ImageView>(R.id.checkBoxIcon)
+ assertThat(iconView.isEnabled).isFalse()
+
+ val textView = view.findViewById<TextView>(R.id.checkBoxText)
+ val textContent = assertIs<SpannedString>(textView.text)
+ assertThat(textContent.toString()).isEqualTo("test")
+ assertThat(textContent.getSpans(0, textContent.length, Any::class.java)).hasLength(1)
+ textContent.checkHasSingleTypedSpan<UnderlineSpan> { }
+ }
+
+ @Test
+ @Config(maxSdk = 30)
+ fun canTranslateCheckbox_pre31_checked() = fakeCoroutineScope.runBlockingTest {
+ val rv = runAndTranslate {
+ CheckBox(
+ checked = true,
+ text = "test checked",
+ textStyle = TextStyle(textDecoration = TextDecoration.LineThrough),
+ )
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<ViewGroup>(view)
+ val iconView = view.findViewById<ImageView>(R.id.checkBoxIcon)
+ assertThat(iconView.isEnabled).isTrue()
+
+ val textView = view.findViewById<TextView>(R.id.checkBoxText)
+ val textContent = assertIs<SpannedString>(textView.text)
+ assertThat(textContent.toString()).isEqualTo("test checked")
+ assertThat(textContent.getSpans(0, textContent.length, Any::class.java)).hasLength(1)
+ textContent.checkHasSingleTypedSpan<StrikethroughSpan> { }
+ }
+
// Check there is a single span, that it's of the correct type and passes the [check].
private inline fun <reified T> SpannedString.checkSingleSpan(check: (T) -> Unit) {
val spans = getSpans(0, length, Any::class.java)
@@ -703,22 +701,5 @@
return translateComposition(context, appWidgetId, root)
}
- private suspend fun runAndTranslateInRtl(
- appWidgetId: Int = 0,
- content: @Composable () -> Unit
- ): RemoteViews {
- val rtlLocale = Locale.getAvailableLocales().first {
- TextUtils.getLayoutDirectionFromLocale(it) == View.LAYOUT_DIRECTION_RTL
- }
- val rtlContext = context.createConfigurationContext(
- Configuration(context.resources.configuration).also {
- it.setLayoutDirection(rtlLocale)
- }
- )
- return runAndTranslate(rtlContext, appWidgetId, content = content)
- }
-
private fun Dp.toPixels() = toPixels(displayMetrics)
- private fun Sp.toPixels() =
- TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value, displayMetrics).toInt()
}
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/Utils.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
similarity index 67%
rename from glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/Utils.kt
rename to glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
index 71fbbe4..80e2d0f 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/Utils.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/TestUtils.kt
@@ -18,7 +18,11 @@
import android.appwidget.AppWidgetProviderInfo
import android.content.Context
+import android.content.res.Configuration
import android.os.Parcel
+import android.text.TextUtils
+import android.util.DisplayMetrics
+import android.util.TypedValue
import android.view.View
import android.widget.FrameLayout
import android.widget.RemoteViews
@@ -27,12 +31,12 @@
import androidx.compose.runtime.Composition
import androidx.compose.runtime.Recomposer
import androidx.glance.Applier
-import androidx.glance.GlanceInternalApi
+import androidx.glance.unit.Sp
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.launch
+import java.util.Locale
-@OptIn(GlanceInternalApi::class)
internal suspend fun runTestingComposition(content: @Composable () -> Unit): RemoteViewsRoot =
coroutineScope {
val root = RemoteViewsRoot(10)
@@ -64,7 +68,33 @@
}
}
+internal suspend fun Context.runAndTranslate(
+ appWidgetId: Int = 0,
+ content: @Composable () -> Unit
+): RemoteViews {
+ val root = runTestingComposition(content)
+ return translateComposition(this, appWidgetId, root)
+}
+
+internal suspend fun Context.runAndTranslateInRtl(
+ appWidgetId: Int = 0,
+ content: @Composable () -> Unit
+): RemoteViews {
+ val rtlLocale = Locale.getAvailableLocales().first {
+ TextUtils.getLayoutDirectionFromLocale(it) == View.LAYOUT_DIRECTION_RTL
+ }
+ val rtlContext = createConfigurationContext(
+ Configuration(resources.configuration).also {
+ it.setLayoutDirection(rtlLocale)
+ }
+ )
+ return rtlContext.runAndTranslate(appWidgetId, content = content)
+}
+
internal fun appWidgetProviderInfo(
builder: AppWidgetProviderInfo.() -> Unit
): AppWidgetProviderInfo =
AppWidgetProviderInfo().apply(builder)
+
+internal fun Sp.toPixels(displayMetrics: DisplayMetrics) =
+ TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, value, displayMetrics).toInt()
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/layout/LazyColumnTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/layout/LazyColumnTest.kt
index 54c3564..5df631c 100644
--- a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/layout/LazyColumnTest.kt
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/layout/LazyColumnTest.kt
@@ -16,7 +16,6 @@
package androidx.glance.appwidget.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.appwidget.runTestingComposition
import androidx.glance.layout.EmittableRow
import androidx.glance.layout.EmittableText
@@ -30,7 +29,7 @@
import org.junit.Test
import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class LazyColumnTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -62,14 +61,10 @@
val column = assertIs<EmittableLazyColumn>(root.children.single())
val listItems = assertAre<EmittableLazyListItem>(column.children)
assertThat(listItems).hasSize(4)
- val text0 = assertIs<EmittableText>(listItems[0].children.first())
- assertThat(text0.text).isEqualTo("Item 0")
- val text1 = assertIs<EmittableText>(listItems[1].children.first())
- assertThat(text1.text).isEqualTo("Item 1")
- val text2 = assertIs<EmittableText>(listItems[2].children.first())
- assertThat(text2.text).isEqualTo("Item 2")
- val text3 = assertIs<EmittableText>(listItems[3].children.first())
- assertThat(text3.text).isEqualTo("Item 3")
+ assertThat(column.getTextAtChild(0)).isEqualTo("Item 0")
+ assertThat(column.getTextAtChild(1)).isEqualTo("Item 1")
+ assertThat(column.getTextAtChild(2)).isEqualTo("Item 2")
+ assertThat(column.getTextAtChild(3)).isEqualTo("Item 3")
}
@Test
@@ -143,6 +138,116 @@
assertThat(listItems[2].itemId).isEqualTo(ReservedItemIdRangeEnd - 1)
assertThat(listItems[3].itemId).isEqualTo(6L)
}
+
+ @Test
+ fun items_listItemsWithoutItemIds_addsChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ LazyColumn {
+ items(people) { person ->
+ Text(person.name)
+ }
+ }
+ }
+
+ val column = assertIs<EmittableLazyColumn>(root.children.single())
+ val listItems = assertAre<EmittableLazyListItem>(column.children)
+ assertThat(listItems[0].itemId).isEqualTo(ReservedItemIdRangeEnd)
+ assertThat(listItems[1].itemId).isEqualTo(ReservedItemIdRangeEnd - 1)
+ assertThat(column.getTextAtChild(0)).isEqualTo("Alice")
+ assertThat(column.getTextAtChild(1)).isEqualTo("Bob")
+ }
+
+ @Test
+ fun items_listItemsWithItemIds_addsChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ LazyColumn {
+ items(people, itemId = { person -> person.userId }) { person ->
+ Text(person.name)
+ }
+ }
+ }
+
+ val column = assertIs<EmittableLazyColumn>(root.children.single())
+ val listItems = assertAre<EmittableLazyListItem>(column.children)
+ assertThat(listItems[0].itemId).isEqualTo(101)
+ assertThat(listItems[1].itemId).isEqualTo(202)
+ assertThat(column.getTextAtChild(0)).isEqualTo("Alice")
+ assertThat(column.getTextAtChild(1)).isEqualTo("Bob")
+ }
+
+ @Test
+ fun itemsIndexed_listItems_addsChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ LazyColumn {
+ itemsIndexed(people) { index, person ->
+ Text("${index + 1} - ${person.name}")
+ }
+ }
+ }
+
+ val column = assertIs<EmittableLazyColumn>(root.children.single())
+ assertThat(column.getTextAtChild(0)).isEqualTo("1 - Alice")
+ assertThat(column.getTextAtChild(1)).isEqualTo("2 - Bob")
+ }
+
+ @Test
+ fun items_arrayItemsWithoutItemIds_addsChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ LazyColumn {
+ items(people.toTypedArray()) { person ->
+ Text(person.name)
+ }
+ }
+ }
+
+ val column = assertIs<EmittableLazyColumn>(root.children.single())
+ val listItems = assertAre<EmittableLazyListItem>(column.children)
+ assertThat(listItems[0].itemId).isEqualTo(ReservedItemIdRangeEnd)
+ assertThat(listItems[1].itemId).isEqualTo(ReservedItemIdRangeEnd - 1)
+ assertThat(column.getTextAtChild(0)).isEqualTo("Alice")
+ assertThat(column.getTextAtChild(1)).isEqualTo("Bob")
+ }
+
+ @Test
+ fun items_arrayItemsWithItemIds_addsChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ LazyColumn {
+ items(people.toTypedArray(), itemId = { person -> person.userId }) { person ->
+ Text(person.name)
+ }
+ }
+ }
+
+ val column = assertIs<EmittableLazyColumn>(root.children.single())
+ val listItems = assertAre<EmittableLazyListItem>(column.children)
+ assertThat(listItems[0].itemId).isEqualTo(101)
+ assertThat(listItems[1].itemId).isEqualTo(202)
+ assertThat(column.getTextAtChild(0)).isEqualTo("Alice")
+ assertThat(column.getTextAtChild(1)).isEqualTo("Bob")
+ }
+
+ @Test
+ fun itemsIndexed_arrayItems_addsChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ LazyColumn {
+ itemsIndexed(people.toTypedArray()) { index, person ->
+ Text("${index + 1} - ${person.name}")
+ }
+ }
+ }
+
+ val column = assertIs<EmittableLazyColumn>(root.children.single())
+ assertThat(column.getTextAtChild(0)).isEqualTo("1 - Alice")
+ assertThat(column.getTextAtChild(1)).isEqualTo("2 - Bob")
+ }
+
+ private fun EmittableLazyColumn.getTextAtChild(index: Int): String =
+ assertIs<EmittableText>((children[index] as EmittableLazyListItem).children.first()).text
+
+ private companion object {
+ data class Person(val name: String, val userId: Long)
+ val people = listOf(Person("Alice", userId = 101), Person("Bob", userId = 202))
+ }
}
private inline fun <reified T> assertAre(items: Iterable<Any>) =
diff --git a/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt
new file mode 100644
index 0000000..ffcbd93
--- /dev/null
+++ b/glance/glance-appwidget/src/test/kotlin/androidx/glance/appwidget/translators/TextTranslatorTest.kt
@@ -0,0 +1,294 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.appwidget.translators
+
+import android.content.Context
+import android.graphics.Typeface
+import android.os.Build
+import android.text.Layout
+import android.text.SpannedString
+import android.text.style.AlignmentSpan
+import android.text.style.StrikethroughSpan
+import android.text.style.StyleSpan
+import android.text.style.TextAppearanceSpan
+import android.text.style.UnderlineSpan
+import android.view.Gravity
+import android.widget.LinearLayout
+import android.widget.TextView
+import androidx.glance.Modifier
+import androidx.glance.appwidget.applyRemoteViews
+import androidx.glance.appwidget.runAndTranslate
+import androidx.glance.appwidget.runAndTranslateInRtl
+import androidx.glance.appwidget.toPixels
+import androidx.glance.layout.Column
+import androidx.glance.layout.Text
+import androidx.glance.layout.fillMaxWidth
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextAlign
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
+import androidx.glance.unit.sp
+import androidx.test.core.app.ApplicationProvider
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.test.TestCoroutineScope
+import kotlinx.coroutines.test.runBlockingTest
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.annotation.Config
+import kotlin.test.assertIs
+
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(RobolectricTestRunner::class)
+class TextTranslatorTest {
+
+ private lateinit var fakeCoroutineScope: TestCoroutineScope
+ private val context = ApplicationProvider.getApplicationContext<Context>()
+ private val displayMetrics = context.resources.displayMetrics
+
+ @Before
+ fun setUp() {
+ fakeCoroutineScope = TestCoroutineScope()
+ }
+
+ @Test
+ fun canTranslateText() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Text("test")
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<TextView>(view)
+ assertThat(view.text.toString()).isEqualTo("test")
+ }
+
+ @Test
+ @Config(sdk = [23, 29])
+ fun canTranslateText_withStyleWeightAndSize() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Text(
+ "test",
+ style = TextStyle(fontWeight = FontWeight.Medium, fontSize = 12.sp),
+ )
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<TextView>(view)
+ assertThat(view.textSize).isEqualTo(12.sp.toPixels(displayMetrics))
+ val content = view.text as SpannedString
+ assertThat(content.toString()).isEqualTo("test")
+ content.checkSingleSpan<TextAppearanceSpan> {
+ if (Build.VERSION.SDK_INT >= 29) {
+ assertThat(it.textFontWeight).isEqualTo(FontWeight.Medium.value)
+ // Note: textStyle is always set, but to NORMAL if unspecified
+ assertThat(it.textStyle).isEqualTo(Typeface.NORMAL)
+ } else {
+ assertThat(it.textStyle).isEqualTo(Typeface.BOLD)
+ }
+ }
+ }
+
+ @Test
+ fun canTranslateText_withStyleStrikeThrough() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Text("test", style = TextStyle(textDecoration = TextDecoration.LineThrough))
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<TextView>(view)
+ val content = view.text as SpannedString
+ assertThat(content.toString()).isEqualTo("test")
+ content.checkSingleSpan<StrikethroughSpan> { }
+ }
+
+ @Test
+ fun canTranslateText_withStyleUnderline() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Text("test", style = TextStyle(textDecoration = TextDecoration.Underline))
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<TextView>(view)
+ val content = view.text as SpannedString
+ assertThat(content.toString()).isEqualTo("test")
+ content.checkSingleSpan<UnderlineSpan> { }
+ }
+
+ @Test
+ fun canTranslateText_withStyleItalic() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Text("test", style = TextStyle(fontStyle = FontStyle.Italic))
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<TextView>(view)
+ val content = view.text as SpannedString
+ assertThat(content.toString()).isEqualTo("test")
+ content.checkSingleSpan<StyleSpan> {
+ assertThat(it.style).isEqualTo(Typeface.ITALIC)
+ }
+ }
+
+ @Test
+ @Config(sdk = [23, 29])
+ fun canTranslateText_withComplexStyle() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Text(
+ "test",
+ style = TextStyle(
+ textDecoration = TextDecoration.Underline + TextDecoration.LineThrough,
+ fontStyle = FontStyle.Italic,
+ fontWeight = FontWeight.Bold,
+ ),
+ )
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<TextView>(view)
+ val content = view.text as SpannedString
+ assertThat(content.toString()).isEqualTo("test")
+ assertThat(content.getSpans(0, content.length, Any::class.java)).hasLength(4)
+ content.checkHasSingleTypedSpan<UnderlineSpan> { }
+ content.checkHasSingleTypedSpan<StrikethroughSpan> { }
+ content.checkHasSingleTypedSpan<StyleSpan> {
+ assertThat(it.style).isEqualTo(Typeface.ITALIC)
+ }
+ content.checkHasSingleTypedSpan<TextAppearanceSpan> {
+ if (Build.VERSION.SDK_INT >= 29) {
+ assertThat(it.textFontWeight).isEqualTo(FontWeight.Bold.value)
+ // Note: textStyle is always set, but to NORMAL if unspecified
+ assertThat(it.textStyle).isEqualTo(Typeface.NORMAL)
+ } else {
+ assertThat(it.textStyle).isEqualTo(Typeface.BOLD)
+ }
+ }
+ }
+
+ @Test
+ fun canTranslateText_withAlignments() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslate {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Center", style = TextStyle(textAlign = TextAlign.Center))
+ Text("Left", style = TextStyle(textAlign = TextAlign.Left))
+ Text("Right", style = TextStyle(textAlign = TextAlign.Right))
+ Text("Start", style = TextStyle(textAlign = TextAlign.Start))
+ Text("End", style = TextStyle(textAlign = TextAlign.End))
+ }
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<LinearLayout>(view)
+ assertThat(view.childCount).isEqualTo(5)
+ val center = assertIs<TextView>(view.getChildAt(0))
+ val left = assertIs<TextView>(view.getChildAt(1))
+ val right = assertIs<TextView>(view.getChildAt(2))
+ val start = assertIs<TextView>(view.getChildAt(3))
+ val end = assertIs<TextView>(view.getChildAt(4))
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ assertThat(center.gravity).isEqualTo(Gravity.CENTER)
+ assertThat(left.gravity).isEqualTo(Gravity.LEFT)
+ assertThat(right.gravity).isEqualTo(Gravity.RIGHT)
+ assertThat(start.gravity).isEqualTo(Gravity.START)
+ assertThat(end.gravity).isEqualTo(Gravity.END)
+ } else {
+ assertIs<SpannedString>(center.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_CENTER)
+ }
+ assertIs<SpannedString>(left.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_NORMAL)
+ }
+ assertIs<SpannedString>(right.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_OPPOSITE)
+ }
+ assertIs<SpannedString>(start.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_NORMAL)
+ }
+ assertIs<SpannedString>(end.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_OPPOSITE)
+ }
+ }
+ }
+
+ @Test
+ fun canTranslateText_withAlignmentsInRtl() = fakeCoroutineScope.runBlockingTest {
+ val rv = context.runAndTranslateInRtl {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Center", style = TextStyle(textAlign = TextAlign.Center))
+ Text("Left", style = TextStyle(textAlign = TextAlign.Left))
+ Text("Right", style = TextStyle(textAlign = TextAlign.Right))
+ Text("Start", style = TextStyle(textAlign = TextAlign.Start))
+ Text("End", style = TextStyle(textAlign = TextAlign.End))
+ }
+ }
+ val view = context.applyRemoteViews(rv)
+
+ assertIs<LinearLayout>(view)
+ assertThat(view.childCount).isEqualTo(5)
+ val center = assertIs<TextView>(view.getChildAt(0))
+ val left = assertIs<TextView>(view.getChildAt(1))
+ val right = assertIs<TextView>(view.getChildAt(2))
+ val start = assertIs<TextView>(view.getChildAt(3))
+ val end = assertIs<TextView>(view.getChildAt(4))
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ assertThat(center.gravity).isEqualTo(Gravity.CENTER)
+ assertThat(left.gravity).isEqualTo(Gravity.LEFT)
+ assertThat(right.gravity).isEqualTo(Gravity.RIGHT)
+ assertThat(start.gravity).isEqualTo(Gravity.START)
+ assertThat(end.gravity).isEqualTo(Gravity.END)
+ } else {
+ assertIs<SpannedString>(center.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_CENTER)
+ }
+ assertIs<SpannedString>(left.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_OPPOSITE)
+ }
+ assertIs<SpannedString>(right.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_NORMAL)
+ }
+ assertIs<SpannedString>(start.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_NORMAL)
+ }
+ assertIs<SpannedString>(end.text).checkSingleSpan<AlignmentSpan.Standard> {
+ assertThat(it.alignment).isEqualTo(Layout.Alignment.ALIGN_OPPOSITE)
+ }
+ }
+ }
+
+ // Check there is a single span, that it's of the correct type and passes the [check].
+ private inline fun <reified T> SpannedString.checkSingleSpan(check: (T) -> Unit) {
+ val spans = getSpans(0, length, Any::class.java)
+ assertThat(spans).hasLength(1)
+ checkInstance(spans[0], check)
+ }
+
+ // Check there is a single span of the given type and that it passes the [check].
+ private inline fun <reified T> SpannedString.checkHasSingleTypedSpan(check: (T) -> Unit) {
+ val spans = getSpans(0, length, T::class.java)
+ assertThat(spans).hasLength(1)
+ check(spans[0])
+ }
+
+ private inline fun <reified T> checkInstance(obj: Any, check: (T) -> Unit) {
+ assertIs<T>(obj)
+ check(obj)
+ }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml b/glance/glance-appwidget/src/test/res/layout/raw_container.xml
similarity index 79%
copy from glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
copy to glance/glance-appwidget/src/test/res/layout/raw_container.xml
index 8e05759..a1b10b6 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
+++ b/glance/glance-appwidget/src/test/res/layout/raw_container.xml
@@ -15,7 +15,9 @@
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
\ No newline at end of file
+ android:orientation="vertical"
+ android:id="@+id/raw_container_view"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+</LinearLayout>
\ No newline at end of file
diff --git a/glance/glance-wear/api/current.txt b/glance/glance-wear/api/current.txt
index a371ff1..635fc5a 100644
--- a/glance/glance-wear/api/current.txt
+++ b/glance/glance-wear/api/current.txt
@@ -29,17 +29,31 @@
property public final int Start;
}
+ public final class AndroidLayoutElementKt {
+ method @androidx.compose.runtime.Composable public static void AndroidLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement layoutElement);
+ }
+
public final class BackgroundKt {
method public static androidx.glance.Modifier background(androidx.glance.Modifier, int color);
}
public final class CurvedRowKt {
- method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchor, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
}
public final class CurvedRowScope {
ctor public CurvedRowScope();
- method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.layout.TextStyle? textStyle);
+ method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
+ }
+
+ @androidx.compose.runtime.Immutable public final class CurvedTextStyle {
+ ctor public CurvedTextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
+ method public androidx.glance.unit.Sp? getFontSize();
+ method public androidx.glance.text.FontStyle? getFontStyle();
+ method public androidx.glance.text.FontWeight? getFontWeight();
+ property public final androidx.glance.unit.Sp? fontSize;
+ property public final androidx.glance.text.FontStyle? fontStyle;
+ property public final androidx.glance.text.FontWeight? fontWeight;
}
public final inline class RadialAlignment {
diff --git a/glance/glance-wear/api/public_plus_experimental_current.txt b/glance/glance-wear/api/public_plus_experimental_current.txt
index a371ff1..635fc5a 100644
--- a/glance/glance-wear/api/public_plus_experimental_current.txt
+++ b/glance/glance-wear/api/public_plus_experimental_current.txt
@@ -29,17 +29,31 @@
property public final int Start;
}
+ public final class AndroidLayoutElementKt {
+ method @androidx.compose.runtime.Composable public static void AndroidLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement layoutElement);
+ }
+
public final class BackgroundKt {
method public static androidx.glance.Modifier background(androidx.glance.Modifier, int color);
}
public final class CurvedRowKt {
- method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchor, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
}
public final class CurvedRowScope {
ctor public CurvedRowScope();
- method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.layout.TextStyle? textStyle);
+ method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
+ }
+
+ @androidx.compose.runtime.Immutable public final class CurvedTextStyle {
+ ctor public CurvedTextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
+ method public androidx.glance.unit.Sp? getFontSize();
+ method public androidx.glance.text.FontStyle? getFontStyle();
+ method public androidx.glance.text.FontWeight? getFontWeight();
+ property public final androidx.glance.unit.Sp? fontSize;
+ property public final androidx.glance.text.FontStyle? fontStyle;
+ property public final androidx.glance.text.FontWeight? fontWeight;
}
public final inline class RadialAlignment {
diff --git a/glance/glance-wear/api/restricted_current.txt b/glance/glance-wear/api/restricted_current.txt
index a371ff1..635fc5a 100644
--- a/glance/glance-wear/api/restricted_current.txt
+++ b/glance/glance-wear/api/restricted_current.txt
@@ -29,17 +29,31 @@
property public final int Start;
}
+ public final class AndroidLayoutElementKt {
+ method @androidx.compose.runtime.Composable public static void AndroidLayoutElement(androidx.wear.tiles.LayoutElementBuilders.LayoutElement layoutElement);
+ }
+
public final class BackgroundKt {
method public static androidx.glance.Modifier background(androidx.glance.Modifier, int color);
}
public final class CurvedRowKt {
- method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchor, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void CurvedRow(optional androidx.glance.Modifier modifier, optional float anchorDegrees, optional int anchorType, optional int radialAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.wear.layout.CurvedRowScope,kotlin.Unit> content);
}
public final class CurvedRowScope {
ctor public CurvedRowScope();
- method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.layout.TextStyle? textStyle);
+ method @androidx.compose.runtime.Composable public void CurvedText(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.wear.layout.CurvedTextStyle? textStyle);
+ }
+
+ @androidx.compose.runtime.Immutable public final class CurvedTextStyle {
+ ctor public CurvedTextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle);
+ method public androidx.glance.unit.Sp? getFontSize();
+ method public androidx.glance.text.FontStyle? getFontStyle();
+ method public androidx.glance.text.FontWeight? getFontWeight();
+ property public final androidx.glance.unit.Sp? fontSize;
+ property public final androidx.glance.text.FontStyle? fontStyle;
+ property public final androidx.glance.text.FontWeight? fontWeight;
}
public final inline class RadialAlignment {
diff --git a/glance/glance-wear/build.gradle b/glance/glance-wear/build.gradle
index dbb2474..fe43be7 100644
--- a/glance/glance-wear/build.gradle
+++ b/glance/glance-wear/build.gradle
@@ -42,12 +42,15 @@
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.3.1"
implementation "androidx.lifecycle:lifecycle-service:2.3.1"
+ testImplementation(libs.testCore)
testImplementation(libs.testRules)
testImplementation(libs.testRunner)
testImplementation(libs.truth)
testImplementation(libs.junit)
+ testImplementation(libs.kotlinTest)
testImplementation(libs.kotlinCoroutinesTest)
testImplementation(libs.robolectric)
+ testImplementation(libs.kotlinReflect)
// TODO(b/197638718): Remove when tiles-testing dependencies are fixed.
testImplementation(project(":wear:tiles:tiles-renderer"))
testImplementation(project(":wear:tiles:tiles-testing"))
@@ -59,6 +62,7 @@
androidTestImplementation(libs.testCore)
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.testRules)
+ androidTestImplementation(libs.kotlinTest)
androidTestImplementation(libs.kotlinCoroutinesTest)
// I'm not 100% sure why, but androidTestImplementation doesn't appear to use the standard
diff --git a/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt b/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt
index 41c9c3a..8bdd63a 100644
--- a/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt
+++ b/glance/glance-wear/src/androidAndroidTest/kotlin/androidx/glance/wear/ScreenshotTests.kt
@@ -27,26 +27,26 @@
import androidx.compose.runtime.Recomposer
import androidx.core.content.ContextCompat
import androidx.glance.Applier
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.layout.Alignment
import androidx.glance.layout.Box
import androidx.glance.layout.Column
import androidx.glance.layout.EmittableBox
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
import androidx.glance.layout.Row
import androidx.glance.layout.Text
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
-import androidx.glance.layout.expandHeight
-import androidx.glance.layout.expandWidth
+import androidx.glance.layout.fillMaxHeight
+import androidx.glance.layout.fillMaxWidth
import androidx.glance.layout.size
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.glance.unit.Color
import androidx.glance.unit.dp
import androidx.glance.unit.sp
import androidx.glance.wear.layout.AnchorType
import androidx.glance.wear.layout.CurvedRow
+import androidx.glance.wear.layout.CurvedTextStyle
import androidx.glance.wear.layout.RadialAlignment
import androidx.glance.wear.layout.background
import androidx.test.core.app.ApplicationProvider.getApplicationContext
@@ -65,7 +65,7 @@
import org.junit.Rule
import org.junit.Test
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class ScreenshotTests {
@get:Rule
var screenshotRule = AndroidXScreenshotTestRule("glance/glance-wear")
@@ -127,11 +127,11 @@
CurvedRow(
modifier = Modifier.background(Color.Blue),
radialAlignment = RadialAlignment.Center,
- anchor = -90f,
+ anchorDegrees = -90f,
anchorType = AnchorType.Center
) {
CurvedText(text = "Hello World")
- CurvedText(text = "This is a test!", textStyle = TextStyle(size = 24.sp))
+ CurvedText(text = "This is a test!", textStyle = CurvedTextStyle(fontSize = 24.sp))
}
}
@@ -148,7 +148,7 @@
private suspend fun runComposition(content: @Composable () -> Unit) = coroutineScope {
val root = EmittableBox()
- root.modifier = Modifier.expandWidth().expandHeight()
+ root.modifier = Modifier.fillMaxWidth().fillMaxHeight()
root.contentAlignment = Alignment.Center
val applier = Applier(root)
@@ -172,7 +172,7 @@
) = fakeCoroutineScope.runBlockingTest {
val context = getApplicationContext<Context>()
val composition = runComposition(content)
- val translatedComposition = translateComposition(composition)
+ val translatedComposition = translateComposition(context, composition)
val renderer = TileRenderer(
context,
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/GlanceTileService.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/GlanceTileService.kt
index e5c0a38..958d543 100644
--- a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/GlanceTileService.kt
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/GlanceTileService.kt
@@ -24,7 +24,6 @@
import androidx.compose.runtime.Composition
import androidx.compose.runtime.Recomposer
import androidx.glance.Applier
-import androidx.glance.GlanceInternalApi
import androidx.glance.layout.EmittableBox
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
@@ -64,7 +63,6 @@
* `com.google.android.wearable.permission.BIND_TILE_PROVIDER`.
*/
-@OptIn(GlanceInternalApi::class)
public abstract class GlanceTileService : TileService() {
private val lifecycleOwner = object : LifecycleOwner {
val localLifecycle = LifecycleRegistry(this)
@@ -111,7 +109,7 @@
recomposer.close()
recomposer.join()
- translateComposition(root)
+ translateComposition(this@GlanceTileService, root)
}
/** Implement with the layout to use in your Tile. */
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt
index a66d987..a83e26c 100644
--- a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/WearCompositionTranslator.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -17,9 +16,11 @@
package androidx.glance.wear
+import android.content.Context
import androidx.glance.Emittable
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
+import androidx.glance.action.ActionModifier
+import androidx.glance.action.LaunchActivityAction
import androidx.glance.findModifier
import androidx.glance.layout.Alignment
import androidx.glance.layout.Dimension
@@ -27,18 +28,21 @@
import androidx.glance.layout.EmittableColumn
import androidx.glance.layout.EmittableRow
import androidx.glance.layout.EmittableText
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
import androidx.glance.layout.HeightModifier
import androidx.glance.layout.PaddingModifier
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
import androidx.glance.layout.WidthModifier
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.glance.wear.layout.AnchorType
import androidx.glance.wear.layout.BackgroundModifier
+import androidx.glance.wear.layout.CurvedTextStyle
+import androidx.glance.wear.layout.EmittableAndroidLayoutElement
import androidx.glance.wear.layout.EmittableCurvedRow
import androidx.glance.wear.layout.EmittableCurvedText
import androidx.glance.wear.layout.RadialAlignment
+import androidx.wear.tiles.ActionBuilders
import androidx.wear.tiles.ColorBuilders.argb
import androidx.wear.tiles.DimensionBuilders
import androidx.wear.tiles.DimensionBuilders.degrees
@@ -96,10 +100,34 @@
.setColor(argb(this.color.value.toInt()))
.build()
+private fun LaunchActivityAction.toProto(context: Context): ActionBuilders.LaunchAction =
+ ActionBuilders.LaunchAction.Builder()
+ .setAndroidActivity(
+ ActionBuilders.AndroidActivity.Builder()
+ .setPackageName(context.packageName)
+ .setClassName(this.activityClass.name)
+ .build()
+ )
+ .build()
+
+private fun ActionModifier.toProto(context: Context): ModifiersBuilders.Clickable {
+ val builder = ModifiersBuilders.Clickable.Builder()
+
+ val onClick = when (val action = this.action) {
+ is LaunchActivityAction -> action.toProto(context)
+ else -> throw IllegalArgumentException("Unknown Action $this")
+ }
+
+ builder.setOnClick(onClick)
+
+ return builder.build()
+}
+
private fun Dimension.toContainerDimension(): DimensionBuilders.ContainerDimension =
when (this) {
is Dimension.Wrap -> wrap()
is Dimension.Expand -> expand()
+ is Dimension.Fill -> expand()
is Dimension.Dp -> dp(this.dp.value)
}
@@ -129,23 +157,31 @@
default: Dimension = Dimension.Wrap
): Dimension = findModifier<HeightModifier>()?.height ?: default
-private fun translateEmittableBox(element: EmittableBox) = LayoutElementBuilders.Box.Builder()
+private fun translateEmittableBox(
+ context: Context,
+ element: EmittableBox
+) = LayoutElementBuilders.Box.Builder()
.setVerticalAlignment(element.contentAlignment.vertical.toProto())
.setHorizontalAlignment(element.contentAlignment.horizontal.toProto())
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.setWidth(element.modifier.getWidth().toContainerDimension())
.setHeight(element.modifier.getHeight().toContainerDimension())
- .also { box -> element.children.forEach { box.addContent(translateComposition(it)) } }
+ .also { box -> element.children.forEach { box.addContent(translateComposition(context, it)) } }
.build()
-private fun translateEmittableRow(element: EmittableRow): LayoutElementBuilders.LayoutElement {
+private fun translateEmittableRow(
+ context: Context,
+ element: EmittableRow
+): LayoutElementBuilders.LayoutElement {
val width = element.modifier.getWidth()
val height = element.modifier.getHeight()
val baseRowBuilder = LayoutElementBuilders.Row.Builder()
.setHeight(height.toContainerDimension())
.setVerticalAlignment(element.verticalAlignment.toProto())
- .also { row -> element.children.forEach { row.addContent(translateComposition(it)) } }
+ .also { row ->
+ element.children.forEach { row.addContent(translateComposition(context, it)) }
+ }
// Do we need to wrap it in a column to set the horizontal alignment?
return if (element.horizontalAlignment != Alignment.Horizontal.Start &&
@@ -153,20 +189,21 @@
) {
LayoutElementBuilders.Column.Builder()
.setHorizontalAlignment(element.horizontalAlignment.toProto())
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.setWidth(width.toContainerDimension())
.setHeight(height.toContainerDimension())
.addContent(baseRowBuilder.setWidth(wrap()).build())
.build()
} else {
baseRowBuilder
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.setWidth(width.toContainerDimension())
.build()
}
}
private fun translateEmittableColumn(
+ context: Context,
element: EmittableColumn
): LayoutElementBuilders.LayoutElement {
val width = element.modifier.getWidth()
@@ -175,7 +212,9 @@
val baseColumnBuilder = LayoutElementBuilders.Column.Builder()
.setWidth(width.toContainerDimension())
.setHorizontalAlignment(element.horizontalAlignment.toProto())
- .also { column -> element.children.forEach { column.addContent(translateComposition(it)) } }
+ .also { column ->
+ element.children.forEach { column.addContent(translateComposition(context, it)) }
+ }
// Do we need to wrap it in a row to set the vertical alignment?
return if (element.verticalAlignment != Alignment.Vertical.Top &&
@@ -183,14 +222,14 @@
) {
LayoutElementBuilders.Row.Builder()
.setVerticalAlignment(element.verticalAlignment.toProto())
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.setWidth(width.toContainerDimension())
.setHeight(height.toContainerDimension())
.addContent(baseColumnBuilder.setHeight(wrap()).build())
.build()
} else {
baseColumnBuilder
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.setHeight(height.toContainerDimension())
.build()
}
@@ -199,7 +238,7 @@
private fun translateTextStyle(style: TextStyle): LayoutElementBuilders.FontStyle {
val fontStyleBuilder = LayoutElementBuilders.FontStyle.Builder()
- style.size?.let { fontStyleBuilder.setSize(sp(it.value)) }
+ style.fontSize?.let { fontStyleBuilder.setSize(sp(it.value)) }
style.fontStyle?.let { fontStyleBuilder.setItalic(it == FontStyle.Italic) }
style.fontWeight?.let {
fontStyleBuilder.setWeight(
@@ -218,7 +257,29 @@
return fontStyleBuilder.build()
}
-private fun translateEmittableText(element: EmittableText): LayoutElementBuilders.LayoutElement {
+private fun translateTextStyle(style: CurvedTextStyle): LayoutElementBuilders.FontStyle {
+ val fontStyleBuilder = LayoutElementBuilders.FontStyle.Builder()
+
+ style.fontSize?.let { fontStyleBuilder.setSize(sp(it.value)) }
+ style.fontStyle?.let { fontStyleBuilder.setItalic(it == FontStyle.Italic) }
+ style.fontWeight?.let {
+ fontStyleBuilder.setWeight(
+ when (it) {
+ FontWeight.Normal -> FONT_WEIGHT_NORMAL
+ FontWeight.Medium -> FONT_WEIGHT_MEDIUM
+ FontWeight.Bold -> FONT_WEIGHT_BOLD
+ else -> throw IllegalArgumentException("Unknown font weight $it")
+ }
+ )
+ }
+
+ return fontStyleBuilder.build()
+}
+
+private fun translateEmittableText(
+ context: Context,
+ element: EmittableText
+): LayoutElementBuilders.LayoutElement {
// Does it have a width or height set? If so, we need to wrap it in a Box.
val width = element.modifier.getWidth()
val height = element.modifier.getHeight()
@@ -232,15 +293,16 @@
LayoutElementBuilders.Box.Builder()
.setWidth(width.toContainerDimension())
.setHeight(height.toContainerDimension())
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.addContent(textBuilder.build())
.build()
} else {
- textBuilder.setModifiers(translateModifiers(element.modifier)).build()
+ textBuilder.setModifiers(translateModifiers(context, element.modifier)).build()
}
}
private fun translateEmittableCurvedRow(
+ context: Context,
element: EmittableCurvedRow
): LayoutElementBuilders.LayoutElement {
// Does it have a width or height set? If so, we need to wrap it in a Box.
@@ -250,23 +312,23 @@
// Note: Wear Tiles uses 0 degrees = 12 o clock, but Glance / Wear Compose use 0 degrees = 3
// o clock. Tiles supports wraparound etc though, so just add on the 90 degrees here.
val arcBuilder = LayoutElementBuilders.Arc.Builder()
- .setAnchorAngle(degrees(element.anchor + 90f))
+ .setAnchorAngle(degrees(element.anchorDegrees + 90f))
.setAnchorType(element.anchorType.toProto())
.setVerticalAlign(element.radialAlignment.toProto())
// Add all the children first...
- element.children.forEach { arcBuilder.addContent(translateCompositionInArc(it)) }
+ element.children.forEach { arcBuilder.addContent(translateCompositionInArc(context, it)) }
return if (width is Dimension.Dp || height is Dimension.Dp) {
LayoutElementBuilders.Box.Builder()
.setWidth(width.toContainerDimension())
.setHeight(height.toContainerDimension())
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.addContent(arcBuilder.build())
.build()
} else {
arcBuilder
- .setModifiers(translateModifiers(element.modifier))
+ .setModifiers(translateModifiers(context, element.modifier))
.build()
}
}
@@ -285,42 +347,57 @@
}
private fun translateEmittableElementInArc(
+ context: Context,
element: Emittable
): LayoutElementBuilders.ArcLayoutElement = LayoutElementBuilders.ArcAdapter.Builder()
- .setContent(translateComposition(element))
+ .setContent(translateComposition(context, element))
.build()
-private fun translateModifiers(modifier: Modifier): ModifiersBuilders.Modifiers = modifier
- .foldOut(ModifiersBuilders.Modifiers.Builder()) { element, builder ->
+private fun translateModifiers(
+ context: Context,
+ modifier: Modifier
+): ModifiersBuilders.Modifiers =
+ modifier.foldOut(ModifiersBuilders.Modifiers.Builder()) { element, builder ->
when (element) {
is PaddingModifier -> builder.setPadding(element.toProto())
is BackgroundModifier -> builder.setBackground(element.toProto())
is WidthModifier -> builder /* Skip for now, handled elsewhere. */
is HeightModifier -> builder /* Skip for now, handled elsewhere. */
+ is ActionModifier -> builder.setClickable(element.toProto(context))
else -> throw IllegalArgumentException("Unknown modifier type")
}
}.build()
-private fun translateCompositionInArc(element: Emittable): LayoutElementBuilders.ArcLayoutElement {
+private fun translateCompositionInArc(
+ context: Context,
+ element: Emittable
+): LayoutElementBuilders.ArcLayoutElement {
return when (element) {
is EmittableCurvedText -> translateEmittableCurvedText(element)
- else -> translateEmittableElementInArc(element)
+ else -> translateEmittableElementInArc(context, element)
}
}
+private fun translateEmittableAndroidLayoutElement(element: EmittableAndroidLayoutElement) =
+ element.layoutElement
+
/**
* Translates a Glance Composition to a Wear Tile.
*
* @throws IllegalArgumentException If the provided Emittable is not recognised (e.g. it is an
* element which this translator doesn't understand).
*/
-internal fun translateComposition(element: Emittable): LayoutElementBuilders.LayoutElement {
+internal fun translateComposition(
+ context: Context,
+ element: Emittable
+): LayoutElementBuilders.LayoutElement {
return when (element) {
- is EmittableBox -> translateEmittableBox(element)
- is EmittableRow -> translateEmittableRow(element)
- is EmittableColumn -> translateEmittableColumn(element)
- is EmittableText -> translateEmittableText(element)
- is EmittableCurvedRow -> translateEmittableCurvedRow(element)
+ is EmittableBox -> translateEmittableBox(context, element)
+ is EmittableRow -> translateEmittableRow(context, element)
+ is EmittableColumn -> translateEmittableColumn(context, element)
+ is EmittableText -> translateEmittableText(context, element)
+ is EmittableCurvedRow -> translateEmittableCurvedRow(context, element)
+ is EmittableAndroidLayoutElement -> translateEmittableAndroidLayoutElement(element)
else -> throw IllegalArgumentException("Unknown element $element")
}
}
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt
new file mode 100644
index 0000000..fb2567c
--- /dev/null
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/AndroidLayoutElement.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.wear.layout
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.ComposeNode
+import androidx.glance.Applier
+import androidx.glance.Emittable
+import androidx.glance.Modifier
+import androidx.wear.tiles.LayoutElementBuilders
+
+/**
+ * Add [LayoutElementBuilders.LayoutElement] into the glance composition.
+ *
+ * @param layoutElement the layout element to add to the composition
+ */
+@Composable
+fun AndroidLayoutElement(layoutElement: LayoutElementBuilders.LayoutElement) {
+ ComposeNode<EmittableAndroidLayoutElement, Applier>(
+ factory = ::EmittableAndroidLayoutElement,
+ update = {
+ this.set(layoutElement) { this.layoutElement = it }
+ },
+ )
+}
+
+internal class EmittableAndroidLayoutElement : Emittable {
+ override var modifier: Modifier = Modifier
+ lateinit var layoutElement: LayoutElementBuilders.LayoutElement
+
+ override fun toString() = "EmittableAndroidLayoutElement()"
+}
diff --git a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt
index 2407386..9cb7cf3 100644
--- a/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt
+++ b/glance/glance-wear/src/androidMain/kotlin/androidx/glance/wear/layout/CurvedRow.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -19,12 +18,15 @@
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ComposeNode
+import androidx.compose.runtime.Immutable
import androidx.glance.Applier
import androidx.glance.Emittable
import androidx.glance.EmittableWithChildren
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
-import androidx.glance.layout.TextStyle
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextStyle
+import androidx.glance.unit.Sp
/**
* The alignment of a [CurvedRow]'s elements, with respect to its anchor angle. This specifies how
@@ -101,7 +103,7 @@
internal class EmittableCurvedRow : EmittableWithChildren() {
override var modifier: Modifier = Modifier
- var anchor: Float = 270f
+ var anchorDegrees: Float = 270f
var anchorType: AnchorType = AnchorType.Center
var radialAlignment: RadialAlignment = RadialAlignment.Center
}
@@ -109,12 +111,12 @@
internal class EmittableCurvedText : Emittable {
override var modifier: Modifier = Modifier
var text: String = ""
- var textStyle: TextStyle? = null
+ var textStyle: CurvedTextStyle? = null
}
/**
* A curved container. This container will fill itself to a circle, which fits inside its parent
- * container, and all of its children will be placed on that circle. The parameters [anchor]
+ * container, and all of its children will be placed on that circle. The parameters [anchorDegrees]
* and [anchorType] can be used to specify where to draw children within this circle. Each
* child will then be placed, one after the other, clockwise around the circle.
*
@@ -123,12 +125,12 @@
* CurvedRow. Any other element will be drawn normally, at a tangent to the circle.
*
* @param modifier Modifiers for this container.
- * @param anchor The angle for the anchor in degrees, used with [anchorType] to determine
+ * @param anchorDegrees The angle for the anchor in degrees, used with [anchorType] to determine
* where to draw children. Note that 0 degrees is the 3 o'clock position on a device, and the
* angle sweeps clockwise. Values do not have to be clamped to the range 0-360; values less
* than 0 degrees will sweep anti-clockwise (i.e. -90 degrees is equivalent to 270 degrees),
* and values >360 will be be placed at X mod 360 degrees.
- * @param anchorType Alignment of the contents of this container relative to [anchor].
+ * @param anchorType Alignment of the contents of this container relative to [anchorDegrees].
* @param radialAlignment specifies where to lay down children that are thinner than the
* CurvedRow, either closer to the center (INNER), apart from the center (OUTER) or in the middle
* point (CENTER).
@@ -137,7 +139,7 @@
@Composable
public fun CurvedRow(
modifier: Modifier = Modifier,
- anchor: Float = 270f,
+ anchorDegrees: Float = 270f,
anchorType: AnchorType = AnchorType.Center,
radialAlignment: RadialAlignment = RadialAlignment.Center,
content: @Composable CurvedRowScope.() -> Unit
@@ -146,7 +148,7 @@
factory = ::EmittableCurvedRow,
update = {
this.set(modifier) { this.modifier = it }
- this.set(anchor) { this.anchor = it }
+ this.set(anchorDegrees) { this.anchorDegrees = it }
this.set(anchorType) { this.anchorType = it }
this.set(radialAlignment) { this.radialAlignment = it }
},
@@ -154,6 +156,39 @@
)
}
+/**
+ * Description of a text style for the [CurvedRowScope.CurvedText] composable.
+ */
+@Immutable
+public class CurvedTextStyle(
+ public val fontSize: Sp? = null,
+ public val fontWeight: FontWeight? = null,
+ public val fontStyle: FontStyle? = null
+) {
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as TextStyle
+
+ if (fontSize != other.fontSize) return false
+ if (fontWeight != other.fontWeight) return false
+ if (fontStyle != other.fontStyle) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = fontSize.hashCode()
+ result = 31 * result + fontWeight.hashCode()
+ result = 31 * result + fontStyle.hashCode()
+ return result
+ }
+
+ override fun toString() =
+ "TextStyle(size=$fontSize, fontWeight=$fontWeight, fontStyle=$fontStyle)"
+}
+
/** A scope for elements which can only be contained within a [CurvedRow]. */
class CurvedRowScope {
/**
@@ -167,7 +202,7 @@
public fun CurvedText(
text: String,
modifier: Modifier = Modifier,
- textStyle: TextStyle? = null
+ textStyle: CurvedTextStyle? = null
) {
ComposeNode<EmittableCurvedText, Applier>(
factory = ::EmittableCurvedText,
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/GlanceTileServiceTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/GlanceTileServiceTest.kt
index e85a74ae..94417d5 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/GlanceTileServiceTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/GlanceTileServiceTest.kt
@@ -33,6 +33,7 @@
import org.junit.runner.RunWith
import org.robolectric.RobolectricTestRunner
import org.robolectric.Shadows.shadowOf
+import kotlin.test.assertIs
@OptIn(ExperimentalCoroutinesApi::class, ExperimentalStdlibApi::class)
@RunWith(RobolectricTestRunner::class)
@@ -77,10 +78,9 @@
assertThat(entry.validity).isNull()
// It always emits a box as the root-level layout.
- val box = entry.layout!!.root!! as LayoutElementBuilders.Box
+ val box = assertIs<LayoutElementBuilders.Box>(entry.layout!!.root!!)
assertThat(box.contents).hasSize(1)
- assertThat(box.contents[0]).isInstanceOf(LayoutElementBuilders.Text::class.java)
- val text = box.contents[0] as LayoutElementBuilders.Text
+ val text = assertIs<LayoutElementBuilders.Text>(box.contents[0])
assertThat(text.text!!.value).isEqualTo("Hello World!")
}
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/Utils.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/Utils.kt
index 75b2c03..1c94ca2 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/Utils.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/Utils.kt
@@ -21,13 +21,11 @@
import androidx.compose.runtime.Composition
import androidx.compose.runtime.Recomposer
import androidx.glance.Applier
-import androidx.glance.GlanceInternalApi
import androidx.glance.layout.EmittableBox
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.launch
-@OptIn(GlanceInternalApi::class)
suspend fun runTestingComposition(content: @Composable () -> Unit): EmittableBox = coroutineScope {
val root = EmittableBox()
val applier = Applier(root)
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt
index 5c40dad..b67350e 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/WearCompositionTranslatorTest.kt
@@ -16,31 +16,38 @@
package androidx.glance.wear
+import android.app.Activity
+import android.content.Context
import androidx.compose.runtime.Composable
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
+import androidx.glance.action.clickable
+import androidx.glance.action.launchActivityAction
import androidx.glance.layout.Alignment
import androidx.glance.layout.Box
import androidx.glance.layout.Column
-import androidx.glance.layout.FontStyle
-import androidx.glance.layout.FontWeight
import androidx.glance.layout.Row
import androidx.glance.layout.Text
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
-import androidx.glance.layout.expandHeight
-import androidx.glance.layout.expandWidth
+import androidx.glance.layout.fillMaxHeight
+import androidx.glance.layout.fillMaxWidth
import androidx.glance.layout.height
import androidx.glance.layout.padding
import androidx.glance.layout.size
import androidx.glance.layout.width
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.glance.unit.Color
import androidx.glance.unit.dp
import androidx.glance.unit.sp
import androidx.glance.wear.layout.AnchorType
+import androidx.glance.wear.layout.AndroidLayoutElement
import androidx.glance.wear.layout.CurvedRow
+import androidx.glance.wear.layout.CurvedTextStyle
import androidx.glance.wear.layout.RadialAlignment
import androidx.glance.wear.layout.background
+import androidx.test.core.app.ApplicationProvider.getApplicationContext
+import androidx.wear.tiles.ActionBuilders
import androidx.wear.tiles.DimensionBuilders
import androidx.wear.tiles.LayoutElementBuilders
import androidx.wear.tiles.LayoutElementBuilders.ARC_ANCHOR_END
@@ -56,8 +63,12 @@
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+@RunWith(RobolectricTestRunner::class)
class WearCompositionTranslatorTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -76,7 +87,7 @@
val outerBox = content as LayoutElementBuilders.Box
assertThat(outerBox.contents).hasSize(1)
- assertThat(outerBox.contents[0]).isInstanceOf(LayoutElementBuilders.Box::class.java)
+ assertIs<LayoutElementBuilders.Box>(outerBox.contents[0])
}
@Test
@@ -172,7 +183,7 @@
Row(
verticalAlignment = Alignment.Vertical.CenterVertically,
horizontalAlignment = Alignment.Horizontal.CenterHorizontally,
- modifier = Modifier.expandWidth().height(100.dp).background(Color(0x11223344))
+ modifier = Modifier.fillMaxWidth().height(100.dp).background(Color(0x11223344))
) {}
}
@@ -183,18 +194,14 @@
assertThat(innerColumn.horizontalAlignment!!.value).isEqualTo(HORIZONTAL_ALIGN_CENTER)
// Column should inherit the size of the inner Row
- assertThat(innerColumn.width).isInstanceOf(
- DimensionBuilders.ExpandedDimensionProp::class.java
- )
+ assertIs<DimensionBuilders.ExpandedDimensionProp>(innerColumn.width)
assertThat((innerColumn.height as DimensionBuilders.DpProp).value).isEqualTo(100f)
// Column should also inherit the modifiers
assertThat(innerColumn.modifiers!!.background!!.color!!.argb).isEqualTo(0x11223344)
// The row should have a wrapped width, but still use the height
- assertThat(innerRow.width).isInstanceOf(
- DimensionBuilders.WrappedDimensionProp::class.java
- )
+ assertIs<DimensionBuilders.WrappedDimensionProp>(innerRow.width)
assertThat((innerRow.height as DimensionBuilders.DpProp).value).isEqualTo(100f)
// And no modifiers.
@@ -234,7 +241,7 @@
Column(
verticalAlignment = Alignment.Vertical.CenterVertically,
horizontalAlignment = Alignment.Horizontal.CenterHorizontally,
- modifier = Modifier.expandHeight().width(100.dp).background(Color(0x11223344))
+ modifier = Modifier.fillMaxHeight().width(100.dp).background(Color(0x11223344))
) {}
}
@@ -246,18 +253,14 @@
// Row should inherit the size of the inner Row
assertThat((innerRow.width as DimensionBuilders.DpProp).value).isEqualTo(100f)
- assertThat(innerRow.height).isInstanceOf(
- DimensionBuilders.ExpandedDimensionProp::class.java
- )
+ assertIs<DimensionBuilders.ExpandedDimensionProp>(innerRow.height)
// Row should also inherit the modifiers
assertThat(innerRow.modifiers!!.background!!.color!!.argb).isEqualTo(0x11223344)
// The Column should have a wrapped width, but still use the height
assertThat((innerColumn.width as DimensionBuilders.DpProp).value).isEqualTo(100f)
- assertThat(innerColumn.height).isInstanceOf(
- DimensionBuilders.WrappedDimensionProp::class.java
- )
+ assertIs<DimensionBuilders.WrappedDimensionProp>(innerColumn.height)
// And no modifiers.
assertThat(innerColumn.modifiers).isNull()
@@ -270,7 +273,7 @@
fun canInflateText() = fakeCoroutineScope.runBlockingTest {
val content = runAndTranslate {
val style = TextStyle(
- size = 16.sp,
+ fontSize = 16.sp,
fontWeight = FontWeight.Bold,
fontStyle = FontStyle.Italic,
textDecoration = TextDecoration.Underline
@@ -314,7 +317,7 @@
fun canTranslateCurvedRow() = fakeCoroutineScope.runBlockingTest {
val content = runAndTranslate {
CurvedRow(
- anchor = 20f,
+ anchorDegrees = 20f,
radialAlignment = RadialAlignment.Inner,
anchorType = AnchorType.End,
modifier = Modifier.padding(20.dp)
@@ -335,7 +338,7 @@
fun curvedRowWithSizeInflatesInBox() = fakeCoroutineScope.runBlockingTest {
val content = runAndTranslate {
CurvedRow(
- anchor = 20f,
+ anchorDegrees = 20f,
radialAlignment = RadialAlignment.Inner,
anchorType = AnchorType.End,
modifier = Modifier.padding(20.dp).size(10.dp)
@@ -361,8 +364,8 @@
@Test
fun canTranslateCurvedText() = fakeCoroutineScope.runBlockingTest {
val content = runAndTranslate {
- val style = TextStyle(
- size = 16.sp,
+ val style = CurvedTextStyle(
+ fontSize = 16.sp,
fontWeight = FontWeight.Bold,
fontStyle = FontStyle.Italic,
)
@@ -383,6 +386,20 @@
}
@Test
+ fun canTranslateAndroidLayoutElement() = fakeCoroutineScope.runBlockingTest {
+ val providedLayoutElement =
+ LayoutElementBuilders.Text.Builder().setText("Android Layout Element").build()
+
+ val content = runAndTranslate {
+ AndroidLayoutElement(providedLayoutElement)
+ }
+
+ val box = assertIs<LayoutElementBuilders.Box>(content)
+ val textElement = assertIs<LayoutElementBuilders.Text>(box.contents[0])
+ assertThat(textElement.text!!.value).isEqualTo("Android Layout Element")
+ }
+
+ @Test
fun otherElementInArcInflatesInArcAdapter() = fakeCoroutineScope.runBlockingTest {
val content = runAndTranslate {
CurvedRow {
@@ -393,7 +410,32 @@
val innerArc = (content as LayoutElementBuilders.Box).contents[0]
as LayoutElementBuilders.Arc
val innerArcAdapter = innerArc.contents[0] as LayoutElementBuilders.ArcAdapter
- assertThat(innerArcAdapter.content).isInstanceOf(LayoutElementBuilders.Box::class.java)
+ assertIs<LayoutElementBuilders.Box>(innerArcAdapter.content)
+ }
+
+ @Test
+ fun canInflateLaunchAction() = fakeCoroutineScope.runBlockingTest {
+ val content = runAndTranslate {
+ Text(
+ modifier = Modifier.clickable(launchActivityAction(TestActivity::class.java)),
+ text = "Hello World"
+ )
+ }
+
+ val innerText = (content as LayoutElementBuilders.Box).contents[0] as
+ LayoutElementBuilders.Text
+
+ assertThat(innerText.modifiers!!.clickable).isNotNull()
+ assertThat(innerText.modifiers!!.clickable!!.onClick)
+ .isInstanceOf(ActionBuilders.LaunchAction::class.java)
+
+ val launchAction = innerText.modifiers!!.clickable!!.onClick as ActionBuilders.LaunchAction
+ assertThat(launchAction.androidActivity).isNotNull()
+
+ val packageName = getApplicationContext<Context>().packageName
+ assertThat(launchAction.androidActivity!!.packageName).isEqualTo(packageName)
+ assertThat(launchAction.androidActivity!!.className)
+ .isEqualTo(TestActivity::class.qualifiedName)
}
private suspend fun runAndTranslate(
@@ -401,6 +443,8 @@
): LayoutElementBuilders.LayoutElement {
val root = runTestingComposition(content)
- return translateComposition(root)
+ return translateComposition(getApplicationContext(), root)
}
}
+
+private class TestActivity : Activity()
\ No newline at end of file
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt
index 44ade66..20eb0ed 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/BackgroundTest.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -17,7 +16,6 @@
package androidx.glance.wear.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.unit.Color
diff --git a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt
index 7f0c5e6..106fe11 100644
--- a/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt
+++ b/glance/glance-wear/src/test/kotlin/androidx/glance/wear/layout/CurvedRowTest.kt
@@ -16,14 +16,12 @@
package androidx.glance.wear.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.layout.PaddingModifier
-import androidx.glance.layout.TextDecoration
-import androidx.glance.layout.TextStyle
import androidx.glance.layout.padding
import androidx.glance.unit.dp
+import androidx.glance.unit.sp
import androidx.glance.wear.runTestingComposition
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -31,8 +29,9 @@
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Test
+import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class CurvedRowTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -46,7 +45,7 @@
val root = runTestingComposition {
CurvedRow(
modifier = Modifier.padding(1.dp),
- anchor = 5f,
+ anchorDegrees = 5f,
anchorType = AnchorType.End,
radialAlignment = RadialAlignment.Center
) {}
@@ -54,9 +53,9 @@
assertThat(root.children).hasSize(1)
- val arc = root.children[0] as EmittableCurvedRow
+ val arc = assertIs<EmittableCurvedRow>(root.children[0])
assertThat(arc.children).hasSize(0)
- assertThat(arc.anchor).isEqualTo(5f)
+ assertThat(arc.anchorDegrees).isEqualTo(5f)
assertThat(arc.anchorType).isEqualTo(AnchorType.End)
assertThat(arc.radialAlignment).isEqualTo(RadialAlignment.Center)
assertThat(arc.modifier.findModifier<PaddingModifier>()).isNotNull()
@@ -69,17 +68,17 @@
CurvedText(
text = "Hello World",
modifier = Modifier.padding(5.dp),
- textStyle = TextStyle(textDecoration = TextDecoration.Underline)
+ textStyle = CurvedTextStyle(fontSize = 24.sp)
)
}
}
- val arc = root.children[0] as EmittableCurvedRow
- val arcText = arc.children[0] as EmittableCurvedText
+ val arc = assertIs<EmittableCurvedRow>(root.children[0])
+ val arcText = assertIs<EmittableCurvedText>(arc.children[0])
assertThat(arcText.text).isEqualTo("Hello World")
assertThat(arcText.modifier.findModifier<PaddingModifier>()).isNotNull()
assertThat(arcText.textStyle).isNotNull()
- assertThat(arcText.textStyle!!.textDecoration).isEqualTo(TextDecoration.Underline)
+ assertThat(arcText.textStyle!!.fontSize).isEqualTo(24.sp)
}
}
diff --git a/glance/glance/api/current.txt b/glance/glance/api/current.txt
index 189768c..b65b9fe 100644
--- a/glance/glance/api/current.txt
+++ b/glance/glance/api/current.txt
@@ -133,20 +133,49 @@
}
public final class ColumnKt {
- method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
+ }
+
+ public interface ColumnScope {
+ method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
}
public final class DimensionKt {
- method public static androidx.glance.Modifier expandHeight(androidx.glance.Modifier);
- method public static androidx.glance.Modifier expandWidth(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxHeight(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxSize(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxWidth(androidx.glance.Modifier);
method public static androidx.glance.Modifier height(androidx.glance.Modifier, float height);
method public static androidx.glance.Modifier size(androidx.glance.Modifier, float size);
method public static androidx.glance.Modifier size(androidx.glance.Modifier, float width, float height);
method public static androidx.glance.Modifier width(androidx.glance.Modifier, float width);
- method public static androidx.glance.Modifier wrapHeight(androidx.glance.Modifier);
- method public static androidx.glance.Modifier wrapWidth(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentHeight(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentSize(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentWidth(androidx.glance.Modifier);
}
+ public final class PaddingKt {
+ method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
+ }
+
+ public final class RowKt {
+ method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
+ }
+
+ public interface RowScope {
+ method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+ }
+
+ public final class TextKt {
+ method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.text.TextStyle? style);
+ }
+
+}
+
+package androidx.glance.text {
+
public final inline class FontStyle {
ctor public FontStyle();
}
@@ -154,7 +183,7 @@
public static final class FontStyle.Companion {
method public int getItalic();
method public int getNormal();
- method public java.util.List<androidx.glance.layout.FontStyle> values();
+ method public java.util.List<androidx.glance.text.FontStyle> values();
property public final int Italic;
property public final int Normal;
}
@@ -174,15 +203,22 @@
property public final int Normal;
}
- public final class PaddingKt {
- method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
+ public final inline class TextAlign {
+ ctor public TextAlign();
}
- public final class RowKt {
- method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ public static final class TextAlign.Companion {
+ method public int getCenter();
+ method public int getEnd();
+ method public int getLeft();
+ method public int getRight();
+ method public int getStart();
+ method public java.util.List<androidx.glance.text.TextAlign> values();
+ property public final int Center;
+ property public final int End;
+ property public final int Left;
+ property public final int Right;
+ property public final int Start;
}
public final inline class TextDecoration {
@@ -190,7 +226,7 @@
}
public static final class TextDecoration.Companion {
- method public int combine(java.util.List<androidx.glance.layout.TextDecoration> decorations);
+ method public int combine(java.util.List<androidx.glance.text.TextDecoration> decorations);
method public int getLineThrough();
method public int getNone();
method public int getUnderline();
@@ -199,20 +235,18 @@
property public final int Underline;
}
- public final class TextKt {
- method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.layout.TextStyle? style);
- }
-
@androidx.compose.runtime.Immutable public final class TextStyle {
- ctor public TextStyle(optional androidx.glance.unit.Sp? size, optional androidx.glance.layout.FontWeight? fontWeight, optional androidx.glance.layout.FontStyle? fontStyle, optional androidx.glance.layout.TextDecoration? textDecoration);
- method public androidx.glance.layout.FontStyle? getFontStyle();
- method public androidx.glance.layout.FontWeight? getFontWeight();
- method public androidx.glance.unit.Sp? getSize();
- method public androidx.glance.layout.TextDecoration? getTextDecoration();
- property public final androidx.glance.layout.FontStyle? fontStyle;
- property public final androidx.glance.layout.FontWeight? fontWeight;
- property public final androidx.glance.unit.Sp? size;
- property public final androidx.glance.layout.TextDecoration? textDecoration;
+ ctor public TextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
+ method public androidx.glance.unit.Sp? getFontSize();
+ method public androidx.glance.text.FontStyle? getFontStyle();
+ method public androidx.glance.text.FontWeight? getFontWeight();
+ method public androidx.glance.text.TextAlign? getTextAlign();
+ method public androidx.glance.text.TextDecoration? getTextDecoration();
+ property public final androidx.glance.unit.Sp? fontSize;
+ property public final androidx.glance.text.FontStyle? fontStyle;
+ property public final androidx.glance.text.FontWeight? fontWeight;
+ property public final androidx.glance.text.TextAlign? textAlign;
+ property public final androidx.glance.text.TextDecoration? textDecoration;
}
}
diff --git a/glance/glance/api/public_plus_experimental_current.txt b/glance/glance/api/public_plus_experimental_current.txt
index ac80b4a..b65b9fe 100644
--- a/glance/glance/api/public_plus_experimental_current.txt
+++ b/glance/glance/api/public_plus_experimental_current.txt
@@ -1,15 +1,6 @@
// Signature format: 4.0
package androidx.glance {
- @androidx.glance.GlanceInternalApi public final class Applier extends androidx.compose.runtime.AbstractApplier<androidx.glance.Emittable> {
- ctor public Applier(androidx.glance.EmittableWithChildren root);
- method public void insertBottomUp(int index, androidx.glance.Emittable instance);
- method public void insertTopDown(int index, androidx.glance.Emittable instance);
- method public void move(int from, int to, int count);
- method protected void onClear();
- method public void remove(int index, int count);
- }
-
public final class CombinedModifier implements androidx.glance.Modifier {
ctor public CombinedModifier(androidx.glance.Modifier outer, androidx.glance.Modifier inner);
method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
@@ -23,22 +14,6 @@
method public static androidx.compose.runtime.ProvidableCompositionLocal<androidx.glance.unit.DpSize> getLocalSize();
}
- @androidx.glance.GlanceInternalApi public interface Emittable {
- method public androidx.glance.Modifier getModifier();
- method public void setModifier(androidx.glance.Modifier modifier);
- property public abstract androidx.glance.Modifier modifier;
- }
-
- @androidx.glance.GlanceInternalApi public abstract class EmittableWithChildren implements androidx.glance.Emittable {
- ctor public EmittableWithChildren(optional int maxDepth);
- method protected final String childrenToString();
- method public final java.util.List<androidx.glance.Emittable> getChildren();
- property public final java.util.List<androidx.glance.Emittable> children;
- }
-
- @kotlin.RequiresOptIn(message="This API is used for the implementation of androidx.glance, and should " + "not be used by API consumers.") @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget, kotlin.annotation.AnnotationTarget}) public @interface GlanceInternalApi {
- }
-
@androidx.compose.runtime.Stable public interface Modifier {
method public boolean all(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
method public boolean any(kotlin.jvm.functions.Function1<? super androidx.glance.Modifier.Element,java.lang.Boolean> predicate);
@@ -63,7 +38,6 @@
}
public final class UtilsKt {
- method @androidx.glance.GlanceInternalApi public static inline <reified T> T! findModifier(androidx.glance.Modifier);
}
}
@@ -77,18 +51,6 @@
method public static androidx.glance.Modifier clickable(androidx.glance.Modifier, androidx.glance.action.Action onClick);
}
- @androidx.glance.GlanceInternalApi public final class ActionModifier implements androidx.glance.Modifier.Element {
- ctor public ActionModifier(androidx.glance.action.Action action);
- method public androidx.glance.action.Action getAction();
- property public final androidx.glance.action.Action action;
- }
-
- @androidx.glance.GlanceInternalApi public final class LaunchActivityAction implements androidx.glance.action.Action {
- ctor public LaunchActivityAction(Class<? extends android.app.Activity> activityClass);
- method public Class<? extends android.app.Activity> getActivityClass();
- property public final Class<? extends android.app.Activity> activityClass;
- }
-
public final class LaunchActivityActionKt {
method public static <T extends android.app.Activity> androidx.glance.action.Action launchActivityAction(Class<T> activity);
method public static inline <reified T extends android.app.Activity> androidx.glance.action.Action! launchActivityAction();
@@ -171,86 +133,49 @@
}
public final class ColumnKt {
- method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
}
- @androidx.glance.GlanceInternalApi public abstract sealed class Dimension {
- }
-
- public static final class Dimension.Dp extends androidx.glance.layout.Dimension {
- ctor public Dimension.Dp(float dp);
- method public float getDp();
- property public final float dp;
- }
-
- public static final class Dimension.Expand extends androidx.glance.layout.Dimension {
- field public static final androidx.glance.layout.Dimension.Expand INSTANCE;
- }
-
- public static final class Dimension.Wrap extends androidx.glance.layout.Dimension {
- field public static final androidx.glance.layout.Dimension.Wrap INSTANCE;
+ public interface ColumnScope {
+ method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
}
public final class DimensionKt {
- method public static androidx.glance.Modifier expandHeight(androidx.glance.Modifier);
- method public static androidx.glance.Modifier expandWidth(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxHeight(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxSize(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxWidth(androidx.glance.Modifier);
method public static androidx.glance.Modifier height(androidx.glance.Modifier, float height);
method public static androidx.glance.Modifier size(androidx.glance.Modifier, float size);
method public static androidx.glance.Modifier size(androidx.glance.Modifier, float width, float height);
method public static androidx.glance.Modifier width(androidx.glance.Modifier, float width);
- method public static androidx.glance.Modifier wrapHeight(androidx.glance.Modifier);
- method public static androidx.glance.Modifier wrapWidth(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentHeight(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentSize(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentWidth(androidx.glance.Modifier);
}
- @androidx.glance.GlanceInternalApi public final class EmittableBox extends androidx.glance.EmittableWithChildren {
- ctor public EmittableBox();
- method public androidx.glance.layout.Alignment getContentAlignment();
- method public androidx.glance.Modifier getModifier();
- method public void setContentAlignment(androidx.glance.layout.Alignment contentAlignment);
- method public void setModifier(androidx.glance.Modifier modifier);
- property public final androidx.glance.layout.Alignment contentAlignment;
- property public androidx.glance.Modifier modifier;
+ public final class PaddingKt {
+ method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
}
- @androidx.glance.GlanceInternalApi public final class EmittableColumn extends androidx.glance.EmittableWithChildren {
- ctor public EmittableColumn();
- method public int getHorizontalAlignment();
- method public androidx.glance.Modifier getModifier();
- method public int getVerticalAlignment();
- method public void setHorizontalAlignment(int horizontalAlignment);
- method public void setModifier(androidx.glance.Modifier modifier);
- method public void setVerticalAlignment(int verticalAlignment);
- property public final int horizontalAlignment;
- property public androidx.glance.Modifier modifier;
- property public final int verticalAlignment;
+ public final class RowKt {
+ method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
}
- @androidx.glance.GlanceInternalApi public final class EmittableRow extends androidx.glance.EmittableWithChildren {
- ctor public EmittableRow();
- method public int getHorizontalAlignment();
- method public androidx.glance.Modifier getModifier();
- method public int getVerticalAlignment();
- method public void setHorizontalAlignment(int horizontalAlignment);
- method public void setModifier(androidx.glance.Modifier modifier);
- method public void setVerticalAlignment(int verticalAlignment);
- property public final int horizontalAlignment;
- property public androidx.glance.Modifier modifier;
- property public final int verticalAlignment;
+ public interface RowScope {
+ method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
}
- @androidx.glance.GlanceInternalApi public final class EmittableText implements androidx.glance.Emittable {
- ctor public EmittableText();
- method public androidx.glance.Modifier getModifier();
- method public androidx.glance.layout.TextStyle? getStyle();
- method public String getText();
- method public void setModifier(androidx.glance.Modifier modifier);
- method public void setStyle(androidx.glance.layout.TextStyle? style);
- method public void setText(String text);
- property public androidx.glance.Modifier modifier;
- property public final androidx.glance.layout.TextStyle? style;
- property public final String text;
+ public final class TextKt {
+ method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.text.TextStyle? style);
}
+}
+
+package androidx.glance.text {
+
public final inline class FontStyle {
ctor public FontStyle();
}
@@ -258,7 +183,7 @@
public static final class FontStyle.Companion {
method public int getItalic();
method public int getNormal();
- method public java.util.List<androidx.glance.layout.FontStyle> values();
+ method public java.util.List<androidx.glance.text.FontStyle> values();
property public final int Italic;
property public final int Normal;
}
@@ -278,35 +203,22 @@
property public final int Normal;
}
- @androidx.glance.GlanceInternalApi public final class HeightModifier implements androidx.glance.Modifier.Element {
- ctor public HeightModifier(androidx.glance.layout.Dimension height);
- method public androidx.glance.layout.Dimension getHeight();
- property public final androidx.glance.layout.Dimension height;
+ public final inline class TextAlign {
+ ctor public TextAlign();
}
- public final class PaddingKt {
- method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
- }
-
- @androidx.glance.GlanceInternalApi public final class PaddingModifier implements androidx.glance.Modifier.Element {
- ctor public PaddingModifier(optional float start, optional float top, optional float end, optional float bottom, boolean rtlAware);
- method public float getBottom();
- method public float getEnd();
- method public boolean getRtlAware();
- method public float getStart();
- method public float getTop();
- property public final float bottom;
- property public final float end;
- property public final boolean rtlAware;
- property public final float start;
- property public final float top;
- }
-
- public final class RowKt {
- method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ public static final class TextAlign.Companion {
+ method public int getCenter();
+ method public int getEnd();
+ method public int getLeft();
+ method public int getRight();
+ method public int getStart();
+ method public java.util.List<androidx.glance.text.TextAlign> values();
+ property public final int Center;
+ property public final int End;
+ property public final int Left;
+ property public final int Right;
+ property public final int Start;
}
public final inline class TextDecoration {
@@ -314,7 +226,7 @@
}
public static final class TextDecoration.Companion {
- method public int combine(java.util.List<androidx.glance.layout.TextDecoration> decorations);
+ method public int combine(java.util.List<androidx.glance.text.TextDecoration> decorations);
method public int getLineThrough();
method public int getNone();
method public int getUnderline();
@@ -323,26 +235,18 @@
property public final int Underline;
}
- public final class TextKt {
- method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.layout.TextStyle? style);
- }
-
@androidx.compose.runtime.Immutable public final class TextStyle {
- ctor public TextStyle(optional androidx.glance.unit.Sp? size, optional androidx.glance.layout.FontWeight? fontWeight, optional androidx.glance.layout.FontStyle? fontStyle, optional androidx.glance.layout.TextDecoration? textDecoration);
- method public androidx.glance.layout.FontStyle? getFontStyle();
- method public androidx.glance.layout.FontWeight? getFontWeight();
- method public androidx.glance.unit.Sp? getSize();
- method public androidx.glance.layout.TextDecoration? getTextDecoration();
- property public final androidx.glance.layout.FontStyle? fontStyle;
- property public final androidx.glance.layout.FontWeight? fontWeight;
- property public final androidx.glance.unit.Sp? size;
- property public final androidx.glance.layout.TextDecoration? textDecoration;
- }
-
- @androidx.glance.GlanceInternalApi public final class WidthModifier implements androidx.glance.Modifier.Element {
- ctor public WidthModifier(androidx.glance.layout.Dimension width);
- method public androidx.glance.layout.Dimension getWidth();
- property public final androidx.glance.layout.Dimension width;
+ ctor public TextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
+ method public androidx.glance.unit.Sp? getFontSize();
+ method public androidx.glance.text.FontStyle? getFontStyle();
+ method public androidx.glance.text.FontWeight? getFontWeight();
+ method public androidx.glance.text.TextAlign? getTextAlign();
+ method public androidx.glance.text.TextDecoration? getTextDecoration();
+ property public final androidx.glance.unit.Sp? fontSize;
+ property public final androidx.glance.text.FontStyle? fontStyle;
+ property public final androidx.glance.text.FontWeight? fontWeight;
+ property public final androidx.glance.text.TextAlign? textAlign;
+ property public final androidx.glance.text.TextDecoration? textDecoration;
}
}
diff --git a/glance/glance/api/restricted_current.txt b/glance/glance/api/restricted_current.txt
index 189768c..b65b9fe 100644
--- a/glance/glance/api/restricted_current.txt
+++ b/glance/glance/api/restricted_current.txt
@@ -133,20 +133,49 @@
}
public final class ColumnKt {
- method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ method @androidx.compose.runtime.Composable public static void Column(optional androidx.glance.Modifier modifier, optional int verticalAlignment, optional int horizontalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.ColumnScope,kotlin.Unit> content);
+ }
+
+ public interface ColumnScope {
+ method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
}
public final class DimensionKt {
- method public static androidx.glance.Modifier expandHeight(androidx.glance.Modifier);
- method public static androidx.glance.Modifier expandWidth(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxHeight(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxSize(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier fillMaxWidth(androidx.glance.Modifier);
method public static androidx.glance.Modifier height(androidx.glance.Modifier, float height);
method public static androidx.glance.Modifier size(androidx.glance.Modifier, float size);
method public static androidx.glance.Modifier size(androidx.glance.Modifier, float width, float height);
method public static androidx.glance.Modifier width(androidx.glance.Modifier, float width);
- method public static androidx.glance.Modifier wrapHeight(androidx.glance.Modifier);
- method public static androidx.glance.Modifier wrapWidth(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentHeight(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentSize(androidx.glance.Modifier);
+ method public static androidx.glance.Modifier wrapContentWidth(androidx.glance.Modifier);
}
+ public final class PaddingKt {
+ method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
+ method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
+ }
+
+ public final class RowKt {
+ method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function1<? super androidx.glance.layout.RowScope,kotlin.Unit> content);
+ }
+
+ public interface RowScope {
+ method public androidx.glance.Modifier defaultWeight(androidx.glance.Modifier);
+ }
+
+ public final class TextKt {
+ method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.text.TextStyle? style);
+ }
+
+}
+
+package androidx.glance.text {
+
public final inline class FontStyle {
ctor public FontStyle();
}
@@ -154,7 +183,7 @@
public static final class FontStyle.Companion {
method public int getItalic();
method public int getNormal();
- method public java.util.List<androidx.glance.layout.FontStyle> values();
+ method public java.util.List<androidx.glance.text.FontStyle> values();
property public final int Italic;
property public final int Normal;
}
@@ -174,15 +203,22 @@
property public final int Normal;
}
- public final class PaddingKt {
- method public static androidx.glance.Modifier absolutePadding(androidx.glance.Modifier, optional float left, optional float top, optional float right, optional float bottom);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float start, optional float top, optional float end, optional float bottom);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, optional float horizontal, optional float vertical);
- method public static androidx.glance.Modifier padding(androidx.glance.Modifier, float all);
+ public final inline class TextAlign {
+ ctor public TextAlign();
}
- public final class RowKt {
- method @androidx.compose.runtime.Composable public static void Row(optional androidx.glance.Modifier modifier, optional int horizontalAlignment, optional int verticalAlignment, kotlin.jvm.functions.Function0<kotlin.Unit> content);
+ public static final class TextAlign.Companion {
+ method public int getCenter();
+ method public int getEnd();
+ method public int getLeft();
+ method public int getRight();
+ method public int getStart();
+ method public java.util.List<androidx.glance.text.TextAlign> values();
+ property public final int Center;
+ property public final int End;
+ property public final int Left;
+ property public final int Right;
+ property public final int Start;
}
public final inline class TextDecoration {
@@ -190,7 +226,7 @@
}
public static final class TextDecoration.Companion {
- method public int combine(java.util.List<androidx.glance.layout.TextDecoration> decorations);
+ method public int combine(java.util.List<androidx.glance.text.TextDecoration> decorations);
method public int getLineThrough();
method public int getNone();
method public int getUnderline();
@@ -199,20 +235,18 @@
property public final int Underline;
}
- public final class TextKt {
- method @androidx.compose.runtime.Composable public static void Text(String text, optional androidx.glance.Modifier modifier, optional androidx.glance.layout.TextStyle? style);
- }
-
@androidx.compose.runtime.Immutable public final class TextStyle {
- ctor public TextStyle(optional androidx.glance.unit.Sp? size, optional androidx.glance.layout.FontWeight? fontWeight, optional androidx.glance.layout.FontStyle? fontStyle, optional androidx.glance.layout.TextDecoration? textDecoration);
- method public androidx.glance.layout.FontStyle? getFontStyle();
- method public androidx.glance.layout.FontWeight? getFontWeight();
- method public androidx.glance.unit.Sp? getSize();
- method public androidx.glance.layout.TextDecoration? getTextDecoration();
- property public final androidx.glance.layout.FontStyle? fontStyle;
- property public final androidx.glance.layout.FontWeight? fontWeight;
- property public final androidx.glance.unit.Sp? size;
- property public final androidx.glance.layout.TextDecoration? textDecoration;
+ ctor public TextStyle(optional androidx.glance.unit.Sp? fontSize, optional androidx.glance.text.FontWeight? fontWeight, optional androidx.glance.text.FontStyle? fontStyle, optional androidx.glance.text.TextAlign? textAlign, optional androidx.glance.text.TextDecoration? textDecoration);
+ method public androidx.glance.unit.Sp? getFontSize();
+ method public androidx.glance.text.FontStyle? getFontStyle();
+ method public androidx.glance.text.FontWeight? getFontWeight();
+ method public androidx.glance.text.TextAlign? getTextAlign();
+ method public androidx.glance.text.TextDecoration? getTextDecoration();
+ property public final androidx.glance.unit.Sp? fontSize;
+ property public final androidx.glance.text.FontStyle? fontStyle;
+ property public final androidx.glance.text.FontWeight? fontWeight;
+ property public final androidx.glance.text.TextAlign? textAlign;
+ property public final androidx.glance.text.TextDecoration? textDecoration;
}
}
diff --git a/glance/glance/build.gradle b/glance/glance/build.gradle
index e814232..dcad28f 100644
--- a/glance/glance/build.gradle
+++ b/glance/glance/build.gradle
@@ -34,6 +34,7 @@
api("androidx.compose.runtime:runtime:1.0.1")
+ implementation("androidx.annotation:annotation:1.1.0")
implementation(libs.kotlinStdlib)
testImplementation(libs.testRules)
@@ -42,6 +43,7 @@
testImplementation(libs.junit)
testImplementation(libs.kotlinCoroutinesTest)
testImplementation(libs.kotlinTest)
+ testImplementation(libs.kotlinReflect)
}
android {
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Applier.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/Applier.kt
index 8929334..a7d8722 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Applier.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/Applier.kt
@@ -16,12 +16,18 @@
package androidx.glance
+import androidx.annotation.RestrictTo
import androidx.compose.runtime.AbstractApplier
import java.lang.IllegalStateException
-/** Applier for the Glance composition. */
-@GlanceInternalApi
+/**
+ * Applier for the Glance composition.
+ * @suppress
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class Applier(root: EmittableWithChildren) : AbstractApplier<Emittable>(root) {
+ private val newRootMaxDepth = root.maxDepth
+
override fun onClear() {
(root as EmittableWithChildren).children.clear()
}
@@ -36,7 +42,13 @@
"Too many embedded views for the current surface. The maximum depth is: " +
"${(root as EmittableWithChildren).maxDepth}"
}
- if (instance is EmittableWithChildren) instance.maxDepth = parent.maxDepth - 1
+ if (instance is EmittableWithChildren) {
+ instance.maxDepth = if (instance.resetsDepthForChildren) {
+ newRootMaxDepth
+ } else {
+ parent.maxDepth - 1
+ }
+ }
currentChildren.add(index, instance)
}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt
index f395dcc..2eea848 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/Emittables.kt
@@ -16,14 +16,19 @@
package androidx.glance
-@GlanceInternalApi
+import androidx.annotation.RestrictTo
+
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public interface Emittable {
public var modifier: Modifier
}
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public abstract class EmittableWithChildren(
- internal var maxDepth: Int = Int.MAX_VALUE
+ internal var maxDepth: Int = Int.MAX_VALUE,
+ internal val resetsDepthForChildren: Boolean = false
) : Emittable {
public val children: MutableList<Emittable> = mutableListOf<Emittable>()
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/GlanceInternalApi.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/GlanceInternalApi.kt
deleted file mode 100644
index 9b73cfd..0000000
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/GlanceInternalApi.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package androidx.glance
-
-/**
- * Annotation for internal implementation details of the Glance API. This is intended for things we
- * need to expose to make them available in the same library group, but not intended for API
- * consumers and hence should not form part of our stable API.
- */
-@RequiresOptIn(
- message = "This API is used for the implementation of androidx.glance, and should " +
- "not be used by API consumers."
-)
-@Retention(AnnotationRetention.BINARY)
-@Target(AnnotationTarget.CLASS, AnnotationTarget.FUNCTION, AnnotationTarget.PROPERTY_GETTER)
-public annotation class GlanceInternalApi
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt
index c7d2e38..7ea9613 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/Utils.kt
@@ -1,5 +1,7 @@
package androidx.glance
+import androidx.annotation.RestrictTo
+
/*
* Copyright 2021 The Android Open Source Project
*
@@ -16,7 +18,8 @@
* limitations under the License.
*/
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
inline fun <reified T> Modifier.findModifier(): T? = this.foldOut<T?>(null) { cur, acc ->
if (cur is T) {
cur
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
index 8a5a193..71ff4f3 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/Action.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -18,7 +17,7 @@
package androidx.glance.action
import android.app.Activity
-import androidx.glance.GlanceInternalApi
+import androidx.annotation.RestrictTo
import androidx.glance.Modifier
/**
@@ -34,7 +33,8 @@
public fun Modifier.clickable(onClick: Action): Modifier =
this.then(ActionModifier(onClick))
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
class ActionModifier(public val action: Action) : Modifier.Element {
override fun toString(): String {
return "ActionModifier(action=$action)"
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
index c090bd0..98238f3 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/action/LaunchActivityAction.kt
@@ -17,20 +17,19 @@
package androidx.glance.action
import android.app.Activity
-import androidx.glance.GlanceInternalApi
+import androidx.annotation.RestrictTo
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
class LaunchActivityAction(val activityClass: Class<out Activity>) : Action
/**
* Creates an [Action] that launches the specified [Activity] when triggered.
*/
-@OptIn(GlanceInternalApi::class)
public fun <T : Activity> launchActivityAction(activity: Class<T>): Action =
LaunchActivityAction(activity)
@Suppress("MissingNullability") /* Shouldn't need to specify @NonNull. b/199284086 */
-@OptIn(GlanceInternalApi::class)
/**
* Creates an [Action] that launches the specified [Activity] when triggered.
*/
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt
index 37a8d1c..df8e966 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Box.kt
@@ -16,14 +16,15 @@
package androidx.glance.layout
+import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ComposeNode
import androidx.glance.Applier
import androidx.glance.EmittableWithChildren
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class EmittableBox : EmittableWithChildren() {
override var modifier: Modifier = Modifier
public var contentAlignment: Alignment = Alignment.TopStart
@@ -45,7 +46,6 @@
* @param contentAlignment The alignment of children within the [Box].
* @param content The content inside the [Box].
*/
-@OptIn(GlanceInternalApi::class)
@Composable
public fun Box(
modifier: Modifier = Modifier,
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt
index 7048406..c295ce0 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Column.kt
@@ -16,20 +16,37 @@
package androidx.glance.layout
+import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ComposeNode
import androidx.glance.Applier
import androidx.glance.EmittableWithChildren
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class EmittableColumn : EmittableWithChildren() {
override var modifier: Modifier = Modifier
public var verticalAlignment: Alignment.Vertical = Alignment.Top
public var horizontalAlignment: Alignment.Horizontal = Alignment.Start
}
+/** Scope defining modifiers only available on rows. */
+public interface ColumnScope {
+ /**
+ * Size the element's height to split the available space with other weighted sibling elements
+ * in the [Column]. The parent will divide the vertical space remaining after measuring
+ * unweighted child elements and distribute it according to the weights, the default weight
+ * being 1.
+ */
+ fun Modifier.defaultWeight(): Modifier
+}
+
+private object ColumnScopeImplInstance : ColumnScope {
+ override fun Modifier.defaultWeight(): Modifier =
+ this.then(HeightModifier(Dimension.Expand))
+}
+
/**
* A layout composable with [content], which lays its children out in a Column.
*
@@ -45,13 +62,12 @@
* than the width of the [Column]
* @param content The content inside the [Column]
*/
-@OptIn(GlanceInternalApi::class)
@Composable
public fun Column(
modifier: Modifier = Modifier,
verticalAlignment: Alignment.Vertical = Alignment.Top,
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
- content: @Composable () -> Unit
+ content: @Composable ColumnScope.() -> Unit
) {
ComposeNode<EmittableColumn, Applier>(
factory = ::EmittableColumn,
@@ -60,6 +76,6 @@
this.set(horizontalAlignment) { this.horizontalAlignment = it }
this.set(verticalAlignment) { this.verticalAlignment = it }
},
- content = content
+ content = { ColumnScopeImplInstance.content() }
)
}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt
index 504ccd8..f429f3a 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Dimension.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -17,7 +16,7 @@
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
+import androidx.annotation.RestrictTo
import androidx.glance.Modifier
import androidx.glance.unit.Dp
@@ -26,50 +25,67 @@
*
* These should only be used internally; developers should be using the width/height Modifiers
* below rather than this class directly.
+ *
+ * @suppress
*/
-@GlanceInternalApi
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public sealed class Dimension {
public class Dp(public val dp: androidx.glance.unit.Dp) : Dimension()
public object Wrap : Dimension()
+ public object Fill : Dimension()
public object Expand : Dimension()
}
-/** Modifier to represent the width of an element. */
-@GlanceInternalApi
+/**
+ * Modifier to represent the width of an element.
+ *
+ * @suppress
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class WidthModifier(public val width: Dimension) : Modifier.Element
/** Sets the absolute width of an element, in [Dp]. */
public fun Modifier.width(width: Dp): Modifier = this.then(WidthModifier(Dimension.Dp(width)))
/** Specifies that the width of the element should wrap its contents. */
-public fun Modifier.wrapWidth(): Modifier = this.then(WidthModifier(Dimension.Wrap))
+public fun Modifier.wrapContentWidth(): Modifier = this.then(WidthModifier(Dimension.Wrap))
/**
* Specifies that the width of the element should expand to the size of its parent. Note that if
- * multiple elements within a linear container (e.g. Row or Column) have their width as expandWidth,
- * then they will all share the remaining space.
+ * multiple elements within a linear container (e.g. Row or Column) have their width as
+ * [fillMaxWidth], then they will all share the remaining space.
*/
-public fun Modifier.expandWidth(): Modifier = this.then(WidthModifier(Dimension.Expand))
+public fun Modifier.fillMaxWidth(): Modifier = this.then(WidthModifier(Dimension.Fill))
-/** Modifier to represent the height of an element. */
-@GlanceInternalApi
+/**
+ * Modifier to represent the height of an element.
+ *
+ * @suppress
+ */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class HeightModifier(public val height: Dimension) : Modifier.Element
/** Sets the absolute height of an element, in [Dp]. */
public fun Modifier.height(height: Dp): Modifier = this.then(HeightModifier(Dimension.Dp(height)))
/** Specifies that the height of the element should wrap its contents. */
-public fun Modifier.wrapHeight(): Modifier = this.then(HeightModifier(Dimension.Wrap))
+public fun Modifier.wrapContentHeight(): Modifier = this.then(HeightModifier(Dimension.Wrap))
/**
* Specifies that the height of the element should expand to the size of its parent. Note that if
* multiple elements within a linear container (e.g. Row or Column) have their height as
* expandHeight, then they will all share the remaining space.
*/
-public fun Modifier.expandHeight(): Modifier = this.then(HeightModifier(Dimension.Expand))
+public fun Modifier.fillMaxHeight(): Modifier = this.then(HeightModifier(Dimension.Fill))
/** Sets both the width and height of an element, in [Dp]. */
public fun Modifier.size(size: Dp): Modifier = this.width(size).height(size)
/** Sets both the width and height of an element, in [Dp]. */
public fun Modifier.size(width: Dp, height: Dp): Modifier = this.width(width).height(height)
+
+/** Wrap both the width and height's content. */
+public fun Modifier.wrapContentSize(): Modifier = this.wrapContentHeight().wrapContentWidth()
+
+/** Set both the width and height to the maximum available space. */
+public fun Modifier.fillMaxSize(): Modifier = this.fillMaxWidth().fillMaxHeight()
\ No newline at end of file
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt
index 2cfa1d4..fc40a8c 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Padding.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -16,10 +15,10 @@
*/
package androidx.glance.layout
+import androidx.annotation.RestrictTo
+import androidx.glance.Modifier
import androidx.glance.unit.Dp
import androidx.glance.unit.dp
-import androidx.glance.GlanceInternalApi
-import androidx.glance.Modifier
/**
* Apply additional space along each edge of the content in [Dp]: [start], [top], [end] and
@@ -91,7 +90,8 @@
)
)
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class PaddingModifier(
public val start: Dp = 0.dp,
public val top: Dp = 0.dp,
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt
index b997716..1281054 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Row.kt
@@ -16,20 +16,38 @@
package androidx.glance.layout
+import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ComposeNode
import androidx.glance.Applier
import androidx.glance.EmittableWithChildren
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class EmittableRow : EmittableWithChildren() {
override var modifier: Modifier = Modifier
public var horizontalAlignment: Alignment.Horizontal = Alignment.Start
public var verticalAlignment: Alignment.Vertical = Alignment.Top
}
+/** Scope defining modifiers only available on rows. */
+public interface RowScope {
+ /**
+ * Size the element's width to split the available space with other weighted sibling elements
+ * in the [Row]. The parent will divide the horizontal space remaining after measuring
+ * unweighted child elements and distribute it according to the weights, the default weight
+ * being 1.
+ */
+ fun Modifier.defaultWeight(): Modifier
+}
+
+private object RowScopeImplInstance : RowScope {
+ override fun Modifier.defaultWeight(): Modifier {
+ return this.then(WidthModifier(Dimension.Expand))
+ }
+}
+
/**
* A layout composable with [content], which lays its children out in a Row.
*
@@ -45,13 +63,12 @@
* than the height of the [Row]
* @param content The content inside the [Row]
*/
-@OptIn(GlanceInternalApi::class)
@Composable
public fun Row(
modifier: Modifier = Modifier,
horizontalAlignment: Alignment.Horizontal = Alignment.Start,
verticalAlignment: Alignment.Vertical = Alignment.Top,
- content: @Composable () -> Unit
+ content: @Composable RowScope.() -> Unit
) {
ComposeNode<EmittableRow, Applier>(
factory = ::EmittableRow,
@@ -60,6 +77,6 @@
this.set(verticalAlignment) { this.verticalAlignment = it }
this.set(horizontalAlignment) { this.horizontalAlignment = it }
},
- content = content
+ content = { RowScopeImplInstance.content() }
)
}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt
index 86160e2..2cbcfcd 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/layout/Text.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
@@ -18,15 +17,13 @@
package androidx.glance.layout
+import androidx.annotation.RestrictTo
import androidx.compose.runtime.Composable
import androidx.compose.runtime.ComposeNode
-import androidx.compose.runtime.Immutable
-import androidx.compose.runtime.Stable
import androidx.glance.Applier
import androidx.glance.Emittable
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
-import androidx.glance.unit.Sp
+import androidx.glance.text.TextStyle
/**
* Adds a text view to the glance view.
@@ -43,151 +40,8 @@
)
}
-/**
- * Description of a text style for the [Text] composable.
- */
-@Immutable
-public class TextStyle(
- public val size: Sp? = null,
- public val fontWeight: FontWeight? = null,
- public val fontStyle: FontStyle? = null,
- public val textDecoration: TextDecoration? = null
-) {
- override fun equals(other: Any?): Boolean {
- if (this === other) return true
- if (javaClass != other?.javaClass) return false
-
- other as TextStyle
-
- if (size != other.size) return false
- if (fontWeight != other.fontWeight) return false
- if (fontStyle != other.fontStyle) return false
- if (textDecoration != other.textDecoration) return false
-
- return true
- }
-
- override fun hashCode(): Int {
- var result = size.hashCode()
- result = 31 * result + fontWeight.hashCode()
- result = 31 * result + fontStyle.hashCode()
- result = 31 * result + textDecoration.hashCode()
- return result
- }
-
- override fun toString() =
- "TextStyle(size=$size, fontWeight=$fontWeight, fontStyle=$fontStyle, " +
- "textDecoration=$textDecoration)"
-}
-
-/**
- * Weight of a font.
- */
-@Suppress("INLINE_CLASS_DEPRECATED")
-public inline class FontWeight private constructor(
- /** numerical value for the weight (a number from 0 to 1000) **/
- val value: Int,
-) {
- public companion object {
- public val Normal: FontWeight = FontWeight(400)
- public val Medium: FontWeight = FontWeight(500)
- public val Bold: FontWeight = FontWeight(700)
- }
-}
-
-/**
- * Describes the style of the font: [Normal]] or [Italic].
- */
-@Suppress("INLINE_CLASS_DEPRECATED")
-public inline class FontStyle private constructor(private val style: Int) {
- public companion object {
- /** Use the upright glyphs */
- public val Normal: FontStyle = FontStyle(0)
-
- /** Use glyphs designed for slanting */
- public val Italic: FontStyle = FontStyle(1)
-
- /** Returns a list of possible values of [FontStyle]. */
- public fun values(): List<FontStyle> = listOf(Normal, Italic)
- }
-
- override fun toString(): String {
- return when (this) {
- Normal -> "Normal"
- Italic -> "Italic"
- else -> "Invalid"
- }
- }
-}
-
-/**
- * Defines a horizontal line to be drawn on the text.
- */
-@Suppress("INLINE_CLASS_DEPRECATED")
-public inline class TextDecoration internal constructor(private val mask: Int) {
- public companion object {
- public val None: TextDecoration = TextDecoration(0x0)
-
- /**
- * Draws a horizontal line below the text.
- */
- public val Underline: TextDecoration = TextDecoration(0x1)
-
- /**
- * Draws a horizontal line over the text.
- *
- * Note: This will have no effect if used on Wear Tiles.
- */
- public val LineThrough: TextDecoration = TextDecoration(0x2)
-
- /**
- * Creates a decoration that includes all the given decorations.
- *
- * @param decorations The decorations to be added
- */
- public fun combine(decorations: List<TextDecoration>): TextDecoration {
- val mask = decorations.fold(0) { acc, decoration ->
- acc or decoration.mask
- }
- return TextDecoration(mask)
- }
- }
- /**
- * Creates a decoration that includes both of the TextDecorations.
- */
- @Stable
- public operator fun plus(decoration: TextDecoration): TextDecoration {
- return TextDecoration(this.mask or decoration.mask)
- }
-
- /**
- * Check whether this [TextDecoration] contains the given decoration.
- */
- @Stable
- public operator fun contains(other: TextDecoration): Boolean {
- return (mask or other.mask) == mask
- }
-
- override fun toString(): String {
- if (mask == 0) {
- return "TextDecoration.None"
- }
-
- val values: MutableList<String> = mutableListOf()
- if ((mask and Underline.mask) != 0) {
- values.add("Underline")
- }
- if ((mask and LineThrough.mask) != 0) {
- values.add("LineThrough")
- }
- if ((values.size == 1)) {
- return "TextDecoration.${values[0]}"
- }
- return "TextDecoration[${values.joinToString(separator = ", ")}]"
- }
-}
-
-@GlanceInternalApi
+/** @suppress */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public class EmittableText : Emittable {
override var modifier: Modifier = Modifier
public var text: String = ""
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/text/FontStyle.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/text/FontStyle.kt
new file mode 100644
index 0000000..13bdd72
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/text/FontStyle.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.text
+
+/**
+ * Describes the style of the font: [Normal]] or [Italic].
+ */
+@Suppress("INLINE_CLASS_DEPRECATED")
+public inline class FontStyle private constructor(private val style: Int) {
+ public companion object {
+ /** Use the upright glyphs */
+ public val Normal: FontStyle = FontStyle(0)
+
+ /** Use glyphs designed for slanting */
+ public val Italic: FontStyle = FontStyle(1)
+
+ /** Returns a list of possible values of [FontStyle]. */
+ public fun values(): List<FontStyle> = listOf(Normal, Italic)
+ }
+
+ override fun toString(): String {
+ return when (this) {
+ Normal -> "Normal"
+ Italic -> "Italic"
+ else -> "Invalid"
+ }
+ }
+}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/text/FontWeight.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/text/FontWeight.kt
new file mode 100644
index 0000000..e12db90
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/text/FontWeight.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.text
+
+/**
+ * Weight of a font.
+ */
+@Suppress("INLINE_CLASS_DEPRECATED")
+public inline class FontWeight private constructor(
+ /** numerical value for the weight (a number from 0 to 1000) **/
+ val value: Int,
+) {
+ public companion object {
+ public val Normal: FontWeight = FontWeight(400)
+ public val Medium: FontWeight = FontWeight(500)
+ public val Bold: FontWeight = FontWeight(700)
+ }
+}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextAlign.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextAlign.kt
new file mode 100644
index 0000000..fafe439
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextAlign.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.text
+
+/**
+ * Defines the alignment of the text in its view.
+ */
+@Suppress("INLINE_CLASS_DEPRECATED")
+public inline class TextAlign internal constructor(private val value: Int) {
+ override fun toString(): String {
+ return when (this) {
+ Left -> "Left"
+ Right -> "Right"
+ Center -> "Center"
+ Start -> "Start"
+ End -> "End"
+ else -> "Invalid"
+ }
+ }
+
+ companion object {
+ /** Align the text on the left edge of the container. */
+ val Left = TextAlign(1)
+
+ /** Align the text on the right edge of the container. */
+ val Right = TextAlign(2)
+
+ /** Align the text in the center of the container. */
+ val Center = TextAlign(3)
+
+ /**
+ * Align the text on the leading edge of the container.
+ *
+ * For Left to Right text, this is the left edge.
+ *
+ * For Right to Left text, like Arabic, this is the right edge.
+ */
+ val Start = TextAlign(4)
+
+ /**
+ * Align the text on the trailing edge of the container.
+ *
+ * For Left to Right text, this is the right edge.
+ *
+ * For Right to Left text, like Arabic, this is the left edge.
+ */
+ val End = TextAlign(5)
+
+ /**
+ * Return a list containing all possible values of TextAlign.
+ */
+ fun values(): List<TextAlign> = listOf(Left, Right, Center, Start, End)
+ }
+}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextDecoration.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextDecoration.kt
new file mode 100644
index 0000000..00c6722
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextDecoration.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.text
+
+import androidx.compose.runtime.Stable
+
+/**
+ * Defines a horizontal line to be drawn on the text.
+ */
+@Suppress("INLINE_CLASS_DEPRECATED")
+public inline class TextDecoration internal constructor(private val mask: Int) {
+ public companion object {
+ public val None: TextDecoration = TextDecoration(0x0)
+
+ /**
+ * Draws a horizontal line below the text.
+ */
+ public val Underline: TextDecoration = TextDecoration(0x1)
+
+ /**
+ * Draws a horizontal line over the text.
+ *
+ * Note: This will have no effect if used on Wear Tiles.
+ */
+ public val LineThrough: TextDecoration = TextDecoration(0x2)
+
+ /**
+ * Creates a decoration that includes all the given decorations.
+ *
+ * @param decorations The decorations to be added
+ */
+ public fun combine(decorations: List<TextDecoration>): TextDecoration {
+ val mask = decorations.fold(0) { acc, decoration ->
+ acc or decoration.mask
+ }
+ return TextDecoration(mask)
+ }
+ }
+ /**
+ * Creates a decoration that includes both of the TextDecorations.
+ */
+ @Stable
+ public operator fun plus(decoration: TextDecoration): TextDecoration {
+ return TextDecoration(this.mask or decoration.mask)
+ }
+
+ /**
+ * Check whether this [TextDecoration] contains the given decoration.
+ */
+ @Stable
+ public operator fun contains(other: TextDecoration): Boolean {
+ return (mask or other.mask) == mask
+ }
+
+ override fun toString(): String {
+ if (mask == 0) {
+ return "TextDecoration.None"
+ }
+
+ val values: MutableList<String> = mutableListOf()
+ if ((mask and Underline.mask) != 0) {
+ values.add("Underline")
+ }
+ if ((mask and LineThrough.mask) != 0) {
+ values.add("LineThrough")
+ }
+ if ((values.size == 1)) {
+ return "TextDecoration.${values[0]}"
+ }
+ return "TextDecoration[${values.joinToString(separator = ", ")}]"
+ }
+}
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt
new file mode 100644
index 0000000..5123c3f
--- /dev/null
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/text/TextStyle.kt
@@ -0,0 +1,60 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.glance.text
+
+import androidx.compose.runtime.Immutable
+import androidx.glance.unit.Sp
+
+/**
+ * Description of a text style for the [androidx.glance.layout.Text] composable.
+ */
+@Immutable
+public class TextStyle(
+ public val fontSize: Sp? = null,
+ public val fontWeight: FontWeight? = null,
+ public val fontStyle: FontStyle? = null,
+ public val textAlign: TextAlign? = null,
+ public val textDecoration: TextDecoration? = null,
+) {
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as TextStyle
+
+ if (fontSize != other.fontSize) return false
+ if (fontWeight != other.fontWeight) return false
+ if (fontStyle != other.fontStyle) return false
+ if (textDecoration != other.textDecoration) return false
+ if (textAlign != other.textAlign) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = fontSize.hashCode()
+ result = 31 * result + fontWeight.hashCode()
+ result = 31 * result + fontStyle.hashCode()
+ result = 31 * result + textDecoration.hashCode()
+ result = 31 * result + textAlign.hashCode()
+ return result
+ }
+
+ override fun toString() =
+ "TextStyle(fontSize=$fontSize, fontWeight=$fontWeight, fontStyle=$fontStyle, " +
+ "textDecoration=$textDecoration, textAlign=$textAlign)"
+}
diff --git a/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt b/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt
index 7184429..87679fb7 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/ApplierTest.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -20,10 +19,9 @@
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import org.junit.Test
-import java.lang.IllegalArgumentException
import kotlin.test.assertFailsWith
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class ApplierTest {
@Test
@@ -108,6 +106,28 @@
)
}
+ @Test
+ fun resetDepth() {
+ val root = RootEmittable(maxDepth = 1)
+ val applier = Applier(root)
+
+ applier.insertTopDown(0, LeafEmittable())
+ val r = ResetsDepthEmittable()
+ applier.insertTopDown(1, r)
+ applier.down(r)
+ val m = MiddleEmittable()
+ applier.insertTopDown(0, m)
+ applier.down(m)
+
+ val ex = assertFailsWith<IllegalArgumentException> {
+ applier.insertTopDown(0, LeafEmittable())
+ }
+
+ assertThat(ex.message).isEqualTo(
+ "Too many embedded views for the current surface. The maximum depth is: 1"
+ )
+ }
+
private companion object {
fun updateApplier(applier: Applier) {
val middle = MiddleEmittable()
@@ -131,3 +151,7 @@
private class LeafEmittable : Emittable {
override var modifier: Modifier = Modifier
}
+
+private class ResetsDepthEmittable : EmittableWithChildren(resetsDepthForChildren = true) {
+ override var modifier: Modifier = Modifier
+}
diff --git a/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt b/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
index 2737436..0eb4918 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/action/ActionTest.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -17,7 +16,6 @@
package androidx.glance.action
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import org.junit.Test
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt
index 4c7f9d9..57d3a5f 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/BoxTest.kt
@@ -16,7 +16,6 @@
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.unit.dp
@@ -26,8 +25,9 @@
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Test
+import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class BoxTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -44,10 +44,10 @@
// Outer box (added by runTestingComposition) should have a single child box.
assertThat(root.children).hasSize(1)
- assertThat(root.children[0]).isInstanceOf(EmittableBox::class.java)
+ val child = assertIs<EmittableBox>(root.children[0])
// The Box added above should not have any other children.
- assertThat((root.children[0] as EmittableBox).children).hasSize(0)
+ assertThat(child.children).hasSize(0)
}
@Test
@@ -56,7 +56,7 @@
Box(modifier = Modifier.padding(1.dp)) {}
}
- val innerBox = root.children[0] as EmittableBox
+ val innerBox = assertIs<EmittableBox>(root.children[0])
val paddingModifier = requireNotNull(innerBox.modifier.findModifier<PaddingModifier>())
// Don't need to test all elements, that's covered in PaddingTest
@@ -69,7 +69,7 @@
Box(contentAlignment = Alignment.Center) {}
}
- val innerBox = root.children[0] as EmittableBox
+ val innerBox = assertIs<EmittableBox>(root.children[0])
assertThat(innerBox.contentAlignment).isEqualTo(Alignment.Center)
}
@@ -83,12 +83,12 @@
}
}
- val innerBox = root.children[0] as EmittableBox
+ val innerBox = assertIs<EmittableBox>(root.children[0])
assertThat(innerBox.children).hasSize(2)
- val leafBox0 = innerBox.children[0] as EmittableBox
- val leafBox1 = innerBox.children[1] as EmittableBox
+ val leafBox0 = assertIs<EmittableBox>(innerBox.children[0])
+ val leafBox1 = assertIs<EmittableBox>(innerBox.children[1])
assertThat(leafBox0.contentAlignment).isEqualTo(Alignment.BottomCenter)
assertThat(leafBox1.contentAlignment).isEqualTo(Alignment.TopCenter)
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt
index 80532e9..d7bc3c6 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/ColumnTest.kt
@@ -16,7 +16,6 @@
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.unit.dp
@@ -26,8 +25,9 @@
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Test
+import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class ColumnTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -43,8 +43,8 @@
}
assertThat(root.children).hasSize(1)
- assertThat(root.children[0]).isInstanceOf(EmittableColumn::class.java)
- assertThat((root.children[0] as EmittableColumn).children).hasSize(0)
+ val column = assertIs<EmittableColumn>(root.children[0])
+ assertThat(column.children).hasSize(0)
}
@Test
@@ -57,7 +57,7 @@
) {}
}
- val innerColumn = root.children[0] as EmittableColumn
+ val innerColumn = assertIs<EmittableColumn>(root.children[0])
val paddingModifier = requireNotNull(innerColumn.modifier.findModifier<PaddingModifier>())
assertThat(paddingModifier.top).isEqualTo(2.dp)
assertThat(innerColumn.horizontalAlignment).isEqualTo(Alignment.CenterHorizontally)
@@ -65,7 +65,7 @@
}
@Test
- fun createComposableRowWithChildren() = fakeCoroutineScope.runBlockingTest {
+ fun createComposableColumnWithChildren() = fakeCoroutineScope.runBlockingTest {
val root = runTestingComposition {
Column {
Box(contentAlignment = Alignment.BottomCenter) {}
@@ -73,11 +73,27 @@
}
}
- val innerColumn = root.children[0] as EmittableColumn
- val leafBox0 = innerColumn.children[0] as EmittableBox
- val leafBox1 = innerColumn.children[1] as EmittableBox
+ val innerColumn = assertIs<EmittableColumn>(root.children[0])
+ val leafBox0 = assertIs<EmittableBox>(innerColumn.children[0])
+ val leafBox1 = assertIs<EmittableBox>(innerColumn.children[1])
assertThat(leafBox0.contentAlignment).isEqualTo(Alignment.BottomCenter)
assertThat(leafBox1.contentAlignment).isEqualTo(Alignment.TopCenter)
}
+
+ @Test
+ fun createComposableColumnWithWeightChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ Column {
+ Box(modifier = Modifier.defaultWeight()) { }
+ }
+ }
+
+ val column = assertIs<EmittableColumn>(root.children[0])
+ val box = assertIs<EmittableBox>(column.children[0])
+
+ val heightModifier = checkNotNull(box.modifier.findModifier<HeightModifier>())
+ assertThat(heightModifier.height).isSameInstanceAs(Dimension.Expand)
+ assertThat(box.modifier.findModifier<WidthModifier>()).isNull()
+ }
}
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt
index 394c9de..398c936 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/DimensionTest.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -17,12 +16,12 @@
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.unit.dp
import com.google.common.truth.Truth.assertThat
import org.junit.Test
+import kotlin.test.assertIs
class DimensionTest {
@Test
@@ -31,24 +30,24 @@
val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
- val width = widthModifier.width as Dimension.Dp
+ val width = assertIs<Dimension.Dp>(widthModifier.width)
assertThat(width.dp).isEqualTo(5.dp)
}
@Test
fun wrapWidthModifier() {
- val modifier = Modifier.wrapWidth()
+ val modifier = Modifier.wrapContentWidth()
val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
- assertThat(widthModifier.width).isInstanceOf(Dimension.Wrap::class.java)
+ assertThat(widthModifier.width).isSameInstanceAs(Dimension.Wrap)
}
@Test
- fun expandWidthModifier() {
- val modifier = Modifier.expandWidth()
+ fun fillMaxWidthModifier() {
+ val modifier = Modifier.fillMaxWidth()
val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
- assertThat(widthModifier.width).isInstanceOf(Dimension.Expand::class.java)
+ assertThat(widthModifier.width).isSameInstanceAs(Dimension.Fill)
}
@Test
@@ -57,24 +56,24 @@
val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
- val height = heightModifier.height as Dimension.Dp
+ val height = assertIs<Dimension.Dp>(heightModifier.height)
assertThat(height.dp).isEqualTo(5.dp)
}
@Test
fun wrapHeightModifier() {
- val modifier = Modifier.wrapHeight()
+ val modifier = Modifier.wrapContentHeight()
val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
assertThat(heightModifier.height).isInstanceOf(Dimension.Wrap::class.java)
}
@Test
- fun expandHeightModifier() {
- val modifier = Modifier.expandHeight()
+ fun fillMaxHeightModifier() {
+ val modifier = Modifier.fillMaxHeight()
val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
- assertThat(heightModifier.height).isInstanceOf(Dimension.Expand::class.java)
+ assertThat(heightModifier.height).isSameInstanceAs(Dimension.Fill)
}
@Test
@@ -84,8 +83,8 @@
val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
- val width = widthModifier.width as Dimension.Dp
- val height = heightModifier.height as Dimension.Dp
+ val width = assertIs<Dimension.Dp>(widthModifier.width)
+ val height = assertIs<Dimension.Dp>(heightModifier.height)
assertThat(width.dp).isEqualTo(1.dp)
assertThat(height.dp).isEqualTo(2.dp)
@@ -98,10 +97,32 @@
val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
- val width = widthModifier.width as Dimension.Dp
- val height = heightModifier.height as Dimension.Dp
+ val width = assertIs<Dimension.Dp>(widthModifier.width)
+ val height = assertIs<Dimension.Dp>(heightModifier.height)
assertThat(width.dp).isEqualTo(10.dp)
assertThat(height.dp).isEqualTo(10.dp)
}
+
+ @Test
+ fun fillMaxSizeModifier() {
+ val modifier = Modifier.fillMaxSize()
+
+ val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
+ val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
+
+ assertThat(widthModifier.width).isSameInstanceAs(Dimension.Fill)
+ assertThat(heightModifier.height).isSameInstanceAs(Dimension.Fill)
+ }
+
+ @Test
+ fun wrapContentSizeModifier() {
+ val modifier = Modifier.wrapContentSize()
+
+ val widthModifier = checkNotNull(modifier.findModifier<WidthModifier>())
+ val heightModifier = checkNotNull(modifier.findModifier<HeightModifier>())
+
+ assertThat(widthModifier.width).isSameInstanceAs(Dimension.Wrap)
+ assertThat(heightModifier.height).isSameInstanceAs(Dimension.Wrap)
+ }
}
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt
index 51d72a1..bd098c4 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/PaddingTest.kt
@@ -1,4 +1,3 @@
-@file:OptIn(GlanceInternalApi::class)
/*
* Copyright 2021 The Android Open Source Project
*
@@ -16,7 +15,6 @@
*/
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.unit.dp
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt
index 44296f3..5b777f8 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/RowTest.kt
@@ -16,7 +16,6 @@
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
import androidx.glance.unit.dp
@@ -26,8 +25,9 @@
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Test
+import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class RowTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -80,4 +80,20 @@
assertThat(leafBox0.contentAlignment).isEqualTo(Alignment.BottomCenter)
assertThat(leafBox1.contentAlignment).isEqualTo(Alignment.TopCenter)
}
+
+ @Test
+ fun createComposableRowWithWeightChildren() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ Row {
+ Box(modifier = Modifier.defaultWeight()) { }
+ }
+ }
+
+ val row = assertIs<EmittableRow>(root.children[0])
+ val box = assertIs<EmittableBox>(row.children[0])
+
+ val widthModifier = checkNotNull(box.modifier.findModifier<WidthModifier>())
+ assertThat(widthModifier.width).isSameInstanceAs(Dimension.Expand)
+ assertThat(box.modifier.findModifier<HeightModifier>()).isNull()
+ }
}
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt
index 2cdf56b..dfc925f 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/TextTest.kt
@@ -16,9 +16,13 @@
package androidx.glance.layout
-import androidx.glance.GlanceInternalApi
import androidx.glance.Modifier
import androidx.glance.findModifier
+import androidx.glance.text.FontStyle
+import androidx.glance.text.FontWeight
+import androidx.glance.text.TextAlign
+import androidx.glance.text.TextDecoration
+import androidx.glance.text.TextStyle
import androidx.glance.unit.sp
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -26,8 +30,9 @@
import kotlinx.coroutines.test.runBlockingTest
import org.junit.Before
import org.junit.Test
+import kotlin.test.assertIs
-@OptIn(GlanceInternalApi::class, ExperimentalCoroutinesApi::class)
+@OptIn(ExperimentalCoroutinesApi::class)
class TextTest {
private lateinit var fakeCoroutineScope: TestCoroutineScope
@@ -43,8 +48,8 @@
}
assertThat(root.children).hasSize(1)
- assertThat(root.children[0]).isInstanceOf(EmittableText::class.java)
- assertThat((root.children[0] as EmittableText).text).isEqualTo("text")
+ val text = assertIs<EmittableText>(root.children[0])
+ assertThat(text.text).isEqualTo("text")
}
@Test
@@ -61,8 +66,7 @@
}
assertThat(root.children).hasSize(1)
- assertThat(root.children[0]).isInstanceOf(EmittableText::class.java)
- val text = root.children[0] as EmittableText
+ val text = assertIs<EmittableText>(root.children[0])
assertThat(text.text).isEqualTo("text")
assertThat(text.style)
.isEqualTo(
@@ -77,13 +81,13 @@
@Test
fun createComposableTextWithModifiers() = fakeCoroutineScope.runBlockingTest {
val root = runTestingComposition {
- Text("text", modifier = Modifier.expandWidth())
+ Text("text", modifier = Modifier.fillMaxWidth())
}
assertThat(root.children).hasSize(1)
- assertThat(root.children[0]).isInstanceOf(EmittableText::class.java)
- assertThat(root.children[0].modifier.findModifier<WidthModifier>()?.width)
- .isEqualTo(Dimension.Expand)
+ val text = assertIs<EmittableText>(root.children[0])
+ assertThat(text.modifier.findModifier<WidthModifier>()?.width)
+ .isEqualTo(Dimension.Fill)
}
@Test
@@ -100,4 +104,15 @@
assertThat(TextDecoration.LineThrough in combined).isTrue()
assertThat(TextDecoration.Underline in combined).isTrue()
}
+
+ @Test
+ fun textAlign() = fakeCoroutineScope.runBlockingTest {
+ val root = runTestingComposition {
+ Text("text", style = TextStyle(textAlign = TextAlign.Center))
+ }
+
+ assertThat(root.children).hasSize(1)
+ val child = assertIs<EmittableText>(root.children[0])
+ assertThat(child.style?.textAlign).isEqualTo(TextAlign.Center)
+ }
}
\ No newline at end of file
diff --git a/glance/glance/src/test/kotlin/androidx/glance/layout/Utils.kt b/glance/glance/src/test/kotlin/androidx/glance/layout/Utils.kt
index b905668..1d3fbf5 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/layout/Utils.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/layout/Utils.kt
@@ -21,12 +21,10 @@
import androidx.compose.runtime.Composition
import androidx.compose.runtime.Recomposer
import androidx.glance.Applier
-import androidx.glance.GlanceInternalApi
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.currentCoroutineContext
import kotlinx.coroutines.launch
-@OptIn(GlanceInternalApi::class)
suspend fun runTestingComposition(content: @Composable () -> Unit): EmittableBox = coroutineScope {
val root = EmittableBox()
val applier = Applier(root)
diff --git a/gradle.properties b/gradle.properties
index be3d836..d2f6174 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -4,6 +4,9 @@
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.vfs.watch=true
+org.gradle.unsafe.configuration-cache=true
+org.gradle.unsafe.configuration-cache-problems=warn
+org.gradle.unsafe.configuration-cache.max-problems=4000
android.builder.sdkDownload=false
android.uniquePackageNames=false
diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml
index 981dffc..0770a51 100644
--- a/gradle/libs.versions.toml
+++ b/gradle/libs.versions.toml
@@ -13,8 +13,12 @@
androidLintMin = "27.2.1"
androidLintMinCompose = "30.0.0"
-androidxTest = "1.4.0"
-androidxTestExt = "1.1.3-beta01"
+androidxTestRunner = "1.4.0"
+androidxTestRules = "1.4.0"
+androidxTestMonitor = "1.4.0"
+androidxTestCore = "1.4.0"
+androidxTestExtJunit = "1.1.3"
+androidxTestExtTruth = "1.4.0"
atomicFu = "0.14.4"
autoService = "1.0-rc6"
autoValue = "1.6.3"
@@ -24,13 +28,14 @@
guavaJre = "29.0-jre"
hilt = "2.38.1"
incap = "0.2"
-kotlin = "1.5.30"
+kotlin = "1.5.31"
kotlinCompileTesting = "1.4.1"
kotlinCoroutines = "1.5.0"
-ksp = "1.5.30-1.0.0"
-leakcanary = "2.2"
+ksp = "1.5.31-1.0.0"
+ktlint = "0.42.1"
+leakcanary = "2.7"
mockito = "2.25.0"
-skiko = "0.4.7"
+skiko = "0.4.12"
sqldelight = "1.3.0"
wire = "3.6.0"
@@ -153,13 +158,13 @@
sqldelightAndroid = { module = "com.squareup.sqldelight:android-driver", version.ref = "sqldelight" }
sqldelightCoroutinesExt = { module = "com.squareup.sqldelight:coroutines-extensions", version.ref = "sqldelight" }
sqliteJdbc = { module = "org.xerial:sqlite-jdbc", version = "3.36.0" }
-testCore = { module = "androidx.test:core", version.ref = "androidxTest" }
-testExtJunit = { module = "androidx.test.ext:junit", version.ref = "androidxTestExt" }
-testExtJunitKtx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidxTestExt" }
-testExtTruth = { module = "androidx.test.ext:truth", version.ref = "androidxTest" }
-testMonitor = { module = "androidx.test:monitor", version.ref = "androidxTest" }
-testRules = { module = "androidx.test:rules", version.ref = "androidxTest" }
-testRunner = { module = "androidx.test:runner", version.ref = "androidxTest" }
+testCore = { module = "androidx.test:core", version.ref = "androidxTestCore" }
+testExtJunit = { module = "androidx.test.ext:junit", version.ref = "androidxTestExtJunit" }
+testExtJunitKtx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidxTestExtJunit" }
+testExtTruth = { module = "androidx.test.ext:truth", version.ref = "androidxTestExtTruth" }
+testMonitor = { module = "androidx.test:monitor", version.ref = "androidxTestMonitor" }
+testRules = { module = "androidx.test:rules", version.ref = "androidxTestRules" }
+testRunner = { module = "androidx.test:runner", version.ref = "androidxTestRunner" }
testUiautomator = { module = "androidx.test.uiautomator:uiautomator", version = "2.2.0" }
truth = { module = "com.google.truth:truth", version = "1.0.1" }
viewBinding = { module = "androidx.databinding:viewbinding", version = "4.1.2" }
diff --git a/gradlew b/gradlew
index eb5905f..bbc6b8f2 100755
--- a/gradlew
+++ b/gradlew
@@ -230,14 +230,28 @@
cleanCaches=false
fi
+if [[ " ${@} " =~ " --no-ci " ]]; then
+ disableCi=true
+else
+ disableCi=false
+fi
+
+# workaround for https://github.com/gradle/gradle/issues/18386
+if [[ " ${@} " =~ " --profile " ]]; then
+ mkdir -p reports
+fi
+
# Expand some arguments
-for compact in "--ci" "--strict" "--clean"; do
+for compact in "--ci" "--strict" "--clean" "--no-ci"; do
+ expanded=""
if [ "$compact" == "--ci" ]; then
- expanded="--strict\
- --stacktrace\
- -Pandroidx.summarizeStderr\
- -Pandroidx.enableAffectedModuleDetection\
- --no-watch-fs"
+ if [ "$disableCi" == "false" ]; then
+ expanded="--strict\
+ --stacktrace\
+ -Pandroidx.summarizeStderr\
+ -Pandroidx.enableAffectedModuleDetection\
+ --no-watch-fs"
+ fi
fi
if [ "$compact" == "--strict" ]; then
expanded="-Pandroidx.allWarningsAsErrors\
@@ -247,9 +261,8 @@
--no-daemon\
--offline"
fi
- if [ "$compact" == "--clean" ]; then
- expanded="" # we parsed the argument above but we still have to remove it to avoid confusing Gradle
- fi
+ # if compact is something else then we parsed the argument above but
+ # still have to remove it (expanded == "") to avoid confusing Gradle
# check whether this particular compat argument was passed (and therefore needs expansion)
if [[ " ${@} " =~ " $compact " ]]; then
@@ -281,6 +294,14 @@
fi
done
+if [[ " ${@} " =~ " --scan " ]]; then
+ if [[ " ${@} " =~ " --offline " ]]; then
+ echo "--scan incompatible with --offline"
+ echo "you could try --no-ci"
+ exit 1
+ fi
+fi
+
function removeCaches() {
rm -rf $SCRIPT_PATH/.gradle
rm -rf $SCRIPT_PATH/buildSrc/.gradle
@@ -290,10 +311,9 @@
else
rm -rf ~/.gradle
fi
- # AGP should (also) do this automatically (b/170640263)
- rm -rf $SCRIPT_PATH/appsearch/appsearch/.cxx
- rm -rf $SCRIPT_PATH/appsearch/local-backend/.cxx
- rm -rf $SCRIPT_PATH/appsearch/local-storage/.cxx
+ # https://github.com/gradle/gradle/issues/18386
+ rm -rf $SCRIPT_PATH/reports
+ rm -rf $SCRIPT_PATH/build
rm -rf $OUT_DIR
}
diff --git a/hilt/hilt-navigation-compose/build.gradle b/hilt/hilt-navigation-compose/build.gradle
index 6f571ee..b408b03 100644
--- a/hilt/hilt-navigation-compose/build.gradle
+++ b/hilt/hilt-navigation-compose/build.gradle
@@ -54,6 +54,8 @@
kaptAndroidTest(libs.hiltCompiler)
androidTestImplementation projectOrArtifact(":compose:material:material")
androidTestImplementation projectOrArtifact(":compose:test-utils")
+
+ samples(projectOrArtifact(":hilt:hilt-navigation-compose-samples"))
}
hilt {
diff --git a/leanback/leanback/src/main/res/values-te/strings.xml b/leanback/leanback/src/main/res/values-te/strings.xml
index e56c5cb..6b06070 100644
--- a/leanback/leanback/src/main/res/values-te/strings.xml
+++ b/leanback/leanback/src/main/res/values-te/strings.xml
@@ -18,11 +18,11 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<string name="lb_navigation_menu_contentDescription" msgid="8084428500709675515">"నావిగేషన్ మెనూ"</string>
- <string name="orb_search_action" msgid="1301877238242752863">"శోధన చర్య"</string>
- <string name="lb_search_bar_hint" msgid="5700349211583074131">"సెర్చ్"</string>
- <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"శోధించడానికి మాటల ద్వారా చెప్పండి"</string>
+ <string name="orb_search_action" msgid="1301877238242752863">"సెర్చ్ చర్య"</string>
+ <string name="lb_search_bar_hint" msgid="5700349211583074131">"సెర్చ్ చేయండి"</string>
+ <string name="lb_search_bar_hint_speech" msgid="5926531297066387462">"మాటలతో సెర్చ్ చేయండి"</string>
<string name="lb_search_bar_hint_with_title" msgid="4826526877249029043">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g> కోసం వెతకండి"</string>
- <string name="lb_search_bar_hint_with_title_speech" msgid="6032250334706920550">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>లో శోధించడానికి మాటల ద్వారా చెప్పండి"</string>
+ <string name="lb_search_bar_hint_with_title_speech" msgid="6032250334706920550">"<xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>లో సెర్చ్ చేయడానికి మాటల్లో చెప్పండి"</string>
<string name="lb_control_display_fast_forward_multiplier" msgid="4657191930956702614">"%1$dX"</string>
<string name="lb_control_display_rewind_multiplier" msgid="4597148235912710942">"%1$dX"</string>
<string name="lb_playback_controls_play" msgid="7088090604803481121">"ప్లే చేయి"</string>
diff --git a/lifecycle/lifecycle-viewmodel-compose/build.gradle b/lifecycle/lifecycle-viewmodel-compose/build.gradle
index d389e76..1285491 100644
--- a/lifecycle/lifecycle-viewmodel-compose/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-compose/build.gradle
@@ -17,6 +17,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
import androidx.build.RunApiTasks
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -43,6 +44,8 @@
androidTestImplementation "androidx.fragment:fragment:1.3.0"
androidTestImplementation "androidx.appcompat:appcompat:1.3.0"
androidTestImplementation projectOrArtifact(":activity:activity-compose")
+
+ samples(projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose:lifecycle-viewmodel-compose-samples"))
}
androidx {
@@ -53,3 +56,15 @@
description = "Compose integration with Lifecycle ViewModel"
runApiTasks = new RunApiTasks.Yes()
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/current.ignore b/lifecycle/lifecycle-viewmodel-savedstate/api/current.ignore
new file mode 100644
index 0000000..be07271
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/current.ignore
@@ -0,0 +1,3 @@
+// Baseline format: 1.0
+RemovedMethod: androidx.lifecycle.SavedStateViewModelFactory#create(Class<T>):
+ Removed method androidx.lifecycle.SavedStateViewModelFactory.create(Class<T>)
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
index f830aba..1447260 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/current.txt
@@ -25,7 +25,6 @@
ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner);
ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
method public <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
}
}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
index f830aba..1447260 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-viewmodel-savedstate/api/public_plus_experimental_current.txt
@@ -25,7 +25,6 @@
ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner);
ctor public SavedStateViewModelFactory(android.app.Application?, androidx.savedstate.SavedStateRegistryOwner, android.os.Bundle?);
method public <T extends androidx.lifecycle.ViewModel> T create(String, Class<T!>);
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T!>);
}
}
diff --git a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
index 85e49e0..7f9470d 100644
--- a/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
+++ b/lifecycle/lifecycle-viewmodel-savedstate/build.gradle
@@ -38,18 +38,8 @@
androidTestImplementation projectOrArtifact(":lifecycle:lifecycle-runtime")
androidTestImplementation projectOrArtifact(":lifecycle:lifecycle-livedata-core")
- androidTestImplementation ("androidx.fragment:fragment:1.3.0") {
- exclude group: "androidx.lifecycle", module: "lifecycle-runtime"
- exclude group: "androidx.lifecycle", module: "lifecycle-livedata-core"
- exclude group: "androidx.lifecycle", module: "lifecycle-viewmodel-savedstate"
- exclude group: "androidx.lifecycle", module: "lifecycle-viewmodel"
- }
- androidTestImplementation project(":internal-testutils-runtime"), {
- exclude group: "androidx.lifecycle", module: "lifecycle-runtime"
- exclude group: "androidx.lifecycle", module: "lifecycle-livedata-core"
- exclude group: "androidx.lifecycle", module: "lifecycle-viewmodel-savedstate"
- exclude group: "androidx.lifecycle", module: "lifecycle-viewmodel"
- }
+ androidTestImplementation ("androidx.fragment:fragment:1.3.0")
+ androidTestImplementation project(":internal-testutils-runtime")
androidTestImplementation(libs.truth)
androidTestImplementation(libs.kotlinStdlib)
androidTestImplementation(libs.testExtJunit)
diff --git a/lifecycle/lifecycle-viewmodel/api/current.txt b/lifecycle/lifecycle-viewmodel/api/current.txt
index b2a64d8..d63c190 100644
--- a/lifecycle/lifecycle-viewmodel/api/current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/current.txt
@@ -41,13 +41,14 @@
}
public static interface ViewModelProvider.Factory {
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+ method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+ method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass, androidx.lifecycle.viewmodel.CreationExtras extras);
}
public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion;
+ field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<java.lang.String> VIEW_MODEL_KEY;
}
public static final class ViewModelProvider.NewInstanceFactory.Companion {
@@ -77,3 +78,20 @@
}
+package androidx.lifecycle.viewmodel {
+
+ public interface CreationExtras {
+ method public operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+ }
+
+ public static interface CreationExtras.Key<T> {
+ }
+
+ public final class MutableCreationExtras implements androidx.lifecycle.viewmodel.CreationExtras {
+ ctor public MutableCreationExtras();
+ method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+ method public operator <T> void set(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key, T? t);
+ }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
index b2a64d8..d63c190 100644
--- a/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/public_plus_experimental_current.txt
@@ -41,13 +41,14 @@
}
public static interface ViewModelProvider.Factory {
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+ method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+ method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass, androidx.lifecycle.viewmodel.CreationExtras extras);
}
public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion;
+ field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<java.lang.String> VIEW_MODEL_KEY;
}
public static final class ViewModelProvider.NewInstanceFactory.Companion {
@@ -77,3 +78,20 @@
}
+package androidx.lifecycle.viewmodel {
+
+ public interface CreationExtras {
+ method public operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+ }
+
+ public static interface CreationExtras.Key<T> {
+ }
+
+ public final class MutableCreationExtras implements androidx.lifecycle.viewmodel.CreationExtras {
+ ctor public MutableCreationExtras();
+ method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+ method public operator <T> void set(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key, T? t);
+ }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
index b2a64d8..d63c190 100644
--- a/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
+++ b/lifecycle/lifecycle-viewmodel/api/restricted_current.txt
@@ -41,13 +41,14 @@
}
public static interface ViewModelProvider.Factory {
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+ method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
+ method public default <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass, androidx.lifecycle.viewmodel.CreationExtras extras);
}
public static class ViewModelProvider.NewInstanceFactory implements androidx.lifecycle.ViewModelProvider.Factory {
ctor public ViewModelProvider.NewInstanceFactory();
- method public <T extends androidx.lifecycle.ViewModel> T create(Class<T> modelClass);
field public static final androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion Companion;
+ field public static final androidx.lifecycle.viewmodel.CreationExtras.Key<java.lang.String> VIEW_MODEL_KEY;
}
public static final class ViewModelProvider.NewInstanceFactory.Companion {
@@ -77,3 +78,20 @@
}
+package androidx.lifecycle.viewmodel {
+
+ public interface CreationExtras {
+ method public operator <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+ }
+
+ public static interface CreationExtras.Key<T> {
+ }
+
+ public final class MutableCreationExtras implements androidx.lifecycle.viewmodel.CreationExtras {
+ ctor public MutableCreationExtras();
+ method public <T> T? get(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key);
+ method public operator <T> void set(androidx.lifecycle.viewmodel.CreationExtras.Key<T> key, T? t);
+ }
+
+}
+
diff --git a/lifecycle/lifecycle-viewmodel/build.gradle b/lifecycle/lifecycle-viewmodel/build.gradle
index 575ce58..e48ccd6 100644
--- a/lifecycle/lifecycle-viewmodel/build.gradle
+++ b/lifecycle/lifecycle-viewmodel/build.gradle
@@ -17,6 +17,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -52,3 +53,11 @@
inceptionYear = "2017"
description = "Android Lifecycle ViewModel"
}
+
+tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=all",
+ ]
+ }
+}
diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
index 82a33cc..f933a72 100644
--- a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
+++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/ViewModelProvider.kt
@@ -20,6 +20,10 @@
import androidx.annotation.RestrictTo
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.DEFAULT_KEY
import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory.Companion.defaultFactory
+import androidx.lifecycle.viewmodel.CreationExtras.Key
+import androidx.lifecycle.ViewModelProvider.NewInstanceFactory.Companion.VIEW_MODEL_KEY
+import androidx.lifecycle.viewmodel.CreationExtras
+import androidx.lifecycle.viewmodel.MutableCreationExtras
import java.lang.IllegalArgumentException
import java.lang.RuntimeException
import java.lang.UnsupportedOperationException
@@ -46,10 +50,27 @@
/**
* Creates a new instance of the given `Class`.
*
+ * Default implementation throws [UnsupportedOperationException].
+ *
* @param modelClass a `Class` whose instance is requested
* @return a newly created ViewModel
*/
- public fun <T : ViewModel> create(modelClass: Class<T>): T
+ public fun <T : ViewModel> create(modelClass: Class<T>): T {
+ throw UnsupportedOperationException(
+ "Factory.create(String) is unsupported. This Factory requires " +
+ "`CreationExtras` to be passed into `create` method."
+ )
+ }
+
+ /**
+ * Creates a new instance of the given `Class`.
+ *
+ * @param modelClass a `Class` whose instance is requested
+ * @param extras an additional information for this creation request
+ * @return a newly created ViewModel
+ */
+ public fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T =
+ create(modelClass)
}
/**
@@ -83,6 +104,10 @@
modelClass: Class<T>
): T
+ override fun <T : ViewModel> create(modelClass: Class<T>, extras: CreationExtras): T {
+ return create(extras[VIEW_MODEL_KEY]!!, modelClass)
+ }
+
override fun <T : ViewModel> create(modelClass: Class<T>): T {
throw UnsupportedOperationException(
"create(String, Class<?>) must be called on implementations of KeyedFactory"
@@ -155,7 +180,7 @@
@Suppress("UNCHECKED_CAST")
@MainThread
public open operator fun <T : ViewModel> get(key: String, modelClass: Class<T>): T {
- var viewModel = store[key]
+ val viewModel = store[key]
if (modelClass.isInstance(viewModel)) {
(factory as? OnRequeryFactory)?.onRequery(viewModel)
return viewModel as T
@@ -165,13 +190,9 @@
// TODO: log a warning.
}
}
- viewModel = if (factory is KeyedFactory) {
- factory.create(key, modelClass)
- } else {
- factory.create(modelClass)
- }
- store.put(key, viewModel)
- return viewModel
+ val extras = MutableCreationExtras()
+ extras[VIEW_MODEL_KEY] = key
+ return factory.create(modelClass, extras).also { store.put(key, it) }
}
/**
@@ -209,6 +230,19 @@
}
return sInstance!!
}
+
+ private object ViewModelKeyImpl : Key<String>
+ /**
+ * A [CreationExtras.Key] to get a key associated with a requested
+ * `ViewModel` from [CreationExtras]
+ *
+ * `ViewModelProvider` automatically puts a key that was passed to
+ * `ViewModelProvider.get(key, MyViewModel::class.java)`
+ * or generated in `ViewModelProvider.get(MyViewModel::class.java)` to the `CreationExtras` that
+ * are passed to [ViewModelProvider.Factory].
+ */
+ @JvmField
+ val VIEW_MODEL_KEY: Key<String> = ViewModelKeyImpl
}
}
diff --git a/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
new file mode 100644
index 0000000..ceb94a4
--- /dev/null
+++ b/lifecycle/lifecycle-viewmodel/src/main/java/androidx/lifecycle/viewmodel/CreationExtras.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.lifecycle.viewmodel
+
+/**
+ * Simple map-like object that passed in [ViewModelProvider.Factory.create]
+ * to provide an additional information to a factory.
+ *
+ * It allows making `Factory` implementations stateless, which makes an injection of factories
+ * easier because don't require all information be available at construction time.
+ */
+public interface CreationExtras {
+ /**
+ * Key for the elements of [CreationExtras]. [T] is a type of an element with this key.
+ */
+ public interface Key<T>
+
+ /**
+ * Returns an element associated with the given [key]
+ */
+ public operator fun <T> get(key: Key<T>): T?
+}
+
+/**
+ * Mutable implementation of [CreationExtras]
+ */
+public class MutableCreationExtras : CreationExtras {
+ private val map = mutableMapOf<CreationExtras.Key<*>, Any?>()
+
+ /**
+ * Associates the given [key] with [t]
+ */
+ public operator fun <T> set(key: CreationExtras.Key<T>, t: T) {
+ map[key] = t
+ }
+
+ public override fun <T> get(key: CreationExtras.Key<T>): T? {
+ @Suppress("UNCHECKED_CAST")
+ return map[key] as T?
+ }
+}
diff --git a/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
index 7e20deb..349589f 100644
--- a/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
+++ b/lifecycle/lifecycle-viewmodel/src/test/java/androidx/lifecycle/ViewModelProviderTest.java
@@ -16,12 +16,15 @@
package androidx.lifecycle;
+import static androidx.lifecycle.ViewModelProvider.NewInstanceFactory.VIEW_MODEL_KEY;
+
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.CoreMatchers.notNullValue;
import static org.hamcrest.MatcherAssert.assertThat;
import androidx.annotation.NonNull;
import androidx.lifecycle.ViewModelProvider.NewInstanceFactory;
+import androidx.lifecycle.viewmodel.CreationExtras;
import org.junit.Assert;
import org.junit.Before;
@@ -40,7 +43,7 @@
}
@Test
- public void twoViewModelsWithSameKey() throws Throwable {
+ public void twoViewModelsWithSameKey() {
String key = "the_key";
ViewModel1 vm1 = mViewModelProvider.get(key, ViewModel1.class);
assertThat(vm1.mCleared, is(false));
@@ -51,7 +54,7 @@
@Test
- public void localViewModel() throws Throwable {
+ public void localViewModel() {
class VM extends ViewModel1 {
}
try {
@@ -72,13 +75,7 @@
@Test
public void testOwnedBy() {
final ViewModelStore store = new ViewModelStore();
- ViewModelStoreOwner owner = new ViewModelStoreOwner() {
- @NonNull
- @Override
- public ViewModelStore getViewModelStore() {
- return store;
- }
- };
+ ViewModelStoreOwner owner = () -> store;
ViewModelProvider provider = new ViewModelProvider(owner, new NewInstanceFactory());
ViewModel1 viewModel = provider.get(ViewModel1.class);
assertThat(viewModel, is(provider.get(ViewModel1.class)));
@@ -98,25 +95,34 @@
@Test
public void testKeyedFactory() {
final ViewModelStore store = new ViewModelStore();
- ViewModelStoreOwner owner = new ViewModelStoreOwner() {
- @NonNull
- @Override
- public ViewModelStore getViewModelStore() {
- return store;
- }
- };
- ViewModelProvider.KeyedFactory keyed = new ViewModelProvider.KeyedFactory() {
+ ViewModelStoreOwner owner = () -> store;
+ ViewModelProvider.Factory explicitlyKeyed = new ViewModelProvider.Factory() {
@SuppressWarnings("unchecked")
@NonNull
@Override
- public <T extends ViewModel> T create(@NonNull String key,
- @NonNull Class<T> modelClass) {
+ public <T extends ViewModel> T create(@NonNull Class<T> modelClass,
+ @NonNull CreationExtras extras) {
+ String key = extras.get(VIEW_MODEL_KEY);
assertThat(key, is("customkey"));
return (T) new ViewModel1();
}
};
- ViewModelProvider provider = new ViewModelProvider(owner, keyed);
+
+ ViewModelProvider provider = new ViewModelProvider(owner, explicitlyKeyed);
provider.get("customkey", ViewModel1.class);
+
+ ViewModelProvider.Factory implicitlyKeyed = new ViewModelProvider.Factory() {
+ @SuppressWarnings("unchecked")
+ @NonNull
+ @Override
+ public <T extends ViewModel> T create(@NonNull Class<T> modelClass,
+ @NonNull CreationExtras extras) {
+ String key = extras.get(VIEW_MODEL_KEY);
+ assertThat(key, is(notNullValue()));
+ return (T) new ViewModel1();
+ }
+ };
+ new ViewModelProvider(owner, implicitlyKeyed).get("customkey", ViewModel1.class);
}
public static class ViewModelStoreOwnerWithFactory implements
diff --git a/lifecycle/settings.gradle b/lifecycle/settings.gradle
index b31de75..dfc598b 100644
--- a/lifecycle/settings.gradle
+++ b/lifecycle/settings.gradle
@@ -15,7 +15,7 @@
*/
// see ../playground-common/README.md for details on how this works
-rootProject.name = "navigation-playground"
+rootProject.name = "lifecycle-playground"
apply from: "../playground-common/playground-include-settings.gradle"
setupPlayground(this, "..")
selectProjectsFromAndroidX({ name ->
diff --git a/lint-checks/integration-tests/build.gradle b/lint-checks/integration-tests/build.gradle
index 9c62fa5..28cc19e 100644
--- a/lint-checks/integration-tests/build.gradle
+++ b/lint-checks/integration-tests/build.gradle
@@ -46,7 +46,7 @@
lintOptions {
// lint is supposed to detect errors in this project
// We don't need to see the errors in stdout
- textOutput("${buildDir}/lint-results-release.txt") // Set to this value for b/189877657
+ textOutput("${buildDir}/lint-results-debug.txt") // Set to this value for b/189877657
// We don't want errors to cause lint to fail
abortOnError false
}
@@ -77,3 +77,10 @@
}
}
}
+
+// workaround for b/189877657
+afterEvaluate {
+ tasks.named("copyDebugAndroidLintReports").configure {
+ enabled = false
+ }
+}
diff --git a/lint-checks/integration-tests/src/main/java/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt b/lint-checks/integration-tests/src/main/java/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt
index ded25ef..d6c1fee 100644
--- a/lint-checks/integration-tests/src/main/java/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt
+++ b/lint-checks/integration-tests/src/main/java/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt
@@ -18,13 +18,24 @@
package androidx.sample.consumer
-import sample.annotation.provider.ExperimentalSampleAnnotation
import sample.annotation.provider.ExperimentalSampleAnnotationJava
+import sample.annotation.provider.RequiresOptInSampleAnnotationJava
class OutsideGroupExperimentalAnnotatedClass {
+
+ // b/201564937 (comments 3, 5-7) - temporarily commenting out due to import issue
+// @ExperimentalSampleAnnotation
+// fun invalidAnnotatedFunction() {
+// // Nothing to see here.
+// }
+
@ExperimentalSampleAnnotationJava
- @ExperimentalSampleAnnotation
- fun invalidAnnotatedMethod() {
+ fun invalidExperimentalAnnotatedMethod() {
+ // Nothing to see here.
+ }
+
+ @RequiresOptInSampleAnnotationJava
+ fun invalidRequiresOptInAnnotatedMethod() {
// Nothing to see here.
}
}
diff --git a/lint-checks/integration-tests/src/main/java/sample/annotation/provider/ExperimentalSampleAnnotationJava.java b/lint-checks/integration-tests/src/main/java/sample/annotation/provider/ExperimentalSampleAnnotationJava.java
index cf47d87..d04506a 100644
--- a/lint-checks/integration-tests/src/main/java/sample/annotation/provider/ExperimentalSampleAnnotationJava.java
+++ b/lint-checks/integration-tests/src/main/java/sample/annotation/provider/ExperimentalSampleAnnotationJava.java
@@ -22,9 +22,8 @@
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
-import kotlin.RequiresOptIn;
-
-@RequiresOptIn
+@SuppressWarnings("deprecation")
+@kotlin.Experimental
@Retention(CLASS)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface ExperimentalSampleAnnotationJava {}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/lint-checks/integration-tests/src/main/java/sample/annotation/provider/RequiresOptInSampleAnnotationJava.java
similarity index 61%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to lint-checks/integration-tests/src/main/java/sample/annotation/provider/RequiresOptInSampleAnnotationJava.java
index 2ab52fb..19bd098 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/lint-checks/integration-tests/src/main/java/sample/annotation/provider/RequiresOptInSampleAnnotationJava.java
@@ -14,7 +14,17 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package sample.annotation.provider;
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import static java.lang.annotation.RetentionPolicy.CLASS;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import kotlin.RequiresOptIn;
+
+@RequiresOptIn
+@Retention(CLASS)
+@Target({ElementType.TYPE, ElementType.METHOD})
+public @interface RequiresOptInSampleAnnotationJava {}
diff --git a/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
index 66c8f24..737c820 100644
--- a/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/AndroidXIssueRegistry.kt
@@ -37,12 +37,10 @@
BanInappropriateExperimentalUsage.ISSUE,
BanKeepAnnotation.ISSUE,
TargetApiAnnotationUsageDetector.ISSUE,
- SampledAnnotationEnforcer.MISSING_SAMPLED_ANNOTATION,
- SampledAnnotationEnforcer.OBSOLETE_SAMPLED_ANNOTATION,
- SampledAnnotationEnforcer.MISSING_SAMPLES_DIRECTORY,
- SampledAnnotationEnforcer.UNRESOLVED_SAMPLE_LINK,
- SampledAnnotationEnforcer.MULTIPLE_FUNCTIONS_FOUND,
- SampledAnnotationEnforcer.INVALID_SAMPLES_LOCATION,
+ SampledAnnotationDetector.OBSOLETE_SAMPLED_ANNOTATION,
+ SampledAnnotationDetector.UNRESOLVED_SAMPLE_LINK,
+ SampledAnnotationDetector.MULTIPLE_FUNCTIONS_FOUND,
+ SampledAnnotationDetector.INVALID_SAMPLES_LOCATION,
TestSizeAnnotationEnforcer.MISSING_TEST_SIZE_ANNOTATION,
TestSizeAnnotationEnforcer.UNEXPECTED_TEST_SIZE_ANNOTATION,
TestSizeAnnotationEnforcer.UNSUPPORTED_TEST_RUNNER,
diff --git a/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt b/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
index 4ee07b7..c5ac47b 100644
--- a/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/BanInappropriateExperimentalUsage.kt
@@ -104,7 +104,12 @@
companion object {
private const val DEBUG = false
+ /**
+ * Even though Kotlin's [Experimental] annotation is deprecated in favor of [RequiresOptIn],
+ * we still want to check for its use in Lint.
+ */
private const val KOTLIN_EXPERIMENTAL_ANNOTATION = "kotlin.Experimental"
+
private const val KOTLIN_REQUIRES_OPT_IN_ANNOTATION = "kotlin.RequiresOptIn"
private const val JAVA_EXPERIMENTAL_ANNOTATION =
"androidx.annotation.experimental.Experimental"
diff --git a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
index db3f0dc..0e348a5 100644
--- a/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
+++ b/lint-checks/src/main/java/androidx/build/lint/ClassVerificationFailureDetector.kt
@@ -19,7 +19,6 @@
package androidx.build.lint
import com.android.SdkConstants.ATTR_VALUE
-import com.android.SdkConstants.DOT_JAVA
import com.android.tools.lint.checks.ApiDetector.Companion.REQUIRES_API_ANNOTATION
import com.android.tools.lint.client.api.UElementHandler
import com.android.tools.lint.detector.api.JavaContext
@@ -124,6 +123,12 @@
}
}
+ /**
+ * Modified from ApiDetector.kt
+ *
+ * Changes:
+ * - Only `UCallExpression` is returned in the list
+ */
override fun getApplicableUastTypes() = listOf(UCallExpression::class.java)
/**
@@ -150,9 +155,8 @@
* Modified from ApiDetector.kt
*
* Changes:
- * - Added early return for null call, removed null checks
- * - Removed enforcement of @RequiresApi
* - Removed cast checking on parameter list
+ * - Removed PsiCompiledElement check
* - Removed special-casing of Support Library
* - Removed SimpleDateFormat and Animator checks
* - Removed check for suppression
@@ -162,19 +166,16 @@
*/
private fun visitCall(
method: PsiMethod,
- call: UCallExpression?,
+ call: UCallExpression,
reference: UElement
) {
- // Change: Added early return for null call, removed null checks
- call ?: return
-
val apiDatabase = apiDatabase ?: return
val containingClass = method.containingClass ?: return
- // Change: Removed enforcement of @RequiresApi
-
// Change: Removed cast checking on parameter list
+ // Change: Removed PsiCompiledElement check
+
val evaluator = context.evaluator
val owner = evaluator.getQualifiedName(containingClass)
?: return // Couldn't resolve type
@@ -205,6 +206,14 @@
return
}
+ containingClass.qualifiedName
+
+ val receiver = if (call.isMethodCall()) {
+ call.receiver
+ } else {
+ null
+ }
+
// The lint API database contains two optimizations:
// First, all members that were available in API 1 are omitted from the database,
// since that saves about half of the size of the database, and for API check
@@ -234,12 +243,11 @@
// then check the package prefix to see whether we know it's an API method whose
// members should all have been inlined.
if (call.isMethodCall()) {
- val qualifier = call.receiver
- if (qualifier != null &&
- qualifier !is UThisExpression &&
- qualifier !is PsiSuperExpression
+ if (receiver != null &&
+ receiver !is UThisExpression &&
+ receiver !is PsiSuperExpression
) {
- val receiverType = qualifier.getExpressionType()
+ val receiverType = receiver.getExpressionType()
if (receiverType is PsiClassType) {
val containingType = context.evaluator.getClassType(containingClass)
val inheritanceChain =
@@ -274,27 +282,14 @@
}
} else {
// Unqualified call; need to search in our super hierarchy
- // Unfortunately, expression.getReceiverType() does not work correctly
- // in Java; it returns the type of the static binding of the call
- // instead of giving the virtual dispatch type, as described in
- // https://issuetracker.google.com/64528052 (and covered by
- // for example ApiDetectorTest#testListView). Therefore, we continue
- // to use the workaround method for Java (which isn't correct, and is
- // particularly broken in Kotlin where the dispatch needs to take into
- // account top level functions and extension methods), and then we use
- // the correct receiver type in Kotlin.
var cls: PsiClass? = null
- if (context.file.path.endsWith(DOT_JAVA)) {
- cls = call.getContainingUClass()?.javaPsi
- } else {
- val receiverType = call.receiverType
- if (receiverType is PsiClassType) {
- cls = receiverType.resolve()
- }
+ val receiverType = call.receiverType
+ if (receiverType is PsiClassType) {
+ cls = receiverType.resolve()
}
- if (qualifier is UThisExpression || qualifier is USuperExpression) {
- val pte = qualifier as UInstanceExpression
+ if (receiver is UThisExpression || receiver is USuperExpression) {
+ val pte = receiver as UInstanceExpression
val resolved = pte.resolve()
if (resolved is PsiClass) {
cls = resolved
@@ -362,9 +357,7 @@
// Change: Removed check for suppression
- if (call.isMethodCall()) {
- val receiver = call.receiver
-
+ if (receiver != null || call.isMethodCall()) {
var target: PsiClass? = null
if (!method.isConstructor) {
if (receiver != null) {
@@ -468,11 +461,10 @@
}
}
- val nameIdentifier = call.methodIdentifier
+ // Change: Removed signature generation
- val location = if (call.isConstructorCall() &&
- call.classReference != null
- ) {
+ val nameIdentifier = call.methodIdentifier
+ val location = if (call.isConstructorCall() && call.classReference != null) {
context.getRangeLocation(call, 0, call.classReference!!, 0)
} else if (nameIdentifier != null) {
context.getLocation(nameIdentifier)
diff --git a/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationDetector.kt b/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationDetector.kt
new file mode 100644
index 0000000..a7ac02c
--- /dev/null
+++ b/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationDetector.kt
@@ -0,0 +1,332 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+@file:Suppress("UnstableApiUsage")
+
+package androidx.build.lint
+
+import androidx.build.lint.SampledAnnotationDetector.Companion.INVALID_SAMPLES_LOCATION
+import androidx.build.lint.SampledAnnotationDetector.Companion.MULTIPLE_FUNCTIONS_FOUND
+import androidx.build.lint.SampledAnnotationDetector.Companion.OBSOLETE_SAMPLED_ANNOTATION
+import androidx.build.lint.SampledAnnotationDetector.Companion.SAMPLED_ANNOTATION
+import androidx.build.lint.SampledAnnotationDetector.Companion.SAMPLED_ANNOTATION_FQN
+import androidx.build.lint.SampledAnnotationDetector.Companion.SAMPLED_FUNCTION_MAP
+import androidx.build.lint.SampledAnnotationDetector.Companion.SAMPLES_DIRECTORY
+import androidx.build.lint.SampledAnnotationDetector.Companion.SAMPLE_KDOC_ANNOTATION
+import androidx.build.lint.SampledAnnotationDetector.Companion.SAMPLE_LINK_MAP
+import androidx.build.lint.SampledAnnotationDetector.Companion.UNRESOLVED_SAMPLE_LINK
+import com.android.tools.lint.client.api.UElementHandler
+import com.android.tools.lint.detector.api.Category
+import com.android.tools.lint.detector.api.Context
+import com.android.tools.lint.detector.api.Detector
+import com.android.tools.lint.detector.api.Implementation
+import com.android.tools.lint.detector.api.Issue
+import com.android.tools.lint.detector.api.JavaContext
+import com.android.tools.lint.detector.api.LintMap
+import com.android.tools.lint.detector.api.Location
+import com.android.tools.lint.detector.api.PartialResult
+import com.android.tools.lint.detector.api.Scope
+import com.android.tools.lint.detector.api.Severity
+import com.android.tools.lint.detector.api.SourceCodeScanner
+import org.jetbrains.kotlin.kdoc.psi.api.KDoc
+import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection
+import org.jetbrains.kotlin.psi.KtFile
+import org.jetbrains.kotlin.psi.KtPropertyAccessor
+import org.jetbrains.uast.UDeclaration
+import org.jetbrains.uast.UMethod
+
+/**
+ * Detector responsible for enforcing @Sampled annotation usage
+ *
+ * This detector enforces that:
+ *
+ * - Functions referenced with @sample are annotated with @Sampled - [UNRESOLVED_SAMPLE_LINK]
+ * - Functions annotated with @Sampled are referenced with @sample - [OBSOLETE_SAMPLED_ANNOTATION]
+ * - Functions annotated with @Sampled are inside a valid samples directory, matching module /
+ * directory structure guidelines - [INVALID_SAMPLES_LOCATION]
+ * - There are never multiple functions with the same fully qualified name that could be resolved
+ * by an @sample link - [MULTIPLE_FUNCTIONS_FOUND]
+ */
+class SampledAnnotationDetector : Detector(), SourceCodeScanner {
+
+ override fun getApplicableUastTypes() = listOf(UDeclaration::class.java)
+
+ override fun createUastHandler(context: JavaContext) = object : UElementHandler() {
+ override fun visitDeclaration(node: UDeclaration) {
+ KDocSampleLinkHandler(context).visitDeclaration(node)
+ if (node is UMethod) {
+ SampledAnnotationHandler(context).visitMethod(node)
+ }
+ }
+ }
+
+ override fun checkPartialResults(context: Context, partialResults: PartialResult) {
+ val sampleLinks = mutableMapOf<String, MutableList<Location>>()
+ val sampledFunctions = mutableMapOf<String, MutableList<Location>>()
+ partialResults.maps().forEach { map ->
+ map.getMap(SAMPLE_LINK_MAP)?.run {
+ iterator().forEach { key ->
+ sampleLinks.getOrPut(key) { mutableListOf() }.add(getLocation(key)!!)
+ }
+ }
+
+ map.getMap(SAMPLED_FUNCTION_MAP)?.run {
+ iterator().forEach { key ->
+ sampledFunctions.getOrPut(key) { mutableListOf() }.add(getLocation(key)!!)
+ }
+ }
+ }
+
+ // Only report errors on the sample module
+ if (context.project.name != "samples") return
+
+ /**
+ * Returns whether this [Location] represents a file that we want to report errors for. We
+ * only want to report an error for files in the parent module of this samples module, to
+ * avoid reporting the same errors multiple times if multiple sample modules depend
+ * on a library that has @sample links.
+ */
+ fun Location.shouldReport(): Boolean {
+ // Path of the parent module that the sample module has samples for
+ val sampleParentPath = context.project.dir.parentFile.toPath().toRealPath()
+ val locationPath = file.toPath().toRealPath()
+ return locationPath.startsWith(sampleParentPath)
+ }
+
+ sampleLinks.forEach { (link, locations) ->
+ val functionLocations = sampledFunctions[link]
+ when {
+ functionLocations == null -> {
+ locations.forEach { location ->
+ if (location.shouldReport()) {
+ context.report(
+ UNRESOLVED_SAMPLE_LINK,
+ location,
+ "Couldn't find a valid @Sampled function matching $link"
+ )
+ }
+ }
+ }
+ // This probably should never happen, but theoretically there could be multiple
+ // samples with the same FQN across separate sample projects, so check here as well.
+ functionLocations.size > 1 -> {
+ locations.forEach { location ->
+ if (location.shouldReport()) {
+ context.report(
+ MULTIPLE_FUNCTIONS_FOUND,
+ location,
+ "Found multiple functions matching $link"
+ )
+ }
+ }
+ }
+ }
+ }
+
+ sampledFunctions.forEach { (link, locations) ->
+ if (sampleLinks[link] == null) {
+ locations.forEach { location ->
+ if (location.shouldReport()) {
+ context.report(
+ OBSOLETE_SAMPLED_ANNOTATION,
+ location,
+ "$link is annotated with @$SAMPLED_ANNOTATION, but is not " +
+ "linked to from a @$SAMPLE_KDOC_ANNOTATION tag."
+ )
+ }
+ }
+ }
+ }
+ }
+
+ companion object {
+ // The name of the @sample tag in KDoc
+ const val SAMPLE_KDOC_ANNOTATION = "sample"
+ // The name of the @Sampled annotation that samples must be annotated with
+ const val SAMPLED_ANNOTATION = "Sampled"
+ const val SAMPLED_ANNOTATION_FQN = "androidx.annotation.$SAMPLED_ANNOTATION"
+ // The name of the samples directory inside a project
+ const val SAMPLES_DIRECTORY = "samples"
+
+ const val SAMPLE_LINK_MAP = "SampleLinkMap"
+ const val SAMPLED_FUNCTION_MAP = "SampledFunctionMap"
+
+ val OBSOLETE_SAMPLED_ANNOTATION = Issue.create(
+ id = "ObsoleteSampledAnnotation",
+ briefDescription = "Obsolete @$SAMPLED_ANNOTATION annotation",
+ explanation = "This function is annotated with @$SAMPLED_ANNOTATION, but is not " +
+ "linked to from a @$SAMPLE_KDOC_ANNOTATION tag. Either remove this annotation, " +
+ "or add a valid @$SAMPLE_KDOC_ANNOTATION tag linking to it.",
+ category = Category.CORRECTNESS,
+ priority = 5,
+ severity = Severity.ERROR,
+ implementation = Implementation(
+ SampledAnnotationDetector::class.java,
+ Scope.JAVA_FILE_SCOPE
+ )
+ )
+
+ val UNRESOLVED_SAMPLE_LINK = Issue.create(
+ id = "UnresolvedSampleLink",
+ briefDescription = "Unresolved @$SAMPLE_KDOC_ANNOTATION annotation",
+ explanation = "Couldn't find a valid @Sampled function matching the function " +
+ "specified in the $SAMPLE_KDOC_ANNOTATION link. If there is a function with the " +
+ "same fully qualified name, make sure it is annotated with @Sampled.",
+ category = Category.CORRECTNESS,
+ priority = 5,
+ severity = Severity.ERROR,
+ implementation = Implementation(
+ SampledAnnotationDetector::class.java,
+ Scope.JAVA_FILE_SCOPE
+ )
+ )
+
+ val MULTIPLE_FUNCTIONS_FOUND = Issue.create(
+ id = "MultipleSampledFunctions",
+ briefDescription = "Multiple matching functions found",
+ explanation = "Found multiple functions matching the $SAMPLE_KDOC_ANNOTATION link.",
+ category = Category.CORRECTNESS,
+ priority = 5,
+ severity = Severity.ERROR,
+ implementation = Implementation(
+ SampledAnnotationDetector::class.java,
+ Scope.JAVA_FILE_SCOPE
+ )
+ )
+
+ val INVALID_SAMPLES_LOCATION = Issue.create(
+ id = "InvalidSamplesLocation",
+ briefDescription = "Invalid samples location",
+ explanation = "This function is annotated with @$SAMPLED_ANNOTATION, but is not " +
+ "inside a project/directory named $SAMPLES_DIRECTORY.",
+ category = Category.CORRECTNESS,
+ priority = 5,
+ severity = Severity.ERROR,
+ implementation = Implementation(
+ SampledAnnotationDetector::class.java,
+ Scope.JAVA_FILE_SCOPE
+ )
+ )
+ }
+}
+
+/**
+ * Handles KDoc with @sample links
+ *
+ * Checks KDoc in all applicable UDeclarations - this includes classes, functions, fields...
+ */
+private class KDocSampleLinkHandler(private val context: JavaContext) {
+ fun visitDeclaration(node: UDeclaration) {
+ val source = node.sourcePsi
+ // TODO: remove workaround when https://youtrack.jetbrains.com/issue/KTIJ-19043 is fixed
+ if (source is KtPropertyAccessor) {
+ source.property.docComment?.let { handleSampleLink(it) }
+ } else {
+ node.comments
+ .mapNotNull {
+ it.sourcePsi as? KDoc
+ }
+ .forEach {
+ handleSampleLink(it)
+ }
+ }
+ }
+
+ private fun handleSampleLink(kdoc: KDoc) {
+ val sections: List<KDocSection> = kdoc.children.mapNotNull { it as? KDocSection }
+
+ // map of a KDocTag (which contains the location used when reporting issues) to the
+ // method link specified in @sample
+ val sampleTags = sections.flatMap { section ->
+ section.findTagsByName(SAMPLE_KDOC_ANNOTATION)
+ .mapNotNull { sampleTag ->
+ val linkText = sampleTag.getSubjectLink()?.getLinkText()
+ if (linkText == null) {
+ null
+ } else {
+ sampleTag to linkText
+ }
+ }
+ }.distinct()
+
+ sampleTags.forEach { (docTag, link) ->
+ // TODO: handle suppressions (if needed) with LintDriver.isSuppressed
+ val mainLintMap =
+ context.getPartialResults(UNRESOLVED_SAMPLE_LINK).map()
+
+ val sampleLinkLintMap =
+ mainLintMap.getMap(SAMPLE_LINK_MAP) ?: LintMap().also {
+ mainLintMap.put(SAMPLE_LINK_MAP, it)
+ }
+
+ // This overrides any identical links in the same project - no need to report the
+ // same error multiple times in different places, and it is tricky to do so in any case.
+ sampleLinkLintMap.put(link, context.getNameLocation(docTag))
+ }
+ }
+}
+
+/**
+ * Handles sample functions annotated with @Sampled
+ */
+private class SampledAnnotationHandler(private val context: JavaContext) {
+
+ fun visitMethod(node: UMethod) {
+ if (node.hasAnnotation(SAMPLED_ANNOTATION_FQN)) {
+ handleSampleCode(node)
+ }
+ }
+
+ private fun handleSampleCode(node: UMethod) {
+ val currentPath = context.psiFile!!.virtualFile.path
+
+ if (SAMPLES_DIRECTORY !in currentPath) {
+ context.report(
+ INVALID_SAMPLES_LOCATION,
+ node,
+ context.getNameLocation(node),
+ "${node.name} is annotated with @$SAMPLED_ANNOTATION" +
+ ", but is not inside a project/directory named $SAMPLES_DIRECTORY."
+ )
+ return
+ }
+
+ // The package name of the file we are in
+ val parentFqName = (node.containingFile as KtFile).packageFqName.asString()
+ // The full name of the current function that will be referenced in a @sample tag
+ val fullFqName = "$parentFqName.${node.name}"
+
+ val mainLintMap =
+ context.getPartialResults(UNRESOLVED_SAMPLE_LINK).map()
+
+ val sampledFunctionLintMap =
+ mainLintMap.getMap(SAMPLED_FUNCTION_MAP) ?: LintMap().also {
+ mainLintMap.put(SAMPLED_FUNCTION_MAP, it)
+ }
+
+ val location = context.getNameLocation(node)
+
+ if (sampledFunctionLintMap.getLocation(fullFqName) != null) {
+ context.report(
+ MULTIPLE_FUNCTIONS_FOUND,
+ location,
+ "Found multiple functions matching $fullFqName"
+ )
+ }
+
+ sampledFunctionLintMap.put(fullFqName, location)
+ }
+}
diff --git a/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt b/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt
deleted file mode 100644
index c12401e..0000000
--- a/lint-checks/src/main/java/androidx/build/lint/SampledAnnotationEnforcer.kt
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("UnstableApiUsage")
-
-package androidx.build.lint
-
-import androidx.build.lint.SampledAnnotationEnforcer.Companion.SAMPLED_ANNOTATION
-import androidx.build.lint.SampledAnnotationEnforcer.Companion.SAMPLES_DIRECTORY
-import androidx.build.lint.SampledAnnotationEnforcer.Companion.SAMPLE_KDOC_ANNOTATION
-import com.android.tools.lint.client.api.UElementHandler
-import com.android.tools.lint.detector.api.Category
-import com.android.tools.lint.detector.api.Context
-import com.android.tools.lint.detector.api.Detector
-import com.android.tools.lint.detector.api.Implementation
-import com.android.tools.lint.detector.api.Issue
-import com.android.tools.lint.detector.api.JavaContext
-import com.android.tools.lint.detector.api.Scope
-import com.android.tools.lint.detector.api.Severity
-import com.android.tools.lint.detector.api.SourceCodeScanner
-import com.intellij.psi.PsiDirectory
-import com.intellij.psi.PsiElement
-import com.intellij.psi.PsiFile
-import org.jetbrains.kotlin.asJava.namedUnwrappedElement
-import org.jetbrains.kotlin.kdoc.psi.api.KDoc
-import org.jetbrains.kotlin.kdoc.psi.impl.KDocSection
-import org.jetbrains.kotlin.psi.KtDeclaration
-import org.jetbrains.kotlin.psi.KtFile
-import org.jetbrains.kotlin.psi.KtNamedFunction
-import org.jetbrains.kotlin.psi.KtTreeVisitorVoid
-import org.jetbrains.kotlin.psi.findDocComment.findDocComment
-import org.jetbrains.kotlin.psi.psiUtil.safeNameForLazyResolve
-import org.jetbrains.kotlin.utils.addIfNotNull
-import org.jetbrains.uast.UDeclaration
-import org.jetbrains.uast.UElement
-import org.jetbrains.uast.UMethod
-import java.io.File
-
-/**
- * Class containing two lint detectors responsible for enforcing @Sampled annotation usage when
- * AndroidXExtension.enforceSampledAnnotation == true
- *
- * 1. KDocSampleLinkDetector, which enforces that any samples referenced from a @sample tag in KDoc
- * are correctly annotated with @Sampled
- *
- * 2. SampledAnnotationDetector, which enforces that any sample functions annotated with @Sampled
- * are linked to from KDoc in the parent module
- *
- * These lint checks make some assumptions about directory / module structure, and supports two
- * such setups:
- *
- * 1. Module foo which has a 'samples' dir/module inside it
- * 2. Module foo which has a 'samples' dir/module alongside it
- *
- * There are also some other tangentially related lint issues that can be reported, to ensure sample
- * correctness:
- *
- * 1. Missing samples directory
- * 2. No functions found matching a @sample link
- * 3. Multiple functions found matching a @sample link
- * 4. Function annotated with @Sampled does not live in a valid samples directory
- */
-class SampledAnnotationEnforcer {
-
- companion object {
- // The name of the @sample tag in KDoc
- const val SAMPLE_KDOC_ANNOTATION = "sample"
- // The name of the @Sampled annotation that samples must be annotated with
- const val SAMPLED_ANNOTATION = "Sampled"
- // The name of the samples directory inside a project
- const val SAMPLES_DIRECTORY = "samples"
-
- val MISSING_SAMPLED_ANNOTATION = Issue.create(
- "EnforceSampledAnnotation",
- "Missing @$SAMPLED_ANNOTATION annotation",
- "Functions referred to from KDoc with a @$SAMPLE_KDOC_ANNOTATION tag must " +
- "be annotated with @$SAMPLED_ANNOTATION, to provide visibility at the sample " +
- "site and ensure that it doesn't get changed accidentally.",
- Category.CORRECTNESS, 5, Severity.ERROR,
- Implementation(KDocSampleLinkDetector::class.java, Scope.JAVA_FILE_SCOPE)
- )
-
- val OBSOLETE_SAMPLED_ANNOTATION = Issue.create(
- "EnforceSampledAnnotation",
- "Obsolete @$SAMPLED_ANNOTATION annotation",
- "This function is annotated with @$SAMPLED_ANNOTATION, but is not linked to " +
- "from a @$SAMPLE_KDOC_ANNOTATION tag. Either remove this annotation, or add " +
- "a valid @$SAMPLE_KDOC_ANNOTATION tag linking to it.",
- Category.CORRECTNESS, 5, Severity.ERROR,
- Implementation(SampledAnnotationDetector::class.java, Scope.JAVA_FILE_SCOPE)
- )
-
- val MISSING_SAMPLES_DIRECTORY = Issue.create(
- "EnforceSampledAnnotation",
- "Missing $SAMPLES_DIRECTORY directory",
- "Couldn't find a valid $SAMPLES_DIRECTORY directory in this project.",
- Category.CORRECTNESS, 5, Severity.ERROR,
- Implementation(SampledAnnotationDetector::class.java, Scope.JAVA_FILE_SCOPE)
- )
-
- val UNRESOLVED_SAMPLE_LINK = Issue.create(
- "EnforceSampledAnnotation",
- "Unresolved @$SAMPLE_KDOC_ANNOTATION annotation",
- "Couldn't find a valid function matching the function specified in the " +
- "$SAMPLE_KDOC_ANNOTATION link.",
- Category.CORRECTNESS, 5, Severity.ERROR,
- Implementation(SampledAnnotationDetector::class.java, Scope.JAVA_FILE_SCOPE)
- )
-
- val MULTIPLE_FUNCTIONS_FOUND = Issue.create(
- "EnforceSampledAnnotation",
- "Multiple matching functions found",
- "Found multiple functions matching the $SAMPLE_KDOC_ANNOTATION link.",
- Category.CORRECTNESS, 5, Severity.ERROR,
- Implementation(SampledAnnotationDetector::class.java, Scope.JAVA_FILE_SCOPE)
- )
-
- val INVALID_SAMPLES_LOCATION = Issue.create(
- "EnforceSampledAnnotation",
- "Invalid samples location",
- "This function is annotated with @$SAMPLED_ANNOTATION, but is not inside a" +
- "project/directory named $SAMPLES_DIRECTORY.",
- Category.CORRECTNESS, 5, Severity.ERROR,
- Implementation(SampledAnnotationDetector::class.java, Scope.JAVA_FILE_SCOPE)
- )
- }
-
- /**
- * Enforces that any @sample links in KDoc link to a function that is annotated with @Sampled
- *
- * Checks KDoc in all applicable UDeclarations - this includes classes, functions, fields...
- *
- * Also reports issues if there is no samples directory found, if there is no function matching
- * a given @sample link, and if there are multiple functions matching a given @sample link.
- */
- class KDocSampleLinkDetector : Detector(), SourceCodeScanner {
- // Cache containing every function inside a project's corresponding samples dir
- private var sampleFunctionCache: List<KtNamedFunction>? = null
-
- /**
- * @return a list of all the functions found in the samples directory for this project, or
- * `null` if there is no valid samples directory for this project
- */
- internal fun getSampleFunctionCache(context: JavaContext): List<KtNamedFunction>? {
- if (sampleFunctionCache == null) {
- val sampleDirectory = findSampleDirectory(context)
- sampleFunctionCache = if (sampleDirectory == null) {
- null
- } else {
- val allKtFiles = sampleDirectory.getAllKtFiles()
- // Remove any functions without a valid fully qualified name, this includes
- // things such as overridden functions in anonymous classes like a Runnable
- allKtFiles.flatMap { it.getAllFunctions() }.filter {
- it.fqName != null
- }
- }
- }
- return sampleFunctionCache
- }
-
- override fun getApplicableUastTypes(): List<Class<out UElement>> =
- listOf(UDeclaration::class.java)
-
- override fun createUastHandler(context: JavaContext): UElementHandler =
- KDocSampleLinkHandler(context)
-
- /**
- * Clear caches before and after a project run, as they are only relevant per project
- *
- * Note: this isn't strictly needed, as normally a new detector will be instantiated per
- * project, but if lint is set to run on dependencies, the same detector will end up
- * being reused, and we can run into some caching issues. Safer just to always clear here as
- * we really want to avoid false positives.
- */
- override fun beforeCheckEachProject(context: Context) {
- sampleFunctionCache = null
- }
-
- override fun afterCheckEachProject(context: Context) {
- sampleFunctionCache = null
- }
-
- private inner class KDocSampleLinkHandler(
- private val context: JavaContext
- ) : UElementHandler() {
-
- // Cache containing all the KDoc elements we have found inside this Handler (created
- // once per JavaContext - Java/Kotlin source file)
- private val kdocCache = mutableListOf<KDoc>()
-
- override fun visitDeclaration(node: UDeclaration) {
- node.findKdoc()?.let { kdoc ->
- // It's possible for different declarations to point to the same KDoc - for
- // example if a class has some KDoc, we will visit it once for the constructor
- // function and once for the class itself. If we have seen this KDoc before
- // just skip it so we don't report the issue multiple times
- if (kdoc !in kdocCache) {
- kdocCache.add(kdoc)
- handleSampleLink(kdoc, node.namedUnwrappedElement!!.name!!)
- }
- }
- }
-
- private fun handleSampleLink(kdoc: KDoc, sourceNodeName: String) {
- val sections: List<KDocSection> = kdoc.children.mapNotNull { it as? KDocSection }
-
- // map of a KDocTag (which contains the location used when reporting issues) to the
- // method link specified in @sample
- val sampleTags = sections.flatMap { section ->
- section.findTagsByName(SAMPLE_KDOC_ANNOTATION)
- .mapNotNull { sampleTag ->
- val linkText = sampleTag.getSubjectLink()?.getLinkText()
- if (linkText == null) {
- null
- } else {
- sampleTag to linkText
- }
- }
- }.distinct()
-
- sampleTags.forEach { (docTag, link) ->
-
- val allFunctions = getSampleFunctionCache(context)
-
- if (allFunctions == null) {
- context.report(
- MISSING_SAMPLES_DIRECTORY,
- docTag,
- context.getNameLocation(docTag),
- "Couldn't find a valid $SAMPLES_DIRECTORY directory in this project"
- )
- return@forEach
- }
-
- // We filtered out not-null fqNames when building the cache, so safe to !!
- val matchingFunctions = allFunctions.filter {
- link == it.fqName!!.asString()
- }
-
- when (matchingFunctions.size) {
- 0 -> {
- context.report(
- UNRESOLVED_SAMPLE_LINK,
- docTag,
- context.getNameLocation(docTag),
- "Couldn't find a valid function matching $link"
- )
- }
- 1 -> {
- val function = matchingFunctions.first()
- if (!function.hasSampledAnnotation()) {
- context.report(
- MISSING_SAMPLED_ANNOTATION,
- docTag,
- context.getNameLocation(docTag),
- "${function.name} is not annotated with @$SAMPLED_ANNOTATION" +
- ", but is linked to from the KDoc of $sourceNodeName"
- )
- }
- }
- else -> {
- context.report(
- MULTIPLE_FUNCTIONS_FOUND,
- docTag,
- context.getNameLocation(docTag),
- "Found multiple functions matching $link"
- )
- }
- }
- }
- }
- }
- }
-
- /**
- * Checks all functions annotated with @Sampled to ensure that they are linked from KDoc
- *
- * Also reports an issue if a function is annotated with @Sampled, and does not live in a
- * valid samples directory/module.
- */
- class SampledAnnotationDetector : Detector(), SourceCodeScanner {
- // Cache containing every link referenced from a @sample tag inside the parent project
- private var sampleLinkCache: List<String>? = null
-
- internal fun getSampleLinkCache(context: JavaContext): List<String> {
- if (sampleLinkCache == null) {
- sampleLinkCache = buildSampleLinkCache(context)
- }
- return sampleLinkCache!!
- }
-
- override fun getApplicableUastTypes(): List<Class<out UElement>> =
- listOf(UMethod::class.java)
-
- override fun createUastHandler(context: JavaContext): UElementHandler =
- SampledAnnotationHandler(context)
-
- /**
- * Clear caches before and after a project run, as they are only relevant per project
- *
- * Note: this isn't strictly needed, as normally a new detector will be instantiated per
- * project, but if lint is set to run on dependencies, the same detector will end up
- * being reused, and we can run into some caching issues. Safer just to always clear here as
- * we really want to avoid false positives.
- */
- override fun beforeCheckEachProject(context: Context) {
- sampleLinkCache = null
- }
-
- override fun afterCheckEachProject(context: Context) {
- sampleLinkCache = null
- }
-
- private inner class SampledAnnotationHandler(
- private val context: JavaContext
- ) : UElementHandler() {
-
- override fun visitMethod(node: UMethod) {
- val element = (node.sourceElement as? KtDeclaration) ?: return
-
- if (element.annotationEntries.any {
- it.shortName.safeNameForLazyResolve().identifier == SAMPLED_ANNOTATION
- }
- ) {
- handleSampleCode(element, node)
- }
- }
-
- private fun handleSampleCode(function: KtDeclaration, node: UMethod) {
- val currentPath = context.psiFile!!.virtualFile.path
-
- if (SAMPLES_DIRECTORY !in currentPath) {
- context.report(
- INVALID_SAMPLES_LOCATION,
- node,
- context.getNameLocation(node),
- "${function.name} is annotated with @$SAMPLED_ANNOTATION" +
- ", but is not inside a project/directory named $SAMPLES_DIRECTORY."
- )
- return
- }
-
- // The package name of the file we are in
- val parentFqName = function.containingKtFile.packageFqName.asString()
- // The full name of the current function that will be referenced in a @sample tag
- val fullFqName = "$parentFqName.${function.name}"
-
- if (getSampleLinkCache(context).none { it == fullFqName }) {
- context.report(
- OBSOLETE_SAMPLED_ANNOTATION,
- node,
- context.getNameLocation(node),
- "${function.name} is annotated with @$SAMPLED_ANNOTATION, but is not " +
- "linked to from a @$SAMPLE_KDOC_ANNOTATION tag."
- )
- }
- }
- }
-
- /**
- * At this point we are inside some sample module, which is depending on a module that
- * would end up referencing the sample
- *
- * For example, we could be in :foo:sample, and we want to find the
- * path for module :foo
- */
- private fun buildSampleLinkCache(context: JavaContext): List<String> {
- val currentProjectPath = context.project.dir.absolutePath
-
- // The paths of every (including transitive) module the current module depends on
- val dependenciesPathList = context.project.allLibraries.map {
- it.dir.absolutePath
- }
-
- // Try and find a common path, i.e if we are in a/b/foo/sample, we
- // will match a/b/foo for the parent. Find all such matching paths in case there are
- // multiple modules sampling this one module.
- var parentProjectPaths = dependenciesPathList
- .filter {
- currentProjectPath.startsWith(it)
- }
- .ifEmpty { null }
-
- // If we haven't found a path, it might be that we are on the same top level, i.e
- // we are in a/b/foo/sample, and the module is in a/b/foo/foo-xyz
- // Try matching with the parent directory of each module.
- parentProjectPaths = parentProjectPaths ?: dependenciesPathList
- .filter {
- currentProjectPath.startsWith(File(it).parent)
- }
- .ifEmpty { null }
-
- // There is no dependent module that exists above us, or alongside us, so throw
- checkNotNull(parentProjectPaths) {
- "Couldn't find a parent project for $currentProjectPath"
- }
-
- return parentProjectPaths.flatMap { path ->
- val parentProjectDirectory = navigateToDirectory(context, path)
- parentProjectDirectory.getAllKtFiles().flatMap { file ->
- file.findAllSampleLinks()
- }
- }
- }
- }
-}
-
-/**
- * @return the KDoc for the given section, or `null` if there is no corresponding KDoc
- *
- * This also filters out non-Kotlin declarations, so we don't bother looking for KDoc inside
- * Java nodes for example.
- */
-internal fun UDeclaration.findKdoc(): KDoc? {
- // Unfortunate workaround as the KDoc cannot be returned from the node directly
- // https://youtrack.jetbrains.com/issue/KT-22135
- val ktDeclaration = sourceElement as? KtDeclaration ?: return null
- return findDocComment(ktDeclaration)
-}
-
-/**
- * @return whether this function is annotated with @Sampled
- */
-internal fun KtNamedFunction.hasSampledAnnotation(): Boolean {
- return modifierList?.annotationEntries?.any { annotation ->
- annotation.shortName.safeNameForLazyResolve().identifier == SAMPLED_ANNOTATION
- } ?: false
-}
-
-/**
- * @return a list of all sample links found recursively inside the element
- */
-internal fun PsiElement.findAllSampleLinks(): List<String> {
- val sampleLinks = mutableListOf<String>()
- if (this is KDoc) {
- val sections: List<KDocSection> = this.children.mapNotNull { it as? KDocSection }
-
- sections.forEach { section ->
- section.findTagsByName(SAMPLE_KDOC_ANNOTATION).forEach { sampleTag ->
- sampleTag.getSubjectLink()?.getLinkText()?.let { sampleLinks.add(it) }
- }
- }
- }
- children.forEach { sampleLinks.addAll(it.findAllSampleLinks()) }
- return sampleLinks
-}
-
-/**
- * @return a list of all files found recursively inside the directory
- */
-internal fun PsiDirectory.getAllKtFiles(): List<PsiFile> {
- val psiFiles = mutableListOf<PsiFile>()
- accept(object : KtTreeVisitorVoid() {
- override fun visitFile(file: PsiFile) {
- psiFiles.addIfNotNull(file as? KtFile)
- }
- })
- return psiFiles
-}
-
-/**
- * @return a list of all functions found recursively inside the element
- */
-internal fun PsiElement.getAllFunctions(): List<KtNamedFunction> {
- val functions = mutableListOf<KtNamedFunction>()
- accept(object : KtTreeVisitorVoid() {
- override fun visitDeclaration(dcl: KtDeclaration) {
- functions.addIfNotNull(dcl as? KtNamedFunction)
- }
- })
- return functions
-}
-
-/**
- * @return the samples directory if it exists, otherwise returns null
- *
- * The samples directory could either be a direct child of the current module, or a
- * sibling directory
- *
- * For example, if we are in a/b/foo, the samples directory could either be:
- * a/b/foo/samples
- * a/b/samples
- *
- * For efficiency, first we look inside a/b/foo, and then if that fails we look
- * inside a/b
- */
-internal fun findSampleDirectory(context: JavaContext): PsiDirectory? {
- val currentProjectPath = context.project.dir.absolutePath
- val currentProjectDir = navigateToDirectory(context, currentProjectPath)
-
- fun PsiDirectory.searchForSampleDirectory(): PsiDirectory? {
- return subdirectories.find { it.name == SAMPLES_DIRECTORY }
- }
-
- // Look inside a/b/foo
- var sampleDir = currentProjectDir.searchForSampleDirectory()
-
- // Try looking inside /a/b
- if (sampleDir == null) {
- sampleDir = currentProjectDir.parent!!.searchForSampleDirectory()
- }
-
- return sampleDir
-}
-
-/**
- * @return the directory with the given [path], using [context] to get the current filesystem
- */
-internal fun navigateToDirectory(context: JavaContext, path: String): PsiDirectory {
- val file = context.psiFile
- ?: throw IllegalStateException("Not linting a source file")
- val filesystem = file.virtualFile.fileSystem
- val virtualFile = filesystem.findFileByPath(path)
- return file.manager.findDirectory(virtualFile!!)
- ?: throw IllegalStateException("Couldn't find directory for $path")
-}
diff --git a/lint-checks/src/test/java/androidx/build/lint/AbstractLintDetectorTest.kt b/lint-checks/src/test/java/androidx/build/lint/AbstractLintDetectorTest.kt
index 8bcfd3e..da45139 100644
--- a/lint-checks/src/test/java/androidx/build/lint/AbstractLintDetectorTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/AbstractLintDetectorTest.kt
@@ -40,8 +40,15 @@
override fun getIssues(): List<Issue> = useIssues
+ /**
+ * Runs lint checks for the given [projects] using (optionally) specified [testModes].
+ *
+ * Test mode modification is available to work around issues regarding partial analysis
+ * (b/188814760, b/201086161#comment4).
+ */
fun check(
- vararg projects: ProjectDescription
+ vararg projects: ProjectDescription,
+ testModes: List<TestMode> = listOf(TestMode.DEFAULT, TestMode.PARTIAL)
): TestLintResult {
// If we have stubs, push those into a virtual project and pass them through the call to
// projects(), since attempting to call files() would overwrite the call to projects().
@@ -52,7 +59,8 @@
}
return lint()
- .projects(*projectsWithStubs).testModes(TestMode.DEFAULT, TestMode.PARTIAL)
+ .projects(*projectsWithStubs)
+ .testModes(testModes)
.run()
}
diff --git a/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt b/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt
index 64e10d8..3003f41 100644
--- a/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt
+++ b/lint-checks/src/test/java/androidx/build/lint/BanInappropriateExperimentalUsageTest.kt
@@ -19,7 +19,7 @@
package androidx.build.lint
import com.android.tools.lint.checks.infrastructure.ProjectDescription
-import org.junit.Ignore
+import com.android.tools.lint.checks.infrastructure.TestMode
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
@@ -55,7 +55,6 @@
check(provider).expect(expected)
}
- @Ignore("b/188814760")
@Test
fun `Test cross-module Experimental usage via Gradle model`() {
val provider = project()
@@ -65,6 +64,7 @@
.files(
ktSample("sample.annotation.provider.ExperimentalSampleAnnotation"),
javaSample("sample.annotation.provider.ExperimentalSampleAnnotationJava"),
+ javaSample("sample.annotation.provider.RequiresOptInSampleAnnotationJava"),
gradle(
"""
apply plugin: 'com.android.library'
@@ -89,13 +89,17 @@
/* ktlint-disable max-line-length */
val expected = """
-../consumer/src/main/kotlin/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt:25: Error: Experimental and RequiresOptIn APIs may only be used within the same-version group where they were defined. [IllegalExperimentalApiUsage]
+../consumer/src/main/kotlin/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt:32: Error: Experimental and RequiresOptIn APIs may only be used within the same-version group where they were defined. [IllegalExperimentalApiUsage]
@ExperimentalSampleAnnotationJava
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
+../consumer/src/main/kotlin/androidx/sample/consumer/OutsideGroupExperimentalAnnotatedClass.kt:37: Error: Experimental and RequiresOptIn APIs may only be used within the same-version group where they were defined. [IllegalExperimentalApiUsage]
+ @RequiresOptInSampleAnnotationJava
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+2 errors, 0 warnings
""".trimIndent()
/* ktlint-enable max-line-length */
- check(provider, consumer).expect(expected)
+ // TODO: Using TestMode.DEFAULT due to b/188814760; remove testModes once bug is resolved
+ check(provider, consumer, testModes = listOf(TestMode.DEFAULT)).expect(expected)
}
}
diff --git a/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationDetectorTest.kt b/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationDetectorTest.kt
new file mode 100644
index 0000000..02a9935
--- /dev/null
+++ b/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationDetectorTest.kt
@@ -0,0 +1,637 @@
+/*
+ * 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.
+ */
+
+@file:Suppress("KDocUnresolvedReference", "UnstableApiUsage")
+
+package androidx.build.lint
+
+import com.android.tools.lint.checks.infrastructure.LintDetectorTest
+import com.android.tools.lint.checks.infrastructure.ProjectDescription
+import com.android.tools.lint.checks.infrastructure.TestFile
+import com.android.tools.lint.checks.infrastructure.TestMode
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+/* ktlint-disable max-line-length */
+
+/**
+ * Test for [SampledAnnotationDetector]
+ *
+ * This tests the following module setup:
+ *
+ * Module 'foo', which lives in foo
+ * Module 'foo:samples', which lives in foo/samples, and depends on 'foo'
+ */
+@RunWith(JUnit4::class)
+class SampledAnnotationDetectorTest : LintDetectorTest() {
+
+ override fun getDetector() = SampledAnnotationDetector()
+
+ override fun getIssues() = mutableListOf(
+ SampledAnnotationDetector.OBSOLETE_SAMPLED_ANNOTATION,
+ SampledAnnotationDetector.UNRESOLVED_SAMPLE_LINK,
+ SampledAnnotationDetector.MULTIPLE_FUNCTIONS_FOUND,
+ SampledAnnotationDetector.INVALID_SAMPLES_LOCATION
+ )
+
+ private val fooModuleName = "foo"
+ private val sampleModuleName = "samples"
+
+ private val barFilePath = "src/foo/Bar.kt"
+ private val sampleFilePath = "samples/src/foo/samples/test.kt"
+
+ private val sampledStub = compiled(
+ "libs/sampled.jar",
+ kotlin(
+ """
+ package androidx.annotation
+
+ @Target(AnnotationTarget.FUNCTION)
+ @Retention(AnnotationRetention.SOURCE)
+ annotation class Sampled
+ """
+ ).to("androidx/annotation/Sampled.kt"),
+ 0x9dd4162c,
+"""
+ META-INF/main.kotlin_module:
+ H4sIAAAAAAAAAGNgYGBmYGBgBGJWKM3AJcrFnZafr1ecmFuQk1osxBaSWlzi
+ XaLEoMUAAClM+YMvAAAA
+ """,
+ """
+ androidx/annotation/Sampled.class:
+ H4sIAAAAAAAAAIVSyU4CQRB9NYggbriDuGv0Jki8cXLBSKJiEL1wapmOGWlm
+ CNOg3rj5Tx4M8ehHGatdgMNE+1D9qvq96qrqfv94eQWwj01CSrh203Psx7Rw
+ XU8L7Xhu+krUG0raERAhfi/aIq2Ee5cu3t7Lqo4gRFjtRwd0Bz0YQZiweFbz
+ tHLcQUpZNO+kzhEmhFLeg7S/Az5hK4DdT9jTRU+uL47KheIFYTlAUZJaugYx
+ NdwWqiUJO39mHlQMXxWvS0d5wtpZYIOD3O1/KJeecqpPOVNmILHX0UbweV7J
+ OmcqPzWkqew8Xz4tHhOmfps5l1rYQgs+tOrtED8oGcNzpxqHHh3jZRjZe4Rk
+ txONWQkrZsVT0bdnK9HtZK0MHXY7hpA1Rf7xEfgKEGI/3m5NG8drNavyxFE8
+ 4GSpxS3X5Y3jO7dK9mfrb3N6DLF4GGZZWP+ya9jgvYow+I8hWgFJjCCGUfbG
+ JMYxgclvGGc4ZeAXZxozmGXVXAWhAuYLWGCLhDHJAhaRYpaPJSxXYPlY8bH6
+ CeBn7eLsAgAA
+ """
+ )
+
+ private val emptySampleFile = kotlin(
+ """
+ package foo.samples
+ """
+ )
+
+ private val unannotatedSampleFile = kotlin(
+ """
+ package foo.samples
+
+ fun sampleBar() {}
+ """
+ )
+
+ private val multipleMatchingSampleFile = kotlin(
+ """
+ package foo.samples
+
+ import androidx.annotation.Sampled
+
+ @Sampled
+ fun sampleBar() {}
+
+ @Sampled
+ fun sampleBar(param: Boolean = false) {}
+ """
+ )
+
+ private val correctlyAnnotatedSampleFile = kotlin(
+ """
+ package foo.samples
+
+ import androidx.annotation.Sampled
+
+ @Sampled
+ fun sampleBar() {}
+ """
+ )
+
+ private fun checkKotlin(
+ fooFile: TestFile? = null,
+ sampleFile: TestFile,
+ expectedText: String? = null,
+ requiresPartialAnalysis: Boolean = true
+ ) {
+ val projectDescriptions = mutableListOf<ProjectDescription>()
+ val fooProject = ProjectDescription().apply {
+ name = fooModuleName
+ type = ProjectDescription.Type.LIBRARY
+ fooFile?.let { addFile(fooFile) }
+ }
+ projectDescriptions += fooProject
+
+ val sampleProject = ProjectDescription().apply {
+ name = sampleModuleName
+ type = ProjectDescription.Type.LIBRARY
+ under = fooProject
+ files = arrayOf(sampleFile, sampledStub)
+ dependsOn(fooProject)
+ }
+ projectDescriptions += sampleProject
+
+ lint().run {
+ projects(*projectDescriptions.toTypedArray())
+ if (requiresPartialAnalysis) {
+ // The lint check will only work in partial analysis, so we expect non-partial
+ // test modes to have no errors. This has to be called before run().
+ expectIdenticalTestModeOutput(false)
+ }
+ run().run {
+ if (expectedText == null) {
+ expectClean()
+ } else {
+ if (requiresPartialAnalysis) {
+ // expectClean doesn't accept a testMode param
+ expect("No warnings.", testMode = TestMode.DEFAULT)
+ expect(expectedText, testMode = TestMode.PARTIAL)
+ } else {
+ expect(expectedText)
+ }
+ }
+ }
+ }
+ }
+
+ @Test
+ fun unresolvedSampleLink_Function() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ fun bar() {}
+ }
+ """
+ )
+
+ val sampleFile = emptySampleFile
+
+ val expected =
+ """$barFilePath:6: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun unannotatedSampleFunction_Function() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ fun bar() {}
+ }
+ """
+ )
+
+ val sampleFile = unannotatedSampleFile
+
+ val expected =
+ """$barFilePath:6: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun multipleMatchingSampleFunctions_Function() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ fun bar() {}
+ }
+ """
+ )
+
+ val sampleFile = multipleMatchingSampleFile
+
+ val expected =
+ """$sampleFilePath:10: Error: Found multiple functions matching foo.samples.sampleBar [MultipleSampledFunctions]
+ fun sampleBar(param: Boolean = false) {}
+ ~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(
+ fooFile = fooFile,
+ sampleFile = sampleFile,
+ expectedText = expected,
+ // Since this particular is all done inside the same module, partial analysis isn't
+ // required so it will still work in global analysis
+ requiresPartialAnalysis = false
+ )
+ }
+
+ @Test
+ fun correctlyAnnotatedSampleFunction_Function() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ fun bar() {}
+ }
+ """
+ )
+
+ val sampleFile = correctlyAnnotatedSampleFile
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = null)
+ }
+
+ @Test
+ fun unresolvedSampleLink_Class() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ class Bar
+ """
+ )
+
+ val sampleFile = emptySampleFile
+
+ val expected =
+ """$barFilePath:5: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun unannotatedSampleFunction_Class() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ class Bar
+ """
+ )
+
+ val sampleFile = unannotatedSampleFile
+
+ val expected =
+ """$barFilePath:5: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun multipleMatchingSampleFunctions_Class() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ class Bar
+ """
+ )
+
+ val sampleFile = multipleMatchingSampleFile
+
+ val expected =
+ """$sampleFilePath:10: Error: Found multiple functions matching foo.samples.sampleBar [MultipleSampledFunctions]
+ fun sampleBar(param: Boolean = false) {}
+ ~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(
+ fooFile = fooFile,
+ sampleFile = sampleFile,
+ expectedText = expected,
+ // Since this particular is all done inside the same module, partial analysis isn't
+ // required so it will still work in global analysis
+ requiresPartialAnalysis = false
+ )
+ }
+
+ @Test
+ fun correctlyAnnotatedSampleFunction_Class() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ class Bar
+ """
+ )
+
+ val sampleFile = correctlyAnnotatedSampleFile
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = null)
+ }
+
+ @Test
+ fun unresolvedSampleLink_Field() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ const val bar = 0
+ }
+ """
+ )
+
+ val sampleFile = emptySampleFile
+
+ val expected =
+ """$barFilePath:6: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun unannotatedSampleFunction_Field() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ const val bar = 0
+ }
+ """
+ )
+
+ val sampleFile = unannotatedSampleFile
+
+ val expected =
+ """$barFilePath:6: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun multipleMatchingSampleFunctions_Field() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ const val bar = 0
+ }
+ """
+ )
+
+ val sampleFile = multipleMatchingSampleFile
+
+ val expected =
+ """$sampleFilePath:10: Error: Found multiple functions matching foo.samples.sampleBar [MultipleSampledFunctions]
+ fun sampleBar(param: Boolean = false) {}
+ ~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(
+ fooFile = fooFile,
+ sampleFile = sampleFile,
+ expectedText = expected,
+ // Since this particular is all done inside the same module, partial analysis isn't
+ // required so it will still work in global analysis
+ requiresPartialAnalysis = false
+ )
+ }
+
+ @Test
+ fun correctlyAnnotatedSampleFunction_Field() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ const val bar = 0
+ }
+ """
+ )
+
+ val sampleFile = correctlyAnnotatedSampleFile
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = null)
+ }
+
+ @Test
+ fun unresolvedSampleLink_PropertyWithGetter() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ val bar get() = 0
+ }
+ """
+ )
+
+ val sampleFile = emptySampleFile
+
+ val expected =
+ """$barFilePath:6: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun unannotatedSampleFunction_PropertyWithGetter() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ val bar get() = 0
+ }
+ """
+ )
+
+ val sampleFile = unannotatedSampleFile
+
+ val expected =
+ """$barFilePath:6: Error: Couldn't find a valid @Sampled function matching foo.samples.sampleBar [UnresolvedSampleLink]
+ * @sample foo.samples.sampleBar
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun multipleMatchingSampleFunctions_PropertyWithGetter() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ val bar get() = 0
+ }
+ """
+ )
+
+ val sampleFile = multipleMatchingSampleFile
+
+ val expected =
+ """$sampleFilePath:10: Error: Found multiple functions matching foo.samples.sampleBar [MultipleSampledFunctions]
+ fun sampleBar(param: Boolean = false) {}
+ ~~~~~~~~~
+1 errors, 0 warnings
+ """
+
+ checkKotlin(
+ fooFile = fooFile,
+ sampleFile = sampleFile,
+ expectedText = expected,
+ // Since this particular is all done inside the same module, partial analysis isn't
+ // required so it will still work in global analysis
+ requiresPartialAnalysis = false
+ )
+ }
+
+ @Test
+ fun correctlyAnnotatedSampleFunction_PropertyWithGetter() {
+ val fooFile = kotlin(
+ """
+ package foo
+
+ class Bar {
+ /**
+ * @sample foo.samples.sampleBar
+ */
+ val bar get() = 0
+ }
+ """
+ )
+
+ val sampleFile = correctlyAnnotatedSampleFile
+
+ checkKotlin(fooFile = fooFile, sampleFile = sampleFile, expectedText = null)
+ }
+
+ @Test
+ fun obsoleteSampledFunction() {
+ val sampleFile = correctlyAnnotatedSampleFile
+
+ val expected =
+ """$sampleFilePath:7: Error: foo.samples.sampleBar is annotated with @Sampled, but is not linked to from a @sample tag. [ObsoleteSampledAnnotation]
+ fun sampleBar() {}
+ ~~~~~~~~~
+1 errors, 0 warnings
+
+ """
+
+ checkKotlin(sampleFile = sampleFile, expectedText = expected)
+ }
+
+ @Test
+ fun invalidSampleLocation() {
+ val sampleFile = kotlin(
+ """
+ package foo.wrong.location
+
+ import androidx.annotation.Sampled
+
+ @Sampled
+ fun sampleBar() {}
+ """
+ )
+
+ val expected =
+ """samples/src/foo/wrong/location/test.kt:7: Error: foo.wrong.location.sampleBar is annotated with @Sampled, but is not linked to from a @sample tag. [ObsoleteSampledAnnotation]
+ fun sampleBar() {}
+ ~~~~~~~~~
+1 errors, 0 warnings
+
+ """
+
+ checkKotlin(sampleFile = sampleFile, expectedText = expected)
+ }
+}
+/* ktlint-enable max-line-length */
diff --git a/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt b/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt
deleted file mode 100644
index 0e6943f..0000000
--- a/lint-checks/src/test/java/androidx/build/lint/SampledAnnotationEnforcerTest.kt
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * Copyright 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-@file:Suppress("KDocUnresolvedReference", "UnstableApiUsage")
-
-package androidx.build.lint
-
-import com.android.tools.lint.checks.infrastructure.ProjectDescription
-import com.android.tools.lint.checks.infrastructure.TestFile
-import com.android.tools.lint.checks.infrastructure.TestFiles.kotlin
-import com.android.tools.lint.checks.infrastructure.TestLintResult
-import com.android.tools.lint.checks.infrastructure.TestLintTask.lint
-import org.junit.Test
-
-/**
- * Test for [SampledAnnotationEnforcer]
- *
- * This tests the following module setup:
- *
- * Module 'foo', which lives in foo
- * Module 'samples', which lives in samples, and depends on 'foo'
- *
- * Unfortunately since we cannot test submodules, we cannot verify the case for
- * foo:samples in this test.
- */
-class SampledAnnotationEnforcerTest {
- private val fooModuleName = "foo"
- private val sampleModuleName = "samples"
-
- private val barFilePath = "../foo/src/foo/Bar.kt"
-
- private val emptySampleFile = kotlin(
- """
- package foo.samples
- """
- )
-
- private val unannotatedSampleFile = kotlin(
- """
- package foo.samples
-
- fun sampleBar() {}
- """
- )
-
- private val multipleMatchingSampleFile = kotlin(
- """
- package foo.samples
-
- fun sampleBar() {}
-
- fun sampleBar() {}
- """
- )
-
- private val correctlyAnnotatedSampleFile = kotlin(
- """
- package foo.samples
-
- @Sampled
- fun sampleBar() {}
- """
- )
-
- private fun checkKotlin(
- fooFile: TestFile? = null,
- sampleFile: TestFile? = null
- ): TestLintResult {
- val projectDescriptions = mutableListOf<ProjectDescription>()
- val fooProject = ProjectDescription().apply {
- name = fooModuleName
- fooFile?.let { files = arrayOf(fooFile) }
- }
- projectDescriptions += fooProject
-
- sampleFile?.let {
- projectDescriptions += ProjectDescription().apply {
- name = sampleModuleName
- files = arrayOf(sampleFile)
- dependsOn(fooProject)
- }
- }
- return lint()
- .projects(*projectDescriptions.toTypedArray())
- .allowMissingSdk(true)
- .issues(
- SampledAnnotationEnforcer.MISSING_SAMPLED_ANNOTATION,
- SampledAnnotationEnforcer.OBSOLETE_SAMPLED_ANNOTATION,
- SampledAnnotationEnforcer.MISSING_SAMPLES_DIRECTORY,
- SampledAnnotationEnforcer.UNRESOLVED_SAMPLE_LINK,
- SampledAnnotationEnforcer.MULTIPLE_FUNCTIONS_FOUND,
- SampledAnnotationEnforcer.INVALID_SAMPLES_LOCATION
- )
- .run()
- }
-
- @Test
- fun missingSampleDirectory_Function() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- fun bar() {}
- }
- """
- )
-
- val expected =
- "src/foo/Bar.kt:6: Error: Couldn't find a valid samples directory in this project" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile)
- .expect(expected)
- }
-
- @Test
- fun unresolvedSampleLink_Function() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- fun bar() {}
- }
- """
- )
-
- val sampleFile = emptySampleFile
-
- val expected =
- "$barFilePath:6: Error: Couldn't find a valid function matching foo.samples.sampleBar" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun unannotatedSampleFunction_Function() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- fun bar() {}
- }
- """
- )
-
- val sampleFile = unannotatedSampleFile
-
- val expected =
- "$barFilePath:6: Error: sampleBar is not annotated with @Sampled, but is linked to" +
-""" from the KDoc of bar [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun multipleMatchingSampleFunctions_Function() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- fun bar() {}
- }
- """
- )
-
- val sampleFile = multipleMatchingSampleFile
-
- val expected =
- "$barFilePath:6: Error: Found multiple functions matching foo.samples.sampleBar" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun correctlyAnnotatedSampleFunction_Function() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- fun bar() {}
- }
- """
- )
-
- val sampleFile = correctlyAnnotatedSampleFile
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expectClean()
- }
-
- @Test
- fun missingSampleDirectory_Class() {
- val fooFile = kotlin(
- """
- package foo
-
- /**
- * @sample foo.samples.sampleBar
- */
- class Bar
- """
- )
-
- val expected =
- "src/foo/Bar.kt:5: Error: Couldn't find a valid samples directory in this project" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile)
- .expect(expected)
- }
-
- @Test
- fun unresolvedSampleLink_Class() {
- val fooFile = kotlin(
- """
- package foo
-
- /**
- * @sample foo.samples.sampleBar
- */
- class Bar
- """
- )
-
- val sampleFile = emptySampleFile
-
- val expected =
- "$barFilePath:5: Error: Couldn't find a valid function matching foo.samples.sampleBar" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun unannotatedSampleFunction_Class() {
- val fooFile = kotlin(
- """
- package foo
-
- /**
- * @sample foo.samples.sampleBar
- */
- class Bar
- """
- )
-
- val sampleFile = unannotatedSampleFile
-
- val expected =
- "$barFilePath:5: Error: sampleBar is not annotated with @Sampled, but is linked to" +
-""" from the KDoc of Bar [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun multipleMatchingSampleFunctions_Class() {
- val fooFile = kotlin(
- """
- package foo
-
- /**
- * @sample foo.samples.sampleBar
- */
- class Bar
- """
- )
-
- val sampleFile = multipleMatchingSampleFile
-
- val expected =
- "$barFilePath:5: Error: Found multiple functions matching foo.samples.sampleBar" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun correctlyAnnotatedSampleFunction_Class() {
- val fooFile = kotlin(
- """
- package foo
-
- /**
- * @sample foo.samples.sampleBar
- */
- class Bar
- """
- )
-
- val sampleFile = correctlyAnnotatedSampleFile
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expectClean()
- }
-
- @Test
- fun missingSampleDirectory_Field() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- const val bar = 0
- }
- """
- )
-
- val expected =
- "src/foo/Bar.kt:6: Error: Couldn't find a valid samples directory in this project" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile)
- .expect(expected)
- }
-
- @Test
- fun unresolvedSampleLink_Field() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- const val bar = 0
- }
- """
- )
-
- val sampleFile = emptySampleFile
-
- val expected =
- "$barFilePath:6: Error: Couldn't find a valid function matching foo.samples.sampleBar" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun unannotatedSampleFunction_Field() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- const val bar = 0
- }
- """
- )
-
- val sampleFile = unannotatedSampleFile
-
- val expected =
- "$barFilePath:6: Error: sampleBar is not annotated with @Sampled, but is linked to" +
-""" from the KDoc of bar [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun multipleMatchingSampleFunctions_Field() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- const val bar = 0
- }
- """
- )
-
- val sampleFile = multipleMatchingSampleFile
-
- val expected =
- "$barFilePath:6: Error: Found multiple functions matching foo.samples.sampleBar" +
-""" [EnforceSampledAnnotation]
- * @sample foo.samples.sampleBar
- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-1 errors, 0 warnings
- """
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expect(expected)
- }
-
- @Test
- fun correctlyAnnotatedSampleFunction_Field() {
- val fooFile = kotlin(
- """
- package foo
-
- class Bar {
- /**
- * @sample foo.samples.sampleBar
- */
- const val bar = 0
- }
- """
- )
-
- val sampleFile = correctlyAnnotatedSampleFile
-
- checkKotlin(fooFile = fooFile, sampleFile = sampleFile)
- .expectClean()
- }
-}
diff --git a/media/media/api/current.txt b/media/media/api/current.txt
index bee633f..13e609b 100644
--- a/media/media/api/current.txt
+++ b/media/media/api/current.txt
@@ -715,10 +715,12 @@
field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_LIMIT";
field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_SUPPORTED_FLAGS";
field public static final String BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED = "android.media.browse.SEARCH_SUPPORTED";
+ field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE = "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS = "android.media.extra.PLAYBACK_STATUS";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE = "android.media.browse.CONTENT_STYLE_BROWSABLE_HINT";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE = "android.media.browse.CONTENT_STYLE_GROUP_TITLE_HINT";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT";
+ field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM = "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2; // 0x2
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED = 0; // 0x0
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED = 1; // 0x1
diff --git a/media/media/api/public_plus_experimental_current.txt b/media/media/api/public_plus_experimental_current.txt
index bee633f..13e609b 100644
--- a/media/media/api/public_plus_experimental_current.txt
+++ b/media/media/api/public_plus_experimental_current.txt
@@ -715,10 +715,12 @@
field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_LIMIT";
field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_SUPPORTED_FLAGS";
field public static final String BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED = "android.media.browse.SEARCH_SUPPORTED";
+ field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE = "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS = "android.media.extra.PLAYBACK_STATUS";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE = "android.media.browse.CONTENT_STYLE_BROWSABLE_HINT";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE = "android.media.browse.CONTENT_STYLE_GROUP_TITLE_HINT";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT";
+ field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM = "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2; // 0x2
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED = 0; // 0x0
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED = 1; // 0x1
diff --git a/media/media/api/restricted_current.txt b/media/media/api/restricted_current.txt
index ad6041c..8c6f90e 100644
--- a/media/media/api/restricted_current.txt
+++ b/media/media/api/restricted_current.txt
@@ -753,10 +753,12 @@
field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_LIMIT = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_LIMIT";
field public static final String BROWSER_ROOT_HINTS_KEY_ROOT_CHILDREN_SUPPORTED_FLAGS = "androidx.media.MediaBrowserCompat.Extras.KEY_ROOT_CHILDREN_SUPPORTED_FLAGS";
field public static final String BROWSER_SERVICE_EXTRAS_KEY_SEARCH_SUPPORTED = "android.media.browse.SEARCH_SUPPORTED";
+ field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE = "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
field public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_STATUS = "android.media.extra.PLAYBACK_STATUS";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE = "android.media.browse.CONTENT_STYLE_BROWSABLE_HINT";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_GROUP_TITLE = "android.media.browse.CONTENT_STYLE_GROUP_TITLE_HINT";
field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE = "android.media.browse.CONTENT_STYLE_PLAYABLE_HINT";
+ field public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM = "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2; // 0x2
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED = 0; // 0x0
field public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED = 1; // 0x1
diff --git a/media/media/src/main/AndroidManifest.xml b/media/media/src/main/AndroidManifest.xml
index 5cede58f..9c20495 100644
--- a/media/media/src/main/AndroidManifest.xml
+++ b/media/media/src/main/AndroidManifest.xml
@@ -13,11 +13,4 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="androidx.media">
- <queries>
- <intent>
- <action android:name="android.media.browse.MediaBrowserService" />
- </intent>
- </queries>
-</manifest>
+<manifest package="androidx.media"/>
diff --git a/media/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java b/media/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java
index fafb972..f0dc856e 100644
--- a/media/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java
+++ b/media/media/src/main/java/android/support/v4/media/MediaBrowserCompat.java
@@ -97,12 +97,23 @@
/**
* Browses media content offered by a {@link MediaBrowserServiceCompat}.
- * <p>
- * This object is not thread-safe. All calls should happen on the thread on which the browser
- * was constructed.
- * </p><p>
- * All callback methods will be called from the thread on which the browser was constructed.
- * </p>
+ *
+ * <p>The app targeting API level 30 or higher must include a {@code <queries>} element in their
+ * manifest to connect to a media browser service in another app. See the following example and
+ * <a href="{@docRoot}training/package-visibility">this guide</a> for more information.</p>
+ *
+ * <pre>{@code
+ * <!-- As an intent action -->
+ * <intent>
+ * <action android:name="android.media.browse.MediaBrowserService" />
+ * </intent>
+ * <!-- Or, as a package name -->
+ * <package android:name="package_name_of_the_other_app" />
+ * }</pre>
+ *
+ * <p>This object is not thread-safe. All calls should happen on the thread on which the browser was
+ * constructed. All callback methods will be called from the thread on which the browser was
+ * constructed.</p>
*
* <div class="special reference">
* <h3>Developer Guides</h3>
@@ -2319,7 +2330,7 @@
Parcelable[] items = resultData.getParcelableArray(
MediaBrowserServiceCompat.KEY_SEARCH_RESULTS);
if (items != null) {
- List<MediaItem> results = new ArrayList<>();
+ List<MediaItem> results = new ArrayList<>(items.length);
for (Parcelable item : items) {
results.add((MediaItem) item);
}
diff --git a/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java b/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
index 771cc26..24b4ce6 100644
--- a/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
+++ b/media/media/src/main/java/android/support/v4/media/session/MediaSessionCompat.java
@@ -2291,7 +2291,7 @@
if (itemList == null || Build.VERSION.SDK_INT < 21) {
return null;
}
- List<QueueItem> items = new ArrayList<>();
+ List<QueueItem> items = new ArrayList<>(itemList.size());
for (Object itemObj : itemList) {
items.add(fromQueueItem(itemObj));
}
@@ -4084,7 +4084,7 @@
mSessionFwk.setQueue(null);
return;
}
- ArrayList<MediaSession.QueueItem> queueItemFwks = new ArrayList<>();
+ ArrayList<MediaSession.QueueItem> queueItemFwks = new ArrayList<>(queue.size());
for (QueueItem item : queue) {
queueItemFwks.add((MediaSession.QueueItem) item.getQueueItem());
}
diff --git a/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java b/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
index ffb99dc..5694f40 100644
--- a/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
+++ b/media/media/src/main/java/androidx/media/MediaBrowserServiceCompat.java
@@ -408,7 +408,7 @@
void onResultSent(@Nullable List<MediaBrowserCompat.MediaItem> list) {
List<Parcel> parcelList = null;
if (list != null) {
- parcelList = new ArrayList<>();
+ parcelList = new ArrayList<>(list.size());
for (MediaBrowserCompat.MediaItem item : list) {
Parcel parcel = Parcel.obtain();
item.writeToParcel(parcel, 0);
@@ -591,7 +591,7 @@
// the list. In other words, we need to apply options here.
list = applyOptions(list, options);
}
- List<Parcel> parcelList = new ArrayList<>();
+ List<Parcel> parcelList = new ArrayList<>(list.size());
for (MediaBrowserCompat.MediaItem item : list) {
Parcel parcel = Parcel.obtain();
item.writeToParcel(parcel, 0);
@@ -1287,7 +1287,7 @@
if (parcelList == null) {
return null;
}
- List<MediaBrowser.MediaItem> items = new ArrayList<>();
+ List<MediaBrowser.MediaItem> items = new ArrayList<>(parcelList.size());
for (Parcel parcel : parcelList) {
parcel.setDataPosition(0);
items.add(MediaBrowser.MediaItem.CREATOR.createFromParcel(parcel));
diff --git a/media/media/src/main/java/androidx/media/utils/MediaConstants.java b/media/media/src/main/java/androidx/media/utils/MediaConstants.java
index 39791a4..f353b2a 100644
--- a/media/media/src/main/java/androidx/media/utils/MediaConstants.java
+++ b/media/media/src/main/java/androidx/media/utils/MediaConstants.java
@@ -323,6 +323,28 @@
"android.media.browse.CONTENT_STYLE_BROWSABLE_HINT";
/**
+ * Bundle key sent through {@link MediaDescriptionCompat#getExtras()} to the hosting {@link
+ * MediaBrowserCompat} to indicate a preference about how the corresponding {@link
+ * MediaBrowserCompat.MediaItem} is presented.
+ *
+ * <p>This preference takes precedence over those expressed by {@link
+ * #DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_PLAYABLE} and {@link
+ * #DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_BROWSABLE}.
+ *
+ * <p>TYPE: int. Possible values are separate constants.
+ *
+ * @see MediaDescriptionCompat#getExtras()
+ * @see MediaDescriptionCompat.Builder#setExtras(Bundle)
+ * @see #DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_LIST_ITEM
+ * @see #DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_GRID_ITEM
+ * @see #DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_LIST_ITEM
+ * @see #DESCRIPTION_EXTRAS_VALUE_CONTENT_STYLE_CATEGORY_GRID_ITEM
+ */
+ @SuppressLint("IntentName")
+ public static final String DESCRIPTION_EXTRAS_KEY_CONTENT_STYLE_SINGLE_ITEM =
+ "android.media.browse.CONTENT_STYLE_SINGLE_ITEM_HINT";
+
+ /**
* Bundle value passed from the {@link MediaBrowserServiceCompat} to the hosting {@link
* MediaBrowserCompat} to indicate a preference that certain instances of {@link
* MediaBrowserCompat.MediaItem} should be presented as list items.
@@ -432,6 +454,25 @@
public static final int DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED = 2;
/**
+ * Bundle key sent through {@link MediaDescriptionCompat#getExtras()} to the hosting {@link
+ * MediaBrowserCompat} to indicate an amount of completion progress for the corresponding
+ * {@link MediaBrowserCompat.MediaItem}. This extra augments {@link
+ * #DESCRIPTION_EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED the partially played status} by
+ * indicating how much has been played by the user.
+ *
+ * <p>TYPE: double, a value between 0.0 and 1.0, inclusive. 0.0 indicates no completion progress
+ * (item is not started) and 1.0 indicates full completion progress (item is fully played).
+ * Values in between indicate partial progress (for example, 0.75 indicates the item is 75%
+ * complete).
+ *
+ * @see MediaDescriptionCompat#getExtras()
+ * @see MediaDescriptionCompat.Builder#setExtras(Bundle)
+ */
+ @SuppressLint("IntentName")
+ public static final String DESCRIPTION_EXTRAS_KEY_COMPLETION_PERCENTAGE =
+ "androidx.media.MediaItem.Extras.COMPLETION_PERCENTAGE";
+
+ /**
* Bundle key used for the media id in {@link PlaybackStateCompat playback state} extras. It's
* for associating the playback state with the media being played so the value is expected to be
* same with {@link MediaMetadataCompat#METADATA_KEY_MEDIA_ID media id} of the current metadata.
diff --git a/media2/media2-session/src/main/AndroidManifest.xml b/media2/media2-session/src/main/AndroidManifest.xml
index 53a302b..0ef9ddd 100644
--- a/media2/media2-session/src/main/AndroidManifest.xml
+++ b/media2/media2-session/src/main/AndroidManifest.xml
@@ -13,17 +13,4 @@
See the License for the specific language governing permissions and
limitations under the License.
-->
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="androidx.media2.session">
- <queries>
- <intent>
- <action android:name="android.media.browse.MediaBrowserService" />
- </intent>
- <intent>
- <action android:name="androidx.media2.session.MediaSessionService" />
- </intent>
- <intent>
- <action android:name="androidx.media2.session.MediaLibraryService" />
- </intent>
- </queries>
-</manifest>
+<manifest package="androidx.media2.session"/>
diff --git a/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java b/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java
index 6019bef..64da6c6 100644
--- a/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java
+++ b/media2/media2-session/src/main/java/androidx/media2/session/MediaController.java
@@ -85,6 +85,7 @@
* <li><a href="#ControllerLifeCycle">Controller Lifecycle</a>
* <li><a href="#MediaSessionInTheSameProcess">Controlling the {@link MediaSession} in the same
* process</a>
+ * <li><a href="#PackageVisibilityFilter">Package Visibility Filter</a>
* </ol>
* <h3 id="ControllerLifeCycle">Controller Lifecycle</h3>
* <p>
@@ -139,6 +140,27 @@
* To avoid such issue, don't block the session callback executor's thread. Creating a dedicated
* thread for the session callback executor would be helpful. See
* {@link Executors#newSingleThreadExecutor} for creating a new thread.
+ * <h3 id="PackageVisibilityFilter">Package Visibility Filter</h3>
+ * <p>
+ * The app targeting API level 30 or higher must include a {@code <queries>} element in their
+ * manifest to connect to a service component of another app like {@link MediaSessionService},
+ * {@link MediaLibraryService}, or {@link androidx.media.MediaBrowserServiceCompat}). See the
+ * following example and <a href="{@docRoot}training/package-visibility">this guide</a> for more
+ * information.
+ * <pre>{@code
+ * <!-- As intent actions -->
+ * <intent>
+ * <action android:name="androidx.media2.session.MediaSessionService" />
+ * </intent>
+ * <intent>
+ * <action android:name="androidx.media2.session.MediaLibraryService" />
+ * </intent>
+ * <intent>
+ * <action android:name="android.media.browse.MediaBrowserService" />
+ * </intent>
+ * <!-- Or, as a package name -->
+ * <package android:name="package_name_of_the_other_app" />
+ * }</pre>
*
* @see MediaSession
* @see MediaSessionService
diff --git a/media2/media2-session/src/main/java/androidx/media2/session/MediaSessionManager.java b/media2/media2-session/src/main/java/androidx/media2/session/MediaSessionManager.java
index 76c311d..c689c10 100644
--- a/media2/media2-session/src/main/java/androidx/media2/session/MediaSessionManager.java
+++ b/media2/media2-session/src/main/java/androidx/media2/session/MediaSessionManager.java
@@ -83,6 +83,22 @@
* Gets {@link Set} of {@link SessionToken} for {@link MediaSessionService} regardless of
* their activeness. This list represents media apps that support background playback.
*
+ * <p>
+ * The app targeting API level 30 or higher must include a {@code <queries>} element in their
+ * manifest to get service tokens of other apps. See the following example and
+ * <a href="{@docRoot}training/package-visibility">this guide</a> for more information.
+ * <pre>{@code
+ * <intent>
+ * <action android:name="androidx.media2.session.MediaSessionService" />
+ * </intent>
+ * <intent>
+ * <action android:name="androidx.media2.session.MediaLibraryService" />
+ * </intent>
+ * <intent>
+ * <action android:name="android.media.browse.MediaBrowserService" />
+ * </intent>
+ * }</pre>
+ *
* @return set of tokens
*/
@NonNull
diff --git a/mediarouter/mediarouter/src/main/res/values-as/strings.xml b/mediarouter/mediarouter/src/main/res/values-as/strings.xml
index bcc7c5a..37a0be4 100644
--- a/mediarouter/mediarouter/src/main/res/values-as/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-as/strings.xml
@@ -36,7 +36,7 @@
<string name="mr_controller_volume_slider" msgid="2955862765169128170">"ধ্বনি শ্লাইডাৰ"</string>
<string name="mr_controller_no_media_selected" msgid="5495452265246139458">"কোনো মিডিয়া বাছনি কৰা হোৱা নাই"</string>
<string name="mr_controller_no_info_available" msgid="855271725131981086">"কোনো তথ্য নাই"</string>
- <string name="mr_controller_casting_screen" msgid="9171231064758955152">"স্ক্ৰীণ কাষ্ট কৰি থকা হৈছে"</string>
+ <string name="mr_controller_casting_screen" msgid="9171231064758955152">"স্ক্ৰীন কাষ্ট কৰি থকা হৈছে"</string>
<string name="mr_dialog_default_group_name" msgid="4115858704575247342">"গোট"</string>
<string name="mr_dialog_groupable_header" msgid="4307018456678388936">"কোনো এটা ডিভাইচ যোগ কৰক"</string>
<string name="mr_dialog_transferable_header" msgid="6068257520605505468">"কোনো এটা গোটত প্লে’ কৰক"</string>
diff --git a/metrics/OWNERS b/metrics/OWNERS
new file mode 100644
index 0000000..e28a4db
--- /dev/null
+++ b/metrics/OWNERS
@@ -0,0 +1,2 @@
+chet@google.com
+ccraik@google.com
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/.gitignore b/metrics/integration-tests/janktest/.gitignore
new file mode 100644
index 0000000..42afabf
--- /dev/null
+++ b/metrics/integration-tests/janktest/.gitignore
@@ -0,0 +1 @@
+/build
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/build.gradle b/metrics/integration-tests/janktest/build.gradle
new file mode 100644
index 0000000..e53ff98
--- /dev/null
+++ b/metrics/integration-tests/janktest/build.gradle
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+plugins {
+ id 'AndroidXPlugin'
+ id 'com.android.application'
+ id 'kotlin-android'
+}
+
+android {
+ buildFeatures {
+ viewBinding true
+ }
+}
+
+dependencies {
+ implementation(libs.kotlinStdlib)
+ implementation project(':recyclerview:recyclerview')
+ implementation project(':navigation:navigation-fragment-ktx')
+ implementation project(':navigation:navigation-ui-ktx')
+ implementation project(':appcompat:appcompat')
+ implementation project(path: ':metrics:metrics-performance')
+ implementation 'com.google.android.material:material:1.2.1'
+ implementation 'androidx.constraintlayout:constraintlayout:2.0.1'
+ implementation 'androidx.multidex:multidex:2.0.1'
+}
diff --git a/metrics/integration-tests/janktest/src/main/AndroidManifest.xml b/metrics/integration-tests/janktest/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..8fef534
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/AndroidManifest.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.metrics.performance.janktest">
+
+ <application
+ android:allowBackup="true"
+ android:label="@string/app_name"
+ android:supportsRtl="true"
+ android:theme="@style/Theme.MaterialComponents.DayNight.DarkActionBar">
+ <activity
+ android:name=".MainActivity"
+ android:label="@string/app_name"
+ android:exported="true"
+ android:theme="@style/Theme.Androidx.NoActionBar">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ </activity>
+ </application>
+
+</manifest>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MainActivity.kt b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MainActivity.kt
new file mode 100644
index 0000000..5e2c52d
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MainActivity.kt
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.janktest
+
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import androidx.appcompat.app.AppCompatActivity
+import androidx.metrics.performance.FrameData
+import androidx.metrics.performance.JankStats
+import androidx.metrics.performance.janktest.databinding.ActivityMainBinding
+import androidx.navigation.findNavController
+import androidx.navigation.ui.AppBarConfiguration
+import androidx.navigation.ui.navigateUp
+import androidx.navigation.ui.setupActionBarWithNavController
+
+class MainActivity : AppCompatActivity() {
+
+ private lateinit var appBarConfiguration: AppBarConfiguration
+ private lateinit var binding: ActivityMainBinding
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ binding = ActivityMainBinding.inflate(layoutInflater)
+ setContentView(binding.root)
+ jankStats = JankStats(binding.root, jankFrameListener)
+ jankStats.addState("Activity", javaClass.simpleName)
+
+ setSupportActionBar(binding.toolbar)
+
+ val navController = findNavController(R.id.nav_host_fragment_content_main)
+ appBarConfiguration = AppBarConfiguration(navController.graph)
+ setupActionBarWithNavController(navController, appBarConfiguration)
+ }
+
+ object jankFrameListener : JankStats.OnFrameListener {
+
+ override fun onJankStatsFrame(frameData: FrameData) {
+ println(
+ "*** Jank frame start, duration, jank = ${frameData.frameStartNanos}, " +
+ "${frameData.frameDurationNanos}, ${frameData.isJank}"
+ )
+ for (state in frameData.states) {
+ println(" ${state.stateName}: ${state.state}")
+ }
+ }
+ }
+
+ lateinit var jankStats: JankStats
+
+ override fun onResume() {
+ super.onResume()
+ jankStats.setTrackingEnabled(true)
+ }
+
+ override fun onPause() {
+ super.onPause()
+ jankStats.setTrackingEnabled(false)
+ }
+
+ override fun onCreateOptionsMenu(menu: Menu): Boolean {
+ // Inflate the menu; this adds items to the action bar if it is present.
+ menuInflater.inflate(R.menu.menu_main, menu)
+ return true
+ }
+
+ override fun onOptionsItemSelected(item: MenuItem): Boolean {
+ // Handle action bar item clicks here. The action bar will
+ // automatically handle clicks on the Home/Up button, so long
+ // as you specify a parent activity in AndroidManifest.xml.
+ return when (item.itemId) {
+ R.id.action_settings -> true
+ else -> super.onOptionsItemSelected(item)
+ }
+ }
+
+ override fun onSupportNavigateUp(): Boolean {
+ val navController = findNavController(R.id.nav_host_fragment_content_main)
+ return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
+ }
+}
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageContent.kt b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageContent.kt
new file mode 100644
index 0000000..9ab2f2a
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageContent.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.janktest
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+
+/**
+ * A simple [Fragment] subclass.
+ */
+class MessageContent : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ // Inflate the layout for this fragment
+ return inflater.inflate(R.layout.fragment_message_content, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ val contentsText = view.findViewById<TextView>(R.id.messageHeader)
+ contentsText.text = arguments?.getString("title")
+ }
+}
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageListAdapter.kt b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageListAdapter.kt
new file mode 100644
index 0000000..4946da0
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageListAdapter.kt
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.janktest
+
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.core.os.bundleOf
+import androidx.navigation.Navigation
+import androidx.recyclerview.widget.RecyclerView
+
+class MessageListAdapter(val messageList: Array<String>) :
+ RecyclerView.Adapter<MessageListAdapter.MessageHeaderViewHolder>() {
+
+ class MessageHeaderViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ private val messageHeaderTV =
+ itemView.findViewById<android.widget.TextView>(R.id.messageHeader)
+ fun bind(headerText: String) {
+ itemView.setOnClickListener {
+ val bundle = bundleOf("title" to headerText)
+ Navigation.findNavController(it).navigate(
+ R.id.action_MessageList_to_messageContent, bundle
+ )
+ }
+ messageHeaderTV.text = headerText
+ }
+ }
+
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MessageHeaderViewHolder {
+ return MessageHeaderViewHolder(
+ LayoutInflater.from(parent.context)
+ .inflate(R.layout.message_item, parent, false)
+ )
+ }
+
+ override fun onBindViewHolder(holder: MessageHeaderViewHolder, position: Int) {
+ holder.bind(messageList[position])
+ }
+
+ override fun getItemCount(): Int {
+ return messageList.size
+ }
+}
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageListFragment.kt b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageListFragment.kt
new file mode 100644
index 0000000..42c5b5a
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MessageListFragment.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.janktest
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+import androidx.metrics.performance.JankStats
+import androidx.recyclerview.widget.RecyclerView
+
+/**
+ * A simple [Fragment] subclass as the second destination in the navigation.
+ */
+class MessageListFragment : Fragment() {
+
+ val messageList: Array<String> = Array<String>(100) {
+ "Message #" + it
+ }
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return inflater.inflate(R.layout.fragment_message_list, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ val recyclerView = view.findViewById<RecyclerView>(R.id.MessageList)
+ recyclerView.adapter = MessageListAdapter(messageList)
+ recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
+ override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
+ val jankStats = activity?.let { JankStats.getInstance(view) }
+ if (jankStats != null) {
+ if (newState == RecyclerView.SCROLL_STATE_DRAGGING) {
+ jankStats.addState("RecyclerView", "Dragging")
+ } else if (newState == RecyclerView.SCROLL_STATE_SETTLING) {
+ jankStats.addState("RecyclerView", "Settling")
+ } else {
+ jankStats.removeState("RecyclerView")
+ }
+ }
+ }
+ })
+ }
+}
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MyCustomView.kt b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MyCustomView.kt
new file mode 100644
index 0000000..527f2ff
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/java/androidx/metrics/performance/janktest/MyCustomView.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.janktest
+
+import android.content.Context
+import android.graphics.Canvas
+import android.util.AttributeSet
+import android.view.View
+
+/**
+ * This custom view is used to inject an artificial, random delay during drawing, to simulate
+ * jank on the UI thread.
+ */
+class MyCustomView : View {
+ constructor(context: Context?) : super(context) {}
+ constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {}
+ constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
+ context,
+ attrs,
+ defStyleAttr
+ )
+
+ override fun onDraw(canvas: Canvas) {
+ /**
+ * Inject random delay to cause jank in the app.
+ * For any given item, there should be a 30% chance of jank (>32ms), and a 2% chance of
+ * extreme jank (>500ms).
+ * Regular jank will be between 32 and 82ms, extreme from 500-700ms.
+ */
+ val probability = Math.random()
+ if (probability > .7) {
+ val delay: Long
+ delay = if (probability > .98) {
+ 500 + (Math.random() * 200).toLong()
+ } else {
+ 32 + (Math.random() * 50).toLong()
+ }
+ try {
+ Thread.sleep(delay)
+ } catch (e: Exception) {
+ }
+ }
+ super.onDraw(canvas)
+ }
+}
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/layout/activity_main.xml b/metrics/integration-tests/janktest/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000..6f794117
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/layout/activity_main.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.coordinatorlayout.widget.CoordinatorLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MainActivity">
+
+ <com.google.android.material.appbar.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="@style/Theme.Androidx.AppBarOverlay">
+
+ <androidx.appcompat.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:popupTheme="@style/Theme.Androidx.PopupOverlay" />
+
+ </com.google.android.material.appbar.AppBarLayout>
+
+ <include layout="@layout/content_main" />
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/layout/content_main.xml b/metrics/integration-tests/janktest/src/main/res/layout/content_main.xml
new file mode 100644
index 0000000..5362eba
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/layout/content_main.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+ <fragment
+ android:id="@+id/nav_host_fragment_content_main"
+ android:name="androidx.navigation.fragment.NavHostFragment"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ app:defaultNavHost="true"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:navGraph="@navigation/nav_graph" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/layout/fragment_message_content.xml b/metrics/integration-tests/janktest/src/main/res/layout/fragment_message_content.xml
new file mode 100644
index 0000000..2c72d67
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/layout/fragment_message_content.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/messageHeader"
+ android:layout_width="0dp"
+ android:layout_height="wrap_content"
+ android:text="@string/hello_blank_fragment"
+ android:textSize="24dp"
+ android:textStyle="bold"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <TextView
+ android:id="@+id/messageContent"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ android:layout_margin="16dp"
+ android:text="Message content placeholder"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@+id/messageHeader" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/layout/fragment_message_list.xml b/metrics/integration-tests/janktest/src/main/res/layout/fragment_message_list.xml
new file mode 100644
index 0000000..3652786
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/layout/fragment_message_list.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".MessageListFragment">
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/MessageList"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ app:layoutManager="LinearLayoutManager"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/layout/message_item.xml b/metrics/integration-tests/janktest/src/main/res/layout/message_item.xml
new file mode 100644
index 0000000..2283a18
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/layout/message_item.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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="wrap_content">
+
+ <LinearLayout
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content">
+
+ <TextView
+ android:id="@+id/messageHeader"
+ android:textSize="24sp"
+ android:textStyle="bold"
+ android:layout_margin="16dp"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="TextView" />
+
+ <androidx.metrics.performance.janktest.MyCustomView
+ android:layout_width="20dp"
+ android:layout_height="20dp"
+ android:background="@color/black" />
+
+ </LinearLayout>
+
+</FrameLayout>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/menu/menu_main.xml b/metrics/integration-tests/janktest/src/main/res/menu/menu_main.xml
new file mode 100644
index 0000000..7d7df57
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/menu/menu_main.xml
@@ -0,0 +1,26 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="androidx.metrics.performance.jankstats.janktest.MainActivity">
+ <item
+ android:id="@+id/action_settings"
+ android:orderInCategory="100"
+ android:title="@string/action_settings"
+ app:showAsAction="never" />
+</menu>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/navigation/nav_graph.xml b/metrics/integration-tests/janktest/src/main/res/navigation/nav_graph.xml
new file mode 100644
index 0000000..7cf0283
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/navigation/nav_graph.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/nav_graph"
+ app:startDestination="@id/MessageList">
+
+ <fragment
+ android:id="@+id/MessageList"
+ android:name="androidx.metrics.performance.janktest.MessageListFragment"
+ android:label="Message List"
+ tools:layout="@layout/fragment_message_list">
+ <action
+ android:id="@+id/action_MessageList_to_messageContent"
+ app:destination="@id/messageContent" />
+ </fragment>
+ <fragment
+ android:id="@+id/messageContent"
+ android:name="androidx.metrics.performance.janktest.MessageContent"
+ android:label="fragment_message_content">
+ <argument
+ android:name="title"
+ app:argType="string" />
+ </fragment>
+</navigation>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml b/metrics/integration-tests/janktest/src/main/res/values/colors.xml
similarity index 71%
copy from glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
copy to metrics/integration-tests/janktest/src/main/res/values/colors.xml
index 86afc60..66e3ad2 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/list_layout_2.xml
+++ b/metrics/integration-tests/janktest/src/main/res/values/colors.xml
@@ -1,4 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
+<?xml version="1.0" encoding="utf-8"?>
+<!--
Copyright 2021 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
@@ -14,7 +15,6 @@
limitations under the License.
-->
-<ListView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceListView2"
- android:layout_width="match_parent"
- android:layout_height="match_parent" />
+<resources>
+ <color name="black">#FF000000</color>
+</resources>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/values/strings.xml b/metrics/integration-tests/janktest/src/main/res/values/strings.xml
new file mode 100644
index 0000000..a434a0a
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/values/strings.xml
@@ -0,0 +1,30 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <string name="app_name">JankTest</string>
+ <string name="action_settings">Settings</string>
+ <!-- Strings used for fragments for navigation -->
+ <string name="first_fragment_label">First Fragment</string>
+ <string name="second_fragment_label">Second Fragment</string>
+ <string name="next">Next</string>
+ <string name="previous">Previous</string>
+
+ <string name="hello_first_fragment">Hello first fragment</string>
+ <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
+ <!-- TODO: Remove or change this placeholder text -->
+ <string name="hello_blank_fragment">Hello blank fragment</string>
+</resources>
\ No newline at end of file
diff --git a/metrics/integration-tests/janktest/src/main/res/values/themes.xml b/metrics/integration-tests/janktest/src/main/res/values/themes.xml
new file mode 100644
index 0000000..0c01cb5
--- /dev/null
+++ b/metrics/integration-tests/janktest/src/main/res/values/themes.xml
@@ -0,0 +1,28 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+
+ <style name="Theme.Androidx.NoActionBar"
+ parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+
+ <style name="Theme.Androidx.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
+
+ <style name="Theme.Androidx.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
+</resources>
\ No newline at end of file
diff --git a/metrics/metrics-performance/build.gradle b/metrics/metrics-performance/build.gradle
new file mode 100644
index 0000000..7c53f2d
--- /dev/null
+++ b/metrics/metrics-performance/build.gradle
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.LibraryGroups
+import androidx.build.Publish
+import androidx.build.RunApiTasks
+
+plugins {
+ id("AndroidXPlugin")
+ id("com.android.library")
+ id("kotlin-android")
+}
+
+dependencies {
+ api(libs.kotlinStdlib)
+ implementation('androidx.core:core:1.5.0-beta01')
+ implementation('androidx.collection:collection:1.1.0')
+
+ annotationProcessor(libs.nullaway)
+
+ androidTestImplementation(libs.testExtJunit)
+ androidTestImplementation(libs.testCore)
+ androidTestImplementation(libs.testRunner)
+ androidTestImplementation(libs.testRules)
+ androidTestImplementation(libs.truth)
+ androidTestImplementation(libs.kotlinStdlib)
+ androidTestImplementation(libs.espressoCore, excludes.espresso)
+ androidTestImplementation(libs.espressoContrib)
+ androidTestImplementation(project(':navigation:navigation-fragment-ktx'))
+ androidTestImplementation(project(':navigation:navigation-ui-ktx'))
+ androidTestImplementation(project(':appcompat:appcompat'))
+ androidTestImplementation(project(':internal-testutils-espresso'))
+ androidTestImplementation(project(':internal-testutils-runtime'))
+ androidTestImplementation(project(':internal-testutils-common'))
+ androidTestImplementation('androidx.core:core-ktx:1.3.2')
+ androidTestImplementation('androidx.constraintlayout:constraintlayout:2.0.1')
+ androidTestImplementation('com.google.android.material:material:1.2.1')
+ androidTestImplementation('androidx.multidex:multidex:2.0.1')
+}
+
+android {
+ defaultConfig {
+ multiDexEnabled true
+ }
+}
+
+androidx {
+
+ name = "AndroidX Metrics"
+ publish = Publish.SNAPSHOT_AND_RELEASE
+ mavenGroup = LibraryGroups.METRICS
+ inceptionYear = "2021"
+ description = "Library for tracking and reporting various runtime metrics for applications"
+ runApiTasks = new RunApiTasks.No("Temporarily disabled pending Executor decision before alpha")
+}
diff --git a/metrics/metrics-performance/src/androidTest/AndroidManifest.xml b/metrics/metrics-performance/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..f0ae7a4
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2015 The Android Open Source Project
+ ~
+ ~ Licensed under the Apache License, Version 2.0 (the "License");
+ ~ you may not use this file except in compliance with the License.
+ ~ You may obtain a copy of the License at
+ ~
+ ~ http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing, software
+ ~ distributed under the License is distributed on an "AS IS" BASIS,
+ ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ~ See the License for the specific language governing permissions and
+ ~ limitations under the License.
+ -->
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+ package="androidx.metrics.performance.test">
+
+ <application android:supportsRtl="true"
+ android:theme="@style/Theme.Androidx"
+ android:name="androidx.multidex.MultiDexApplication">
+ <activity android:name="androidx.metrics.performance.test.DelayedActivity"/>
+ </application>
+</manifest>
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt
new file mode 100644
index 0000000..bd318ea
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedActivity.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.test
+
+import android.os.Bundle
+import androidx.appcompat.app.AppCompatActivity
+import androidx.navigation.findNavController
+import androidx.navigation.ui.AppBarConfiguration
+import androidx.navigation.ui.navigateUp
+import androidx.navigation.ui.setupActionBarWithNavController
+
+public class DelayedActivity : AppCompatActivity() {
+
+ public var delayMs: Long
+ get() {
+ val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+ return delayedView?.delayMs ?: 0
+ }
+ set(value) {
+ val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+ delayedView?.delayMs = value
+ }
+
+ public var repetions: Int
+ get() {
+ val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+ return delayedView?.repetitions ?: 0
+ }
+ set(value) {
+ val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+ delayedView?.repetitions = value
+ }
+
+ public fun invalidate() {
+ val delayedView: DelayedView? = findViewById<DelayedView>(R.id.delayedView)
+ delayedView?.invalidate()
+ }
+
+ private lateinit var appBarConfiguration: AppBarConfiguration
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContentView(R.layout.delayed_activity_main)
+
+ val navController = findNavController(R.id.nav_host_fragment_content_main)
+ appBarConfiguration = AppBarConfiguration(navController.graph)
+ setupActionBarWithNavController(navController, appBarConfiguration)
+ }
+
+ override fun onSupportNavigateUp(): Boolean {
+ val navController = findNavController(R.id.nav_host_fragment_content_main)
+ return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
+ }
+}
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedFragment.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedFragment.kt
new file mode 100644
index 0000000..56ae51b
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedFragment.kt
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.test
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.Button
+import androidx.fragment.app.Fragment
+
+/**
+ * A simple [Fragment] subclass as the default destination in the navigation.
+ */
+public class DelayedFragment : Fragment() {
+
+ lateinit var delayedView: DelayedView
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ val view = inflater.inflate(R.layout.delayed_fragment, container, false)
+ delayedView = view.findViewById(R.id.delayedView)
+ return view
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+
+ val buttonFirst = view.findViewById<Button>(R.id.button_first)
+ buttonFirst.setOnClickListener {
+ delayedView.delayMs = 100
+ delayedView.repetitions = 5
+ delayedView.invalidate()
+ }
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt
new file mode 100644
index 0000000..b9f935b
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/DelayedView.kt
@@ -0,0 +1,37 @@
+package androidx.metrics.performance.test
+
+import android.content.Context
+import android.graphics.Canvas
+import android.os.Build
+import android.util.AttributeSet
+import android.view.View
+import androidx.annotation.RequiresApi
+
+public class DelayedView(context: Context?, attrs: AttributeSet?) :
+ View(context, attrs) {
+
+ public var delayMs: Long = 0
+ public var repetitions: Int = 0
+
+ @RequiresApi(Build.VERSION_CODES.JELLY_BEAN)
+ override fun onDraw(canvas: Canvas?) {
+ if (repetitions > 0) {
+ repetitions--
+ }
+ if (delayMs > 0) {
+ try {
+ Thread.sleep(delayMs)
+ } catch (e: Exception) {
+ }
+ }
+ val randomColor: Int = 0xff000000.toInt() or
+ (((Math.random() * 127) + 128).toInt() shl 16) or
+ (((Math.random() * 127) + 128).toInt() shl 8) or
+ ((Math.random() * 127) + 128).toInt()
+
+ canvas!!.drawColor(randomColor)
+ if (repetitions > 0) {
+ postInvalidateOnAnimation()
+ }
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt
new file mode 100644
index 0000000..acc1c8f
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/JankStatsTest.kt
@@ -0,0 +1,256 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.test
+
+import androidx.core.util.Pair
+import androidx.metrics.performance.FrameData
+import androidx.metrics.performance.JankStats
+import androidx.metrics.performance.JankStats.Companion.jankHeuristicMultiplier
+import androidx.metrics.performance.JankStats.OnFrameListener
+import androidx.metrics.performance.StateInfo
+import androidx.test.annotation.UiThreadTest
+import androidx.test.ext.junit.rules.ActivityScenarioRule
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import org.hamcrest.Matchers
+import org.junit.Assert
+import org.junit.Assert.assertFalse
+import org.junit.Assert.assertTrue
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.util.concurrent.CountDownLatch
+import java.util.concurrent.TimeUnit
+
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class JankStatsTest {
+
+ private lateinit var jankStats: JankStats
+ private lateinit var delayedActivity: DelayedActivity
+ private lateinit var delayedView: DelayedView
+ private lateinit var latchedListener: LatchedListener
+
+ private val IDLE_PAUSE = 1000
+ private val NUM_FRAMES = 10
+
+ @Rule
+ @JvmField
+ var delayedActivityRule: ActivityScenarioRule<DelayedActivity> =
+ ActivityScenarioRule(DelayedActivity::class.java)
+
+ @Before
+ fun setup() {
+ val scenario = delayedActivityRule.scenario
+ scenario.onActivity { activity: DelayedActivity? ->
+ delayedActivity = activity!!
+ delayedView = delayedActivity.findViewById(R.id.delayedView)
+ latchedListener = LatchedListener()
+ latchedListener.latch = CountDownLatch(1)
+ jankStats = JankStats(delayedView, latchedListener)
+ jankStats.setTrackingEnabled(true)
+ }
+ }
+
+ @Test
+ @UiThreadTest
+ fun testGetInstance() {
+ assert(JankStats.getInstance(delayedView) == jankStats)
+ }
+
+ @Test
+ @UiThreadTest
+ fun testEnable() {
+ assertTrue(jankStats.isTrackingEnabled())
+ jankStats.setTrackingEnabled(false)
+ assertFalse(jankStats.isTrackingEnabled())
+ jankStats.setTrackingEnabled(true)
+ assertTrue(jankStats.isTrackingEnabled())
+ }
+
+ @Test
+ fun testNoJank() {
+ val frameDelay = 0
+
+ // Prime the system first to flush out any frames happening before we start forcing jank
+ runDelayTest(0, NUM_FRAMES, latchedListener)
+ latchedListener.reset()
+
+ runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+ Assert.assertEquals("numJankFrames should equal 0", 0, latchedListener.numJankFrames)
+ latchedListener.reset()
+
+ jankHeuristicMultiplier = 0f
+ runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+ Assert.assertEquals(
+ "multiplier 0, extremeMs 0: numJankFrames should equal NUM_FRAMES",
+ NUM_FRAMES, latchedListener.numJankFrames
+ )
+ }
+
+ @Test
+ fun testRegularJank() {
+ val frameDelay = 100
+
+ // Prime the system first to flush out any frames happening before we start forcing jank
+ runDelayTest(0, NUM_FRAMES, latchedListener)
+ latchedListener.reset()
+
+ runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+ Assert.assertEquals(
+ "numJankFrames should equal NUM_FRAMES",
+ NUM_FRAMES,
+ latchedListener.numJankFrames
+ )
+ latchedListener.reset()
+
+ jankHeuristicMultiplier = 20f
+ runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+ Assert.assertEquals(
+ "multiplier 20, extremeMs 0: numJankFrames should equal 0",
+ 0, latchedListener.numJankFrames
+ )
+ }
+
+ @Test
+ fun testFrameStates() {
+ val frameDelay = 100
+ var states: List<StateInfo>
+
+ // Clear out any existing states first to make the testing below more deterministic
+ jankStats.clearStates()
+
+ // prime the system first -some platform versions start with historical data which may not
+ // have the forced-jank frames up front that we're counting on. Running it twice ensures
+ // that our assumptions will be true the second time around
+ runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+ latchedListener.reset()
+
+ val state0 = StateInfo("Testing State 0", "sampleStateA")
+ val state1 = StateInfo("Testing State 1", "sampleStateB")
+ val state2 = StateInfo("Testing State 2", "sampleStateC")
+ jankStats.addState(state0.stateName, state0.state)
+ jankStats.addState(state1.stateName, state1.state)
+ jankStats.addSingleFrameState(state2.stateName, state2.state)
+ runDelayTest(frameDelay, NUM_FRAMES, latchedListener)
+ Assert.assertEquals(
+ "frameDelay 100: There should be 10 frames with jank data", NUM_FRAMES,
+ latchedListener.jankData.size
+ )
+ var item0: FrameData = latchedListener.jankData[0]
+ states = item0.states
+ Assert.assertEquals("There should be 3 states at frame 0", 3, states.size)
+ for (state in states) {
+ // Test that every state is in the states set above
+ Assert.assertThat(state, Matchers.isIn(listOf(state0, state1, state2)))
+ }
+ // Test that all states set above are in the states for the first frame
+ Assert.assertThat(state0, Matchers.isIn(states))
+ Assert.assertThat(state1, Matchers.isIn(states))
+ Assert.assertThat(state2, Matchers.isIn(states))
+
+ // Now test the rest of the frames, which should not include singleFrameState state2
+ for (i in 1 until NUM_FRAMES) {
+ val item = latchedListener.jankData[i]
+ states = item.states
+ Assert.assertEquals("There should be 2 states at frame 0", 2, states.size)
+ for (state in states) {
+ Assert.assertThat(
+ state,
+ Matchers.either(Matchers.`is`(state0)).or(Matchers.`is`(state1))
+ )
+ }
+ }
+
+ // reset by clearing states
+ latchedListener.reset()
+ jankStats.clearStates()
+
+ runDelayTest(frameDelay, 1, latchedListener)
+ item0 = latchedListener.jankData[0]
+ Assert.assertEquals(
+ "States should be empty after being cleared",
+ 0,
+ item0.states.size
+ )
+ latchedListener.reset()
+ val state3 = Pair("Testing State 3", "sampleStateD")
+ val state4 = Pair("Testing State 4", "sampleStateE")
+ jankStats.addState(state3.first!!, state3.second!!)
+ jankStats.addState(state4.first!!, state4.second!!)
+ runDelayTest(frameDelay, 1, latchedListener)
+ item0 = latchedListener.jankData[0]
+ states = item0.states
+ Assert.assertEquals(2, states.size)
+ latchedListener.reset()
+
+ // Test removal of state3 and replacement of state4
+ jankStats.removeState(state3.first!!)
+ jankStats.addState(state4.first!!, "sampleStateF")
+ runDelayTest(frameDelay, 1, latchedListener)
+ item0 = latchedListener.jankData[0]
+ states = item0.states
+ Assert.assertEquals(1, states.size)
+ Assert.assertEquals(state4.first, states[0].stateName)
+ Assert.assertEquals("sampleStateF", states[0].state)
+ latchedListener.reset()
+ }
+
+ private fun runDelayTest(frameDelay: Int, numFrames: Int, listener: LatchedListener) {
+ val latch = CountDownLatch(numFrames)
+ listener.latch = latch
+ delayedActivity.repetions = numFrames
+ delayedActivity.delayMs = frameDelay.toLong()
+ delayedActivityRule.scenario.onActivity {
+ delayedActivity.invalidate()
+ }
+ try {
+ Thread.sleep((numFrames * frameDelay + IDLE_PAUSE).toLong())
+ } catch (e: Exception) {
+ }
+ try {
+ latch.await(20, TimeUnit.SECONDS)
+ } catch (e: InterruptedException) {
+ assert(false)
+ }
+ }
+
+ internal inner class LatchedListener : OnFrameListener {
+ var numJankFrames = 0
+ var jankData = mutableListOf<FrameData>()
+ var latch: CountDownLatch? = null
+
+ fun reset() {
+ jankData.clear()
+ numJankFrames = 0
+ }
+
+ override fun onJankStatsFrame(
+ frameData: FrameData
+ ) {
+ if (latch == null) {
+ throw Exception("latch not set in LatchedListener")
+ } else {
+ if (frameData.isJank) {
+ this.numJankFrames++
+ }
+ this.jankData.add(FrameData(frameData))
+ latch!!.countDown()
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/MyCustomView.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/MyCustomView.kt
new file mode 100644
index 0000000..e5a366b
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/MyCustomView.kt
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance.test
+
+import android.content.Context
+import android.graphics.Canvas
+import android.os.Build
+import android.util.AttributeSet
+import android.view.View
+import androidx.annotation.RequiresApi
+
+/**
+ * This custom view is used to inject an artificial, random delay during drawing, to simulate
+ * jank on the UI thread.
+ */
+public class MyCustomView : View {
+
+ @RequiresApi(Build.VERSION_CODES.LOLLIPOP)
+ public constructor(
+ context: Context?,
+ attrs: AttributeSet? = null,
+ defStyleAttr: Int = 0,
+ defStyleRes: Int = 0
+ ) : super(context, attrs, defStyleAttr, defStyleRes)
+
+ override fun onDraw(canvas: Canvas) {
+ /**
+ * Inject random delay to cause jank in the app.
+ * For any given item, there should be a 30% chance of jank (>32ms), and a 2% chance of
+ * extreme jank (>500ms).
+ * Regular jank will be between 32 and 82ms, extreme from 500-700ms.
+ */
+ val probability = Math.random()
+ if (probability > .7) {
+ val delay: Long
+ delay = if (probability > .98) {
+ 500 + (Math.random() * 200).toLong()
+ } else {
+ 32 + (Math.random() * 50).toLong()
+ }
+ try {
+ Thread.sleep(delay)
+ } catch (e: Exception) {
+ }
+ }
+ super.onDraw(canvas)
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/SecondFragment.kt b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/SecondFragment.kt
new file mode 100644
index 0000000..ab1afbc
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/java/androidx/metrics/performance/test/SecondFragment.kt
@@ -0,0 +1,29 @@
+package androidx.metrics.performance.test
+
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import androidx.fragment.app.Fragment
+
+/**
+ * A simple [Fragment] subclass as the second destination in the navigation.
+ */
+class SecondFragment : Fragment() {
+
+ override fun onCreateView(
+ inflater: LayoutInflater,
+ container: ViewGroup?,
+ savedInstanceState: Bundle?
+ ): View? {
+ return inflater.inflate(R.layout.second_fragment, container, false)
+ }
+
+ override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
+ super.onViewCreated(view, savedInstanceState)
+ }
+
+ override fun onDestroyView() {
+ super.onDestroyView()
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/drawable-v24/ic_launcher_foreground.xml b/metrics/metrics-performance/src/androidTest/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000..a33a0dc
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,46 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:aapt="http://schemas.android.com/aapt"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108">
+ <path android:pathData="M31,63.928c0,0 6.4,-11 12.1,-13.1c7.2,-2.6 26,-1.4 26,-1.4l38.1,38.1L107,108.928l-32,-1L31,63.928z">
+ <aapt:attr name="android:fillColor">
+ <gradient
+ android:endX="85.84757"
+ android:endY="92.4963"
+ android:startX="42.9492"
+ android:startY="49.59793"
+ android:type="linear">
+ <item
+ android:color="#44000000"
+ android:offset="0.0" />
+ <item
+ android:color="#00000000"
+ android:offset="1.0" />
+ </gradient>
+ </aapt:attr>
+ </path>
+ <path
+ android:fillColor="#FFFFFF"
+ android:fillType="nonZero"
+ android:pathData="M65.3,45.828l3.8,-6.6c0.2,-0.4 0.1,-0.9 -0.3,-1.1c-0.4,-0.2 -0.9,-0.1 -1.1,0.3l-3.9,6.7c-6.3,-2.8 -13.4,-2.8 -19.7,0l-3.9,-6.7c-0.2,-0.4 -0.7,-0.5 -1.1,-0.3C38.8,38.328 38.7,38.828 38.9,39.228l3.8,6.6C36.2,49.428 31.7,56.028 31,63.928h46C76.3,56.028 71.8,49.428 65.3,45.828zM43.4,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2c-0.3,-0.7 -0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C45.3,56.528 44.5,57.328 43.4,57.328L43.4,57.328zM64.6,57.328c-0.8,0 -1.5,-0.5 -1.8,-1.2s-0.1,-1.5 0.4,-2.1c0.5,-0.5 1.4,-0.7 2.1,-0.4c0.7,0.3 1.2,1 1.2,1.8C66.5,56.528 65.6,57.328 64.6,57.328L64.6,57.328z"
+ android:strokeColor="#00000000"
+ android:strokeWidth="1" />
+</vector>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/drawable/ic_launcher_background.xml b/metrics/metrics-performance/src/androidTest/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000..0b0ed1d
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,186 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="108dp"
+ android:height="108dp"
+ android:viewportHeight="108"
+ android:viewportWidth="108">
+ <path
+ android:fillColor="#3DDC84"
+ android:pathData="M0,0h108v108h-108z" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M9,0L9,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,0L19,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,0L29,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,0L39,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,0L49,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,0L59,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,0L69,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,0L79,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M89,0L89,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M99,0L99,108"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,9L108,9"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,19L108,19"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,29L108,29"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,39L108,39"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,49L108,49"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,59L108,59"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,69L108,69"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,79L108,79"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,89L108,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M0,99L108,99"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,29L89,29"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,39L89,39"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,49L89,49"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,59L89,59"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,69L89,69"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M19,79L89,79"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M29,19L29,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M39,19L39,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M49,19L49,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M59,19L59,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M69,19L69,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+ <path
+ android:fillColor="#00000000"
+ android:pathData="M79,19L79,89"
+ android:strokeColor="#33FFFFFF"
+ android:strokeWidth="0.8" />
+</vector>
diff --git a/metrics/metrics-performance/src/androidTest/res/layout/delayed_activity_main.xml b/metrics/metrics-performance/src/androidTest/res/layout/delayed_activity_main.xml
new file mode 100644
index 0000000..199dce4
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/layout/delayed_activity_main.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".DelayedActivity">
+
+ <com.google.android.material.appbar.AppBarLayout
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:theme="@style/Theme.Androidx.AppBarOverlay">
+
+ <androidx.appcompat.widget.Toolbar
+ android:id="@+id/toolbar"
+ android:layout_width="match_parent"
+ android:layout_height="?attr/actionBarSize"
+ android:background="?attr/colorPrimary"
+ app:popupTheme="@style/Theme.Androidx.PopupOverlay" />
+
+ </com.google.android.material.appbar.AppBarLayout>
+
+ <include layout="@layout/delayed_content_main" />
+
+</androidx.coordinatorlayout.widget.CoordinatorLayout>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/layout/delayed_content_main.xml b/metrics/metrics-performance/src/androidTest/res/layout/delayed_content_main.xml
new file mode 100644
index 0000000..add7251
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/layout/delayed_content_main.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ app:layout_behavior="@string/appbar_scrolling_view_behavior">
+
+ <fragment
+ android:id="@+id/nav_host_fragment_content_main"
+ android:name="androidx.navigation.fragment.NavHostFragment"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ app:defaultNavHost="true"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintLeft_toLeftOf="parent"
+ app:layout_constraintRight_toRightOf="parent"
+ app:layout_constraintTop_toTopOf="parent"
+ app:navGraph="@navigation/delayed_nav_graph" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/layout/delayed_fragment.xml b/metrics/metrics-performance/src/androidTest/res/layout/delayed_fragment.xml
new file mode 100644
index 0000000..82af2d9
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/layout/delayed_fragment.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".DelayedFragment">
+
+ <androidx.metrics.performance.test.DelayedView
+ android:id="@+id/delayedView"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ app:layout_constraintBottom_toTopOf="@+id/button_first"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <Button
+ android:id="@+id/button_first"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/next"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/layout/second_fragment.xml b/metrics/metrics-performance/src/androidTest/res/layout/second_fragment.xml
new file mode 100644
index 0000000..bd90524
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/layout/second_fragment.xml
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ tools:context=".SecondFragment">
+
+ <TextView
+ android:id="@+id/textview_second"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ app:layout_constraintBottom_toTopOf="@id/button_second"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+ <Button
+ android:id="@+id/button_second"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:text="@string/previous"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toBottomOf="@id/textview_second" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/menu/menu_main.xml b/metrics/metrics-performance/src/androidTest/res/menu/menu_main.xml
new file mode 100644
index 0000000..32ca0b9
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/menu/menu_main.xml
@@ -0,0 +1,26 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ tools:context="androidx.performance.jankstats.test.MainActivity">
+ <item
+ android:id="@+id/action_settings"
+ android:orderInCategory="100"
+ android:title="@string/action_settings"
+ app:showAsAction="never" />
+</menu>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml b/metrics/metrics-performance/src/androidTest/res/mipmap-anydpi-v26/ic_launcher.xml
similarity index 62%
copy from glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
copy to metrics/metrics-performance/src/androidTest/res/mipmap-anydpi-v26/ic_launcher.xml
index 8e05759..e4e4317 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,8 +15,7 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
\ No newline at end of file
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml b/metrics/metrics-performance/src/androidTest/res/mipmap-anydpi-v26/ic_launcher_round.xml
similarity index 62%
copy from glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
copy to metrics/metrics-performance/src/androidTest/res/mipmap-anydpi-v26/ic_launcher_round.xml
index 8e05759..e4e4317 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/column_layout.xml
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -1,5 +1,6 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,8 +15,7 @@
limitations under the License.
-->
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical" />
\ No newline at end of file
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+ <background android:drawable="@drawable/ic_launcher_background" />
+ <foreground android:drawable="@drawable/ic_launcher_foreground" />
+</adaptive-icon>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-hdpi/ic_launcher.png b/metrics/metrics-performance/src/androidTest/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000..a571e60
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-hdpi/ic_launcher.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-hdpi/ic_launcher_round.png b/metrics/metrics-performance/src/androidTest/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000..61da551
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-hdpi/ic_launcher_round.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-mdpi/ic_launcher.png b/metrics/metrics-performance/src/androidTest/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000..c41dd28
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-mdpi/ic_launcher.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-mdpi/ic_launcher_round.png b/metrics/metrics-performance/src/androidTest/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000..db5080a
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-mdpi/ic_launcher_round.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-xhdpi/ic_launcher.png b/metrics/metrics-performance/src/androidTest/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000..6dba46d
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-xhdpi/ic_launcher.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-xhdpi/ic_launcher_round.png b/metrics/metrics-performance/src/androidTest/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..da31a87
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-xhdpi/ic_launcher_round.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-xxhdpi/ic_launcher.png b/metrics/metrics-performance/src/androidTest/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000..15ac681
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-xxhdpi/ic_launcher.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-xxhdpi/ic_launcher_round.png b/metrics/metrics-performance/src/androidTest/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..b216f2d
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-xxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-xxxhdpi/ic_launcher.png b/metrics/metrics-performance/src/androidTest/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000..f25a419
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-xxxhdpi/ic_launcher.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/mipmap-xxxhdpi/ic_launcher_round.png b/metrics/metrics-performance/src/androidTest/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000..e96783c
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/mipmap-xxxhdpi/ic_launcher_round.png
Binary files differ
diff --git a/metrics/metrics-performance/src/androidTest/res/navigation/delayed_nav_graph.xml b/metrics/metrics-performance/src/androidTest/res/navigation/delayed_nav_graph.xml
new file mode 100644
index 0000000..223feb2
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/navigation/delayed_nav_graph.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<navigation xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/nav_graph"
+ app:startDestination="@id/DelayedFragment">
+
+ <fragment
+ android:id="@+id/DelayedFragment"
+ android:name="androidx.metrics.performance.test.DelayedFragment"
+ android:label="@string/first_fragment_label"
+ tools:layout="@layout/delayed_fragment">
+
+ <action
+ android:id="@+id/action_DelayedFragment_to_SecondFragment"
+ app:destination="@id/SecondFragment" />
+ </fragment>
+ <fragment
+ android:id="@+id/SecondFragment"
+ android:name="androidx.metrics.performance.test.SecondFragment"
+ android:label="@string/second_fragment_label"
+ tools:layout="@layout/second_fragment">
+
+ <action
+ android:id="@+id/action_SecondFragment_to_DelayedFragment"
+ app:destination="@id/DelayedFragment" />
+ </fragment>
+</navigation>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/values-night/themes.xml b/metrics/metrics-performance/src/androidTest/res/values-night/themes.xml
new file mode 100644
index 0000000..262c17d
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/values-night/themes.xml
@@ -0,0 +1,32 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!-- Base application theme. -->
+ <style name="Theme.Androidx" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+ <!-- Primary brand color. -->
+ <item name="colorPrimary">@color/purple_200</item>
+ <item name="colorPrimaryVariant">@color/purple_700</item>
+ <item name="colorOnPrimary">@color/black</item>
+ <!-- Secondary brand color. -->
+ <item name="colorSecondary">@color/teal_200</item>
+ <item name="colorSecondaryVariant">@color/teal_200</item>
+ <item name="colorOnSecondary">@color/black</item>
+ <!-- Status bar color. -->
+ <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+ <!-- Customize your theme here. -->
+ </style>
+</resources>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/values/colors.xml b/metrics/metrics-performance/src/androidTest/res/values/colors.xml
new file mode 100644
index 0000000..996b5ff
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/values/colors.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <color name="purple_200">#FFBB86FC</color>
+ <color name="purple_500">#FF6200EE</color>
+ <color name="purple_700">#FF3700B3</color>
+ <color name="teal_200">#FF03DAC5</color>
+ <color name="teal_700">#FF018786</color>
+ <color name="black">#FF000000</color>
+ <color name="white">#FFFFFFFF</color>
+</resources>
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml b/metrics/metrics-performance/src/androidTest/res/values/dimens.xml
similarity index 66%
copy from glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
copy to metrics/metrics-performance/src/androidTest/res/values/dimens.xml
index b627d38..09d0a25 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
+++ b/metrics/metrics-performance/src/androidTest/res/values/dimens.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="utf-8"?><!--
- Copyright 2021 The Android Open Source Project
+<!--
+ Copyright 2020 The Android Open Source Project
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
@@ -14,7 +14,6 @@
limitations under the License.
-->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+<resources>
+ <dimen name="fab_margin">16dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/values/strings.xml b/metrics/metrics-performance/src/androidTest/res/values/strings.xml
new file mode 100644
index 0000000..a434a0a
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/values/strings.xml
@@ -0,0 +1,30 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources>
+ <string name="app_name">JankTest</string>
+ <string name="action_settings">Settings</string>
+ <!-- Strings used for fragments for navigation -->
+ <string name="first_fragment_label">First Fragment</string>
+ <string name="second_fragment_label">Second Fragment</string>
+ <string name="next">Next</string>
+ <string name="previous">Previous</string>
+
+ <string name="hello_first_fragment">Hello first fragment</string>
+ <string name="hello_second_fragment">Hello second fragment. Arg: %1$s</string>
+ <!-- TODO: Remove or change this placeholder text -->
+ <string name="hello_blank_fragment">Hello blank fragment</string>
+</resources>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/androidTest/res/values/themes.xml b/metrics/metrics-performance/src/androidTest/res/values/themes.xml
new file mode 100644
index 0000000..f35d3ea
--- /dev/null
+++ b/metrics/metrics-performance/src/androidTest/res/values/themes.xml
@@ -0,0 +1,41 @@
+<!--
+ Copyright 2020 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<resources xmlns:tools="http://schemas.android.com/tools">
+ <!-- Base application theme. -->
+ <style name="Theme.Androidx" parent="Theme.MaterialComponents.DayNight.DarkActionBar">
+ <!-- Primary brand color. -->
+ <item name="colorPrimary">@color/purple_500</item>
+ <item name="colorPrimaryVariant">@color/purple_700</item>
+ <item name="colorOnPrimary">@color/white</item>
+ <!-- Secondary brand color. -->
+ <item name="colorSecondary">@color/teal_200</item>
+ <item name="colorSecondaryVariant">@color/teal_700</item>
+ <item name="colorOnSecondary">@color/black</item>
+ <!-- Status bar color. -->
+ <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
+ <!-- Customize your theme here. -->
+ </style>
+
+ <style name="Theme.Androidx.NoActionBar">
+ <item name="windowActionBar">false</item>
+ <item name="windowNoTitle">true</item>
+ </style>
+
+ <style name="Theme.Androidx.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar" />
+
+ <style name="Theme.Androidx.PopupOverlay" parent="ThemeOverlay.AppCompat.Light" />
+</resources>
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/AndroidManifest.xml b/metrics/metrics-performance/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..fc276f0
--- /dev/null
+++ b/metrics/metrics-performance/src/main/AndroidManifest.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Copyright (C) 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+<manifest package="androidx.metrics.performance"/>
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/FrameData.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/FrameData.kt
new file mode 100644
index 0000000..01c003f
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/FrameData.kt
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+/**
+ * This class stores duration data for a single frame.
+ */
+class FrameData(
+ /**
+ * The time at which this frame began (in nanoseconds)
+ */
+ val frameStartNanos: Long,
+ /**
+ * The duration of this frame (in nanoseconds)
+ */
+ val frameDurationNanos: Long,
+
+ /**
+ * Whether this frame was determined to be janky, meaning that its
+ * duration exceeds the duration determined by the system to indicate jank (@see
+ * [JankStats.jankHeuristicMultiplier])
+ */
+ val isJank: Boolean,
+
+ /**
+ * The UI/app state during this frame. This is the information set by the app, or by
+ * other library code, that can be used later, during analysis, to determine what
+ * UI state was current when jank occurred.
+ *
+ * @see JankStats.addState
+ */
+ val states: List<StateInfo>
+
+) {
+
+ constructor(frameData: FrameData) : this(
+ frameData.frameStartNanos,
+ frameData.frameDurationNanos,
+ frameData.isJank,
+ frameData.states
+ )
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as FrameData
+
+ if (frameStartNanos != other.frameStartNanos) return false
+ if (frameDurationNanos != other.frameDurationNanos) return false
+ if (isJank != other.isJank) return false
+ if (states != other.states) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = frameStartNanos.hashCode()
+ result = 31 * result + frameDurationNanos.hashCode()
+ result = 31 * result + isJank.hashCode()
+ result = 31 * result + states.hashCode()
+ return result
+ }
+}
+
+class StateInfo(val stateName: String, val state: String) {
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (javaClass != other?.javaClass) return false
+
+ other as StateInfo
+
+ if (stateName != other.stateName) return false
+ if (state != other.state) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = stateName.hashCode()
+ result = 31 * result + state.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt
new file mode 100644
index 0000000..e4111ce
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStats.kt
@@ -0,0 +1,433 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+import android.app.Activity
+import android.content.ContextWrapper
+import android.os.Build
+import android.view.View
+import androidx.annotation.UiThread
+
+/**
+ * This class is used to both accumulate and report information about UI "jank" (runtime
+ * performance problems) in an application.
+ *
+ * There are three major components at work in JankStats:
+ *
+ * **Identifying Jank**: This library uses internal heuristics to determine when
+ * jank has occurred, and uses that information to know when to issue jank reports so
+ * that developers have information on those problems to help analyze and fix the issues.
+ *
+ * **Providing UI Context**: To make the jank reports more useful and actionable,
+ * the system provides a mechanism to help track the current state of the UI and user.
+ * This information is provided whenever reports are logged, so that developers can
+ * understand not only when problems occurred, but what the user was doing at the time,
+ * to help identify problem areas in the application that can then be addressed. Some
+ * of this state is provided automatically, and internally, by various AndroidX libraries.
+ * But developers are encouraged to provide their own app-specific state as well.
+ *
+ * **Reporting Results**: On every frame, the JankStats client is notified via the listener
+ * they supplied with information about that frame, including how long the frame took to
+ * complete, whether it was considered jank, and what the UI context was during that frame.
+ * Clients are encouraged to aggregate and upload the data as they see fit for analysis that
+ * can help debug overall performance problems.
+ *
+ * Note that the behavior of JankStats varies according to API level, because it is dependent
+ * upon underlying capabilities in the platform to determine frame timing information.
+ * Below API level 16, JankStats does nothing, because there is no way to derive dependable
+ * frame timing data. Starting at API level 16, JankStats uses rough frame timing information
+ * that can at least provide estimates of how long frames should have taken, compared to how
+ * long they actually took. Starting with API level 24, frame durations are more dependable,
+ * using platform timing APIs that are available in that release. And starting in API level
+ * 31, there is even more underlying platform information which helps provide more accurate
+ * timing still. On all of these releases (starting with API level 16), the base functionality
+ * of JankStats should at least provide useful information about performance problems, along
+ * with the state of the application during those frames, but the timing data will be necessarily
+ * more accurate for later releases, as described above.
+ *
+ * @param view Any view in the hierarchy which this JankStats object will track. A JankStats
+ * instance is specific to each window in an application, since the timining metrics are tracked
+ * on a per-window basis internally, and the view hiearchy can be used as a proxy for that window.
+ * @param frameListener This listener will be called on any frame in which jank is detected.
+ */
+@Suppress("SingletonConstructor", "ExecutorRegistration")
+class JankStats @UiThread constructor(
+ view: View,
+ private val frameListener: OnFrameListener
+) {
+
+ /**
+ * Whether this JankStats instance is enabled for tracking and reporting jank data.
+ * @see [.setTrackingEnabled]
+ */
+ private var trackingEnabled = false
+
+ /**
+ * Data to track UI and user state in this JankStats object.
+ *
+ * @see addState
+ * @see markStateForRemoval
+ */
+ private var states = mutableListOf<StateData>()
+
+ /**
+ * Temporary per-frame to track UI and user state.
+ * Unlike the states tracked in `states`, any state in this structure is only valid until
+ * the next frame, at which point it is cleared. Any state data added here is automatically
+ * removed; there is no matching "remove" method for [.addSingleFrameState]
+ *
+ * @see addSingleFrameState
+ */
+ private var singleFrameStates = mutableListOf<StateData>()
+
+ /**
+ * JankStats uses the platform FrameMetrics API internally when it is available to track frame
+ * timings. It turns this data into "jank" metrics. Prior to API 24, it uses other mechanisms
+ * to derive frame durations (not as dependable as FrameMetrics, but better than nothing).
+ *
+ * Because of this platform version limitation, most of the functionality of
+ * JankStats is in the impl class, which is instantiated when necessary
+ * based on the runtime OS version. The JankStats API is basically a think wrapper around
+ * the implementations in these classes.
+ */
+ private val implementation =
+ when {
+ Build.VERSION.SDK_INT >= 31 -> {
+ JankStatsApi31Impl(this, view)
+ }
+ Build.VERSION.SDK_INT >= 26 -> {
+ JankStatsApi26Impl(this, view)
+ }
+ Build.VERSION.SDK_INT >= 24 -> {
+ JankStatsApi24Impl(this, view)
+ }
+ Build.VERSION.SDK_INT >= 22 -> {
+ JankStatsApi22Impl(this, view)
+ }
+ Build.VERSION.SDK_INT >= 16 -> {
+ JankStatsApi16Impl(this, view)
+ }
+ else -> {
+ JankStatsBaseImpl(this)
+ }
+ }
+
+ /**
+ * Enabling tracking causes JankStats to listen to system frame-timing information and
+ * record data on a per-frame basis that can later be reported to the JankStats listener.
+ *
+ * @param enabled true to enable tracking, false otherwise
+ */
+ @UiThread
+ fun setTrackingEnabled(enabled: Boolean) {
+ implementation.setupFrameTimer(enabled)
+ trackingEnabled = enabled
+ }
+
+ fun isTrackingEnabled(): Boolean {
+ return trackingEnabled
+ }
+
+ private fun addFrameState(
+ frameStartTime: Long,
+ frameEndTime: Long,
+ frameStates: MutableList<StateInfo>,
+ activeStates: MutableList<StateData>
+ ) {
+ synchronized(activeStates) {
+ for (i in activeStates.indices.reversed()) {
+ // idea: add state if state was active during this frame
+ // so state start time must be before vsync+duration
+ // also, if state end time < vsync, delete it
+ val item = activeStates[i]
+ if (item.timeRemoved > 0 && item.timeRemoved < frameStartTime) {
+ activeStates.removeAt(i)
+ } else if (item.timeAdded < frameEndTime) {
+ // Only add unique state. There may be several states added in
+ // a given frame (especially during heavy jank periods), but it is
+ // only necessary/helpful to log one of those items
+ var add = true
+ for (pair in frameStates) {
+ if (pair == item.state) {
+ add = false
+ break
+ }
+ }
+ if (add) {
+ frameStates.add(item.state)
+ // Single-frame states should only be logged once
+ if (activeStates == singleFrameStates) {
+ activeStates.removeAt(i)
+ }
+ }
+ }
+ }
+ }
+ }
+
+ /**
+ * This method doesn't actually remove it from the
+ * given list of states, but instead logs the time at which removal was requested.
+ * This enables more accurate sync'ing of states with specific frames, depending on
+ * when states are added/removed and when frames start/end. States will actually be removed
+ * from the list later, as they fall out of the current frame start times and stop being
+ * a factor in logging.
+ *
+ * @param stateName The name used for this state, should match the name used when
+ * [adding][addState] the state previously.
+ * @param states The list of states to remove this from (either the regular state
+ * info or the singleFrame info)
+ * @param removalTime The timestamp of this request. This will be used to log the time that
+ * this state stopped being active, which will be used later to sync
+ * states with frame boundaries.
+ */
+ private fun markStateForRemoval(
+ stateName: String,
+ states: List<StateData>,
+ removalTime: Long
+ ) {
+ for (i in states.indices) {
+ val item = states[i]
+ if (item.state.stateName == stateName && item.timeRemoved < 0) {
+ item.timeRemoved = removalTime
+ }
+ }
+ }
+
+ /**
+ * Adds information about the state of the application that may be useful in
+ * future JankStats report logs.
+ *
+ * State information can be about UI elements that are currently active (such as the current
+ * [Activity] or layout) or a user interaction like flinging a list.
+ *
+ * Some state may be provided automatically by other AndroidX libraries.
+ * But applications are encouraged to add user state specific to those applications
+ * to provide more context and more actionable information in JankStats logs.
+ *
+ * For example, an app that wanted to track jank data about a specific transition
+ * in a picture-gallery view might provide state like this:
+ *
+ * `JankStats.addState("GalleryTransition", "Running")`
+ *
+ * @param stateName An arbitrary name used for this state, used as a key for storing
+ * the state value.
+ * @param state The value of this state.
+ * @see JankStats.removeState
+ */
+ fun addState(stateName: String, state: String) {
+ synchronized(states) {
+ val nowTime = System.nanoTime()
+ markStateForRemoval(stateName, states, nowTime)
+ states.add(
+ StateData(
+ nowTime, -1,
+ StateInfo(stateName, state)
+ )
+ )
+ }
+ // TODO: consider pooled Pair objects that we reuse here instead of creating new
+ // ones every time
+ }
+
+ /**
+ * [addSingleFrameState] is like [addState], except it persists only for the
+ * current frame and will be automatically removed after it is logged for that frame.
+ *
+ * This method can be used for very short-lived state, or state for which it may be
+ * difficult to determine when it should be removed (leading to erroneous data if state
+ * is left present long after it actually stopped happening in the app).
+ *
+ * @param stateName An arbitrary name used for this state, used as a key for storing
+ * the state value.
+ * @param state The value of this state.
+ * @see JankStats.addState
+ */
+ fun addSingleFrameState(
+ stateName: String,
+ state: String
+ ) {
+ synchronized(singleFrameStates) {
+ val nowTime = System.nanoTime()
+ markStateForRemoval(stateName, singleFrameStates, nowTime)
+ singleFrameStates.add(
+ StateData(
+ nowTime, -1,
+ StateInfo(stateName, state)
+ )
+ )
+ }
+ }
+
+ private fun markStateForRemoval(stateName: String) {
+ markStateForRemoval(stateName, states, System.nanoTime())
+ }
+
+ private fun markSingleFrameStateForRemoval(stateName: String) {
+ markStateForRemoval(stateName, singleFrameStates, System.nanoTime())
+ }
+
+ /**
+ * Removes all states (including singleFrame states).
+ */
+ fun clearStates() {
+ for (stateData in states) {
+ markStateForRemoval(stateData.state.stateName)
+ }
+ for (stateData in singleFrameStates) {
+ markStateForRemoval(stateData.state.stateName)
+ }
+ }
+
+ /**
+ * Internal representation of state information. timeAdded/Removed allows synchronizing states
+ * with frame boundaries during the FrameMetrics callback, when we can compare which states
+ * were active during any given frame start/end period.
+ */
+ internal inner class StateData(
+ var timeAdded: Long,
+ var timeRemoved: Long,
+ var state: StateInfo
+ )
+
+ /**
+ * Removes information about a specified state.
+ *
+ * [removeState] is typically called when
+ * the user stops being in that state, either leaving a container previously added to
+ * the state, or stopping some interaction that was added.
+ *
+ * @param stateName The name used for this state, should match the name used when
+ * [adding][addState] the state previously.
+ * @see JankStats.addState
+ */
+ fun removeState(stateName: String) {
+ markStateForRemoval(stateName)
+ }
+
+ internal fun logFrameData(startTime: Long, actualDuration: Long, expectedDuration: Long) {
+ val endTime = startTime + actualDuration
+ val frameStates = ArrayList<StateInfo>(
+ states.size +
+ singleFrameStates.size
+ )
+ addFrameState(
+ startTime, endTime, frameStates,
+ states
+ )
+ addFrameState(
+ startTime, endTime,
+ frameStates, singleFrameStates
+ )
+ val frameData = FrameData(
+ startTime, actualDuration, (actualDuration > expectedDuration), frameStates
+ )
+ frameListener.onJankStatsFrame(frameData)
+ // Remove any states intended for just one frame
+ if (singleFrameStates.size > 0) {
+ synchronized(singleFrameStates) {
+ for (state in singleFrameStates) {
+ markSingleFrameStateForRemoval(state.state.stateName)
+ }
+ }
+ }
+ }
+
+ companion object {
+ /**
+ * Gets a JankStats object for the given View.
+ *
+ * There is only ever one JankStats object per View hierarchy; those singleton objects are
+ * retrieved by calling this method. The View used can be any view currently attached in
+ * the hierarchy; the JankStats object is cached at the root level of the hierarchy.
+ * If no such object exists, null will be returned.
+ *
+ * This accessor is provided as a utility to simplify accessing a shared JankStats object
+ * from different places in an application. It is used by other AndroidX library code
+ * which can set information on an existing JankStats object if it exists.
+ *
+ * Because this method takes a View instance, it should only be called on the UI
+ * thread, to ensure that that View is usable at this time, since it will be used
+ * internally to set up hierarchy-specific JankStats logging.
+ *
+ * @param view The View for which the JankStats object is requested.
+ * @return A JankStatus object for the given View's hierarchy, or null if no such object
+ * exists.
+ */
+ @JvmStatic
+ @UiThread
+ fun getInstance(view: View): JankStats? {
+ val activity: Activity? = generateSequence(view.context) {
+ if (it is ContextWrapper) {
+ it.baseContext
+ } else null
+ }.firstOrNull { it is Activity } as Activity?
+
+ return activity?.window?.decorView?.getTag(R.id.jankstats) as JankStats?
+ }
+
+ /**
+ * This multiplier is used to determine when frames are exhibiting jank.
+ *
+ * The factor is multiplied by the current refresh rate to calculate a frame
+ * duration beyond which frames are considered, and reported, as having jank.
+ * By default, the multiplier is 2.
+ */
+ @JvmStatic
+ var jankHeuristicMultiplier: Float = 2.0f
+ set(value) {
+ // reset calculated value to force recalculation based on new heuristic
+ JankStatsBaseImpl.frameDuration = -1
+ field = value
+ }
+ }
+
+ init {
+ val activity: Activity? = generateSequence(view.context) {
+ if (it is ContextWrapper) {
+ it.baseContext
+ } else null
+ }.firstOrNull { it is Activity } as Activity?
+
+ activity?.window?.decorView?.setTag(R.id.jankstats, this)
+ }
+
+ /**
+ * This listener is called on every frame to supply ongoing jank data to apps.
+ *
+ * [JankStats] requires an implementation of this listener at construction time.
+ * On every frame, the listener is called and receivers can aggregate, store, and upload
+ * the data as appropriate.
+ */
+ fun interface OnFrameListener {
+
+ /**
+ * The implementation of this method will be called on every frame.
+ *
+ * Note that this method will be called synchronously on whatever thread
+ * JankStats receives frame data on, including possibly the UI thread.
+ * Therefore, apps should minimize processing during this callback and offload
+ * work to a different thread or later time to return as quickly as possible.
+ *
+ * @param frameData The data for the frame which just occurred. This data should be
+ * copied elsewhere if it will be used after the call returns, as the data structure
+ * is mutable and may be recycled with future frame data.
+ */
+ fun onJankStatsFrame(
+ frameData: FrameData
+ )
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt
new file mode 100644
index 0000000..e79f05d
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi16Impl.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.os.Message
+import android.view.Choreographer
+import android.view.View
+import android.view.ViewTreeObserver
+import androidx.annotation.RequiresApi
+import java.lang.ref.WeakReference
+
+/**
+ * Subclass of JankStatsBaseImpl records frame timing data for API 16 and later,
+ * using Choreographer (which was introduced in API 16).
+ */
+@RequiresApi(16)
+internal open class JankStatsApi16Impl(
+ jankStats: JankStats,
+ view: View
+) :
+ JankStatsBaseImpl(jankStats) {
+
+ // TODO: decorView may change in Window, think about how to handle that
+ // e.g., should we cache Window instead?
+ internal val decorViewRef = WeakReference(view)
+
+ lateinit var viewTreeObserver: ViewTreeObserver
+
+ // Must cache this at init time, from view, since some subclasses will not receive callbacks
+ // on the UI thread, so they will not have access to the appropriate Choreographer for
+ // frame timing values
+ val choreographer = Choreographer.getInstance()
+
+ private val onPreDrawListener: ViewTreeObserver.OnPreDrawListener =
+ object : ViewTreeObserver.OnPreDrawListener {
+
+ @SuppressLint("ClassVerificationFailure")
+ override fun onPreDraw(): Boolean {
+ val decorView = decorViewRef.get()
+ decorView?.let {
+ decorView.handler.sendMessageAtFrontOfQueue(
+ Message.obtain(decorView.handler) {
+ val now = System.nanoTime()
+ val frameStart = getFrameStartTime()
+ val expectedDuration = getExpectedFrameDuration(decorView) *
+ JankStats.jankHeuristicMultiplier
+ jankStats.logFrameData(
+ frameStart,
+ now - frameStart,
+ expectedDuration.toLong()
+ )
+ }.apply {
+ setMessageAsynchronicity(this)
+ }
+ )
+ }
+ return true
+ }
+ }
+
+ // Noop prior to API 22
+ internal open fun setMessageAsynchronicity(message: Message) {}
+
+ override fun setupFrameTimer(enable: Boolean) {
+ val decorView = decorViewRef.get()
+ decorView?.let {
+ if (enable) {
+ viewTreeObserver = it.viewTreeObserver
+ viewTreeObserver.addOnPreDrawListener(onPreDrawListener)
+ } else {
+ // TODO: make sure we actually init it first
+ viewTreeObserver.removeOnPreDrawListener(onPreDrawListener)
+ }
+ }
+ }
+
+ internal open fun getFrameStartTime(): Long {
+ return choreographerLastFrameTimeField.get(choreographer) as Long
+ }
+
+ @Suppress("deprecation") /* defaultDisplay */
+ fun getExpectedFrameDuration(view: View?): Long {
+ if (frameDuration < 0) {
+ var refreshRate = 60f
+ val window = if (view?.context is Activity) (view.context as Activity).window else null
+ if (window != null) {
+ val display = window.windowManager.defaultDisplay
+ refreshRate = display.refreshRate
+ }
+ if (refreshRate < 30f || refreshRate > 200f) {
+ // Account for faulty return values (including 0)
+ refreshRate = 60f
+ }
+ frameDuration = (1000 / refreshRate * NANOS_PER_MS).toLong()
+ }
+ return frameDuration
+ }
+
+ companion object {
+ val choreographerLastFrameTimeField =
+ Choreographer::class.java.getDeclaredField("mLastFrameTimeNanos")
+
+ init {
+ choreographerLastFrameTimeField.isAccessible = true
+ }
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt
new file mode 100644
index 0000000..cb40c46
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi22Impl.kt
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+import android.os.Message
+import android.view.View
+import androidx.annotation.RequiresApi
+
+/**
+ * This impl class exists only to provide extra asynchronous Message behavior available on API 22.
+ */
+@RequiresApi(22)
+internal open class JankStatsApi22Impl(
+ jankStats: JankStats,
+ view: View
+) : JankStatsApi16Impl(jankStats, view) {
+
+ override fun setMessageAsynchronicity(message: Message) {
+ message.isAsynchronous = true
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt
new file mode 100644
index 0000000..7dce1b4
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi24Impl.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+import android.app.Activity
+import android.os.Handler
+import android.os.HandlerThread
+import android.view.FrameMetrics
+import android.view.View
+import android.view.Window
+import androidx.annotation.RequiresApi
+
+/**
+ * Subclass of JankStatsBaseImpl records frame timing data for API 24 and later,
+ * using FrameMetrics (which was introduced in API 24). Jank data is collected by
+ * setting a [Window.addOnFrameMetricsAvailableListener]
+ * on the Window associated with the Activity being tracked.
+ */
+@RequiresApi(24)
+internal open class JankStatsApi24Impl(
+ jankStats: JankStats,
+ view: View
+) : JankStatsApi22Impl(jankStats, view) {
+
+ var frameMetricsHandler: Handler? = null
+
+ private val frameMetricsAvailableListener: Window.OnFrameMetricsAvailableListener =
+ Window.OnFrameMetricsAvailableListener { _, frameMetrics, _ ->
+ val startTime = getFrameStartTime(frameMetrics)
+ // ignore historical data gathered before we started listening
+ if (startTime >= listenerAddedTime) {
+ val expectedDuration = getExpectedFrameDuration(frameMetrics) *
+ JankStats.jankHeuristicMultiplier
+ jankStats.logFrameData(
+ startTime,
+ getFrameDuration(frameMetrics),
+ expectedDuration.toLong()
+ )
+ }
+ }
+
+ internal open fun getFrameDuration(frameMetrics: FrameMetrics): Long {
+ return frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION)
+ }
+
+ internal open fun getFrameStartTime(frameMetrics: FrameMetrics): Long {
+ return getFrameStartTime()
+ }
+
+ open fun getExpectedFrameDuration(metrics: FrameMetrics): Long {
+ return getExpectedFrameDuration(decorViewRef.get())
+ }
+
+ var listenerAddedTime: Long = 0
+
+ override fun setupFrameTimer(enable: Boolean) {
+ val view = decorViewRef.get()
+ val window = if (view?.context is Activity) (view.context as Activity).window else null
+ window?.let {
+ if (enable) {
+ if (frameMetricsHandler == null) {
+ val thread = HandlerThread("FrameMetricsAggregator")
+ thread.start()
+ frameMetricsHandler = Handler(thread.looper)
+ }
+ window.addOnFrameMetricsAvailableListener(
+ frameMetricsAvailableListener,
+ frameMetricsHandler
+ )
+ listenerAddedTime = System.nanoTime()
+ } else {
+ window.removeOnFrameMetricsAvailableListener(frameMetricsAvailableListener)
+ listenerAddedTime = 0
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi26Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi26Impl.kt
new file mode 100644
index 0000000..b769f19
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi26Impl.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+import android.view.FrameMetrics
+import android.view.View
+import androidx.annotation.RequiresApi
+
+@RequiresApi(26)
+internal open class JankStatsApi26Impl(
+ jankStats: JankStats,
+ view: View
+) : JankStatsApi24Impl(jankStats, view) {
+
+ override fun getFrameDuration(frameMetrics: FrameMetrics): Long {
+ // TOTAL_DURATION is measured from intended start of frame, but
+ // JankStats uses VSYNC_TIMESTAMP as start of frame, so subtract
+ // that difference to use consistent metrics
+ val total = frameMetrics.getMetric(FrameMetrics.TOTAL_DURATION)
+ val intended = frameMetrics.getMetric(FrameMetrics.INTENDED_VSYNC_TIMESTAMP)
+ val vsync = frameMetrics.getMetric(FrameMetrics.VSYNC_TIMESTAMP)
+ return total - (vsync - intended)
+ }
+ override fun getFrameStartTime(frameMetrics: FrameMetrics): Long {
+ return frameMetrics.getMetric(FrameMetrics.VSYNC_TIMESTAMP)
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi31Impl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi31Impl.kt
new file mode 100644
index 0000000..66f2c39
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsApi31Impl.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+import android.view.FrameMetrics
+import android.view.View
+import androidx.annotation.RequiresApi
+
+@RequiresApi(31)
+internal class JankStatsApi31Impl(
+ jankStats: JankStats,
+ view: View
+) : JankStatsApi26Impl(jankStats, view) {
+
+ override fun getExpectedFrameDuration(metrics: FrameMetrics): Long {
+ return metrics.getMetric(FrameMetrics.DEADLINE)
+ }
+}
\ No newline at end of file
diff --git a/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsBaseImpl.kt b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsBaseImpl.kt
new file mode 100644
index 0000000..7ef56fb
--- /dev/null
+++ b/metrics/metrics-performance/src/main/java/androidx/metrics/performance/JankStatsBaseImpl.kt
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.metrics.performance
+
+/**
+ * This class holds the core logic for logging and reporting JankStats data, along
+ * with an implementation of frame timing based on capabilities of the platform prior
+ * to API level 24 (when FrameMetrics was introduced).
+ */
+internal open class JankStatsBaseImpl(
+ val jankStats: JankStats
+) {
+
+ open fun setupFrameTimer(enable: Boolean) { }
+
+ companion object {
+ const val NANOS_PER_MS = 1_000_000
+
+ var frameDuration: Long = -1
+ }
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml b/metrics/metrics-performance/src/main/res/values/ids.xml
similarity index 77%
copy from glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
copy to metrics/metrics-performance/src/main/res/values/ids.xml
index b627d38..7b0a56d 100644
--- a/glance/glance-appwidget/src/androidMain/res/layout/text_layout.xml
+++ b/metrics/metrics-performance/src/main/res/values/ids.xml
@@ -14,7 +14,6 @@
limitations under the License.
-->
-<TextView xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@id/glanceView"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content" />
+<resources>
+ <item type="id" name="jankstats"/>
+</resources>
\ No newline at end of file
diff --git a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
index d3d15c1..5f4d540 100644
--- a/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
+++ b/navigation/navigation-common/src/androidTest/java/androidx/navigation/NavDestinationAndroidTest.kt
@@ -112,6 +112,44 @@
}
@Test
+ fun matchDeepLinkWithQueryParams() {
+ val destination = NoOpNavigator().createDestination()
+ destination.addArgument("id", intArgument())
+ destination.addDeepLink("www.example.com/users?id={id}")
+
+ val match = destination.matchDeepLink(
+ Uri.parse("https://www.example.com/users?id=43")
+ )
+
+ assertWithMessage("Deep link should match")
+ .that(match)
+ .isNotNull()
+
+ assertWithMessage("Deep link should extract id argument correctly")
+ .that(match?.matchingArgs?.getInt("id"))
+ .isEqualTo(43)
+ }
+
+ @Test
+ fun matchDeepLinkWithNonMatchingQueryParams() {
+ val destination = NoOpNavigator().createDestination()
+ destination.addArgument("id", intArgument())
+ destination.addDeepLink("www.example.com/users?userId={id}")
+
+ val match = destination.matchDeepLink(
+ Uri.parse("https://www.example.com/users?userId=43")
+ )
+
+ assertWithMessage("Deep link should match")
+ .that(match)
+ .isNotNull()
+
+ assertWithMessage("Deep link should extract id argument correctly")
+ .that(match?.matchingArgs?.getInt("id"))
+ .isEqualTo(43)
+ }
+
+ @Test
fun matchDeepLinkBestMatchExact() {
val destination = NoOpNavigator().createDestination()
diff --git a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
index b3d6aa3..6c3f037 100644
--- a/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
+++ b/navigation/navigation-common/src/main/java/androidx/navigation/NavDeepLink.kt
@@ -56,7 +56,7 @@
/** Arguments present in the deep link, including both path and query arguments. */
internal val argumentsNames: List<String>
- get() = arguments + paramArgMap.keys
+ get() = arguments + paramArgMap.values.flatMap { it.arguments }
public var isExactDeepLink: Boolean = false
/** @suppress */
@@ -234,7 +234,7 @@
*/
private class ParamQuery {
var paramRegex: String? = null
- private val arguments = mutableListOf<String>()
+ val arguments = mutableListOf<String>()
fun addArgumentName(name: String) {
arguments.add(name)
diff --git a/navigation/navigation-compose/build.gradle b/navigation/navigation-compose/build.gradle
index 49d9ec6..1ba3140 100644
--- a/navigation/navigation-compose/build.gradle
+++ b/navigation/navigation-compose/build.gradle
@@ -35,7 +35,7 @@
api("androidx.compose.runtime:runtime:1.0.1")
api("androidx.compose.runtime:runtime-saveable:1.0.1")
api("androidx.compose.ui:ui:1.0.1")
- api(projectOrArtifact(":lifecycle:lifecycle-viewmodel-compose"))
+ api("androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-rc01")
api(projectOrArtifact(":navigation:navigation-runtime-ktx"))
androidTestImplementation(projectOrArtifact(":compose:material:material"))
@@ -51,6 +51,8 @@
lintChecks(projectOrArtifact(":navigation:navigation-compose-lint"))
lintPublish(projectOrArtifact(":navigation:navigation-compose-lint"))
+
+ samples(projectOrArtifact(":navigation:navigation-compose:navigation-compose-samples"))
}
androidx {
diff --git a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
index 34d763a..346b545 100644
--- a/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
+++ b/navigation/navigation-compose/samples/src/main/java/androidx/navigation/compose/samples/NavigationSamples.kt
@@ -48,9 +48,9 @@
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.dialog
+import androidx.navigation.compose.navigation
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
-import androidx.navigation.navigation
import kotlinx.parcelize.Parcelize
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
@@ -128,6 +128,31 @@
}
}
+@Sampled
+@Composable
+fun NestedNavInGraphWithArgs() {
+ val navController = rememberNavController()
+ NavHost(navController, startDestination = Screen.Profile.route) {
+ composable(Screen.Profile.route) { Profile(navController) }
+ navigation(
+ startDestination = "nested",
+ route = Screen.Dashboard.route,
+ // This value will be sent to the start destination of the graph when you navigate to
+ // this graph
+ arguments = listOf(navArgument("userId") { defaultValue = "no value given" })
+ ) {
+ composable(
+ "nested",
+ // We don't need to set a default value here because the start destination will
+ // automatically receive the arguments of its parent graph
+ arguments = listOf(navArgument("userId") { })
+ ) {
+ Dashboard(navController)
+ }
+ }
+ }
+}
+
@Composable
fun Profile(navController: NavHostController) {
Column(Modifier.fillMaxSize().then(Modifier.padding(8.dp))) {
diff --git a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
index df76125..4674b26 100644
--- a/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
+++ b/navigation/navigation-compose/src/main/java/androidx/navigation/compose/NavGraphBuilder.kt
@@ -54,6 +54,8 @@
/**
* Construct a nested [NavGraph]
*
+ * @sample androidx.navigation.compose.samples.NestedNavInGraphWithArgs
+ *
* @param startDestination the starting destination's route for this NavGraph
* @param route the destination's unique route
* @param arguments list of arguments to associate with destination
diff --git a/navigation/navigation-dynamic-features-fragment/build.gradle b/navigation/navigation-dynamic-features-fragment/build.gradle
index 5448fa7..a7a7afa 100644
--- a/navigation/navigation-dynamic-features-fragment/build.gradle
+++ b/navigation/navigation-dynamic-features-fragment/build.gradle
@@ -16,6 +16,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -69,3 +70,15 @@
inceptionYear = "2019"
description = "Android Dynamic Feature Navigation Fragment"
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
index 39bc126..8162236 100644
--- a/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
+++ b/navigation/navigation-fragment/src/androidTest/java/androidx/navigation/fragment/DialogFragmentNavigatorTest.kt
@@ -44,6 +44,7 @@
companion object {
private const val INITIAL_FRAGMENT = 1
+ private const val SECOND_FRAGMENT = 2
}
@Suppress("DEPRECATION")
@@ -139,6 +140,97 @@
assertWithMessage("Pop should dismiss the DialogFragment")
.that(dialogFragment.requireDialog().isShowing)
.isFalse()
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Dismiss should remove the dialog")
+ .that(dialogFragment.dialog)
+ .isNull()
+ assertWithMessage("Dismissed DialogFragment should be removed from the FragmentManager")
+ .that(fragmentManager.fragments)
+ .doesNotContain(dialogFragment)
+ }
+
+ @UiThreadTest
+ @Test
+ fun testDismiss() {
+ lateinit var dialogFragment: DialogFragment
+ fragmentManager.fragmentFactory = object : FragmentFactory() {
+ override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
+ return super.instantiate(classLoader, className).also { fragment ->
+ if (fragment is DialogFragment) {
+ dialogFragment = fragment
+ }
+ }
+ }
+ }
+ val entry = createBackStackEntry()
+
+ dialogNavigator.navigate(listOf(entry), null, null)
+ assertThat(navigatorState.backStack.value)
+ .containsExactly(entry)
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Dialog should be shown")
+ .that(dialogFragment.requireDialog().isShowing)
+ .isTrue()
+
+ dialogFragment.dismiss()
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Dismiss should remove the dialog from the back stack")
+ .that(navigatorState.backStack.value)
+ .isEmpty()
+ assertWithMessage("Dismiss should remove the dialog")
+ .that(dialogFragment.dialog)
+ .isNull()
+ assertWithMessage("Dismissed DialogFragment should be removed from the FragmentManager")
+ .that(fragmentManager.fragments)
+ .doesNotContain(dialogFragment)
+ }
+
+ @UiThreadTest
+ @Test
+ fun testDismissAndNavigate() {
+ val dialogFragments = mutableListOf<DialogFragment>()
+ fragmentManager.fragmentFactory = object : FragmentFactory() {
+ override fun instantiate(classLoader: ClassLoader, className: String): Fragment {
+ return super.instantiate(classLoader, className).also { fragment ->
+ if (fragment is DialogFragment) {
+ dialogFragments += fragment
+ }
+ }
+ }
+ }
+ val entry = createBackStackEntry()
+
+ dialogNavigator.navigate(listOf(entry), null, null)
+ assertThat(navigatorState.backStack.value)
+ .containsExactly(entry)
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Dialog should be shown")
+ .that(dialogFragments[0].requireDialog().isShowing)
+ .isTrue()
+
+ val secondEntry = createBackStackEntry(SECOND_FRAGMENT)
+
+ // Call dismiss and, before executing pending transactions, call navigate()
+ dialogFragments[0].dismiss()
+ dialogNavigator.navigate(listOf(secondEntry), null, null)
+ assertThat(navigatorState.backStack.value)
+ .containsExactly(entry, secondEntry).inOrder()
+ fragmentManager.executePendingTransactions()
+ assertWithMessage("Dismiss should remove the dialogs from the back stack")
+ .that(navigatorState.backStack.value)
+ .isEmpty()
+ assertWithMessage("Dismiss should remove the dialog")
+ .that(dialogFragments[0].dialog)
+ .isNull()
+ assertWithMessage("Dismissed DialogFragment should be removed from the FragmentManager")
+ .that(fragmentManager.fragments)
+ .doesNotContain(dialogFragments[0])
+ assertWithMessage("Dismiss should remove the second dialog")
+ .that(dialogFragments[1].dialog)
+ .isNull()
+ assertWithMessage("Second DialogFragment should be removed from the FragmentManager")
+ .that(fragmentManager.fragments)
+ .doesNotContain(dialogFragments[1])
}
private fun createBackStackEntry(
diff --git a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
index 4d07a84..286089b 100644
--- a/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
+++ b/navigation/navigation-fragment/src/main/java/androidx/navigation/fragment/DialogFragmentNavigator.kt
@@ -48,9 +48,20 @@
if (event == Lifecycle.Event.ON_STOP) {
val dialogFragment = source as DialogFragment
if (!dialogFragment.requireDialog().isShowing) {
- // Update the NavigatorState to indicate that the Dialog was popped
- val entry = state.backStack.value.first { it.id == dialogFragment.tag }
- state.pop(entry, false)
+ val beforePopList = state.backStack.value
+ val poppedEntry = checkNotNull(beforePopList.lastOrNull {
+ it.id == dialogFragment.tag
+ }) {
+ "Dialog $dialogFragment has already been popped off of the Navigation " +
+ "back stack"
+ }
+ if (beforePopList.lastOrNull() != poppedEntry) {
+ Log.i(
+ TAG, "Dialog $dialogFragment was dismissed while it was not the top " +
+ "of the back stack, popping all dialogs above this dismissed dialog"
+ )
+ }
+ popBackStack(poppedEntry, false)
}
}
}
diff --git a/navigation/navigation-runtime/build.gradle b/navigation/navigation-runtime/build.gradle
index 0b51398..5b4ed93 100644
--- a/navigation/navigation-runtime/build.gradle
+++ b/navigation/navigation-runtime/build.gradle
@@ -16,6 +16,7 @@
import androidx.build.LibraryGroups
import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins {
id("AndroidXPlugin")
@@ -60,3 +61,15 @@
inceptionYear = "2017"
description = "Android Navigation-Runtime"
}
+
+// needed only while https://youtrack.jetbrains.com/issue/KT-47000 isn't resolved which is
+// targeted to 1.6
+if (project.hasProperty("androidx.useMaxDepVersions")){
+ tasks.withType(KotlinCompile).configureEach {
+ kotlinOptions {
+ freeCompilerArgs += [
+ "-Xjvm-default=enable",
+ ]
+ }
+ }
+}
\ No newline at end of file
diff --git a/paging/paging-common-ktx/api/3.1.0-beta01.txt b/paging/paging-common-ktx/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-common-ktx/api/3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-common-ktx/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-common-ktx/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-common-ktx/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-common-ktx/api/restricted_3.1.0-beta01.txt b/paging/paging-common-ktx/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-common-ktx/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-common/api/3.1.0-beta01.txt b/paging/paging-common/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..cb81fc4
--- /dev/null
+++ b/paging/paging-common/api/3.1.0-beta01.txt
@@ -0,0 +1,470 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ public final class CachedPagingDataKt {
+ method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ }
+
+ public final class CancelableChannelFlowKt {
+ }
+
+ public final class CombinedLoadStates {
+ ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
+ method public androidx.paging.LoadState getAppend();
+ method public androidx.paging.LoadStates? getMediator();
+ method public androidx.paging.LoadState getPrepend();
+ method public androidx.paging.LoadState getRefresh();
+ method public androidx.paging.LoadStates getSource();
+ property public final androidx.paging.LoadState append;
+ property public final androidx.paging.LoadStates? mediator;
+ property public final androidx.paging.LoadState prepend;
+ property public final androidx.paging.LoadState refresh;
+ property public final androidx.paging.LoadStates source;
+ }
+
+ public abstract class DataSource<Key, Value> {
+ method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+ method @AnyThread public void invalidate();
+ method @WorkerThread public boolean isInvalid();
+ method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+ property @WorkerThread public boolean isInvalid;
+ }
+
+ public abstract static class DataSource.Factory<Key, Value> {
+ ctor public DataSource.Factory();
+ method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
+ method public abstract androidx.paging.DataSource<Key,Value> create();
+ method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ }
+
+ public static fun interface DataSource.InvalidatedCallback {
+ method @AnyThread public void onInvalidated();
+ }
+
+ public final class FlowExtKt {
+ }
+
+ public final class HintHandlerKt {
+ }
+
+ public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
+ ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ method public void invalidate();
+ method public androidx.paging.PagingSource<Key,Value> invoke();
+ }
+
+ @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+ ctor @Deprecated public ItemKeyedDataSource();
+ method @Deprecated public abstract Key getKey(Value item);
+ method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+ method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+ method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+ }
+
+ @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
+ }
+
+ @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
+ }
+
+ @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final Key? requestedInitialKey;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+ field @Deprecated public final Key key;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ public final class ItemSnapshotList<T> extends kotlin.collections.AbstractList<T> {
+ ctor public ItemSnapshotList(@IntRange(from=0) int placeholdersBefore, @IntRange(from=0) int placeholdersAfter, java.util.List<? extends T> items);
+ method public T? get(int index);
+ method public java.util.List<T> getItems();
+ method public int getPlaceholdersAfter();
+ method public int getPlaceholdersBefore();
+ method public int getSize();
+ property public final java.util.List<T> items;
+ property public final int placeholdersAfter;
+ property public final int placeholdersBefore;
+ property public int size;
+ }
+
+ public abstract sealed class LoadState {
+ method public final boolean getEndOfPaginationReached();
+ property public final boolean endOfPaginationReached;
+ }
+
+ public static final class LoadState.Error extends androidx.paging.LoadState {
+ ctor public LoadState.Error(Throwable error);
+ method public Throwable getError();
+ property public final Throwable error;
+ }
+
+ public static final class LoadState.Loading extends androidx.paging.LoadState {
+ field public static final androidx.paging.LoadState.Loading INSTANCE;
+ }
+
+ public static final class LoadState.NotLoading extends androidx.paging.LoadState {
+ ctor public LoadState.NotLoading(boolean endOfPaginationReached);
+ }
+
+ public final class LoadStates {
+ ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+ method public androidx.paging.LoadState component1();
+ method public androidx.paging.LoadState component2();
+ method public androidx.paging.LoadState component3();
+ method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+ method public androidx.paging.LoadState getAppend();
+ method public androidx.paging.LoadState getPrepend();
+ method public androidx.paging.LoadState getRefresh();
+ property public final androidx.paging.LoadState append;
+ property public final androidx.paging.LoadState prepend;
+ property public final androidx.paging.LoadState refresh;
+ }
+
+ public enum LoadType {
+ enum_constant public static final androidx.paging.LoadType APPEND;
+ enum_constant public static final androidx.paging.LoadType PREPEND;
+ enum_constant public static final androidx.paging.LoadType REFRESH;
+ }
+
+ public final class PageFetcherSnapshotKt {
+ }
+
+ @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+ ctor @Deprecated public PageKeyedDataSource();
+ method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+ method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+ method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+ }
+
+ @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
+ ctor @Deprecated public PageKeyedDataSource.LoadCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
+ }
+
+ @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
+ ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
+ }
+
+ @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
+ ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
+ ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+ field @Deprecated public final Key key;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
+ method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public abstract void detach();
+ method @Deprecated public T? get(int index);
+ method @Deprecated public final androidx.paging.PagedList.Config getConfig();
+ method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
+ method @Deprecated public abstract Object? getLastKey();
+ method @Deprecated public final int getLoadedCount();
+ method @Deprecated public final int getPositionOffset();
+ method @Deprecated public int getSize();
+ method @Deprecated public abstract boolean isDetached();
+ method @Deprecated public boolean isImmutable();
+ method @Deprecated public final void loadAround(int index);
+ method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void retry();
+ method @Deprecated public final java.util.List<T> snapshot();
+ property public final androidx.paging.PagedList.Config config;
+ property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
+ property public abstract boolean isDetached;
+ property public boolean isImmutable;
+ property public abstract Object? lastKey;
+ property public final int loadedCount;
+ property public final int positionOffset;
+ property public int size;
+ }
+
+ @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
+ ctor @Deprecated public PagedList.BoundaryCallback();
+ method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
+ method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
+ method @Deprecated public void onZeroItemsLoaded();
+ }
+
+ @Deprecated public static final class PagedList.Builder<Key, Value> {
+ ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
+ method @Deprecated public androidx.paging.PagedList<Value> build();
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
+ }
+
+ @Deprecated public abstract static class PagedList.Callback {
+ ctor @Deprecated public PagedList.Callback();
+ method @Deprecated public abstract void onChanged(int position, int count);
+ method @Deprecated public abstract void onInserted(int position, int count);
+ method @Deprecated public abstract void onRemoved(int position, int count);
+ }
+
+ @Deprecated public static final class PagedList.Config {
+ field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+ field @Deprecated public final boolean enablePlaceholders;
+ field @Deprecated public final int initialLoadSizeHint;
+ field @Deprecated public final int maxSize;
+ field @Deprecated public final int pageSize;
+ field @Deprecated public final int prefetchDistance;
+ }
+
+ @Deprecated public static final class PagedList.Config.Builder {
+ ctor @Deprecated public PagedList.Config.Builder();
+ method @Deprecated public androidx.paging.PagedList.Config build();
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
+ }
+
+ public final class PagedListConfigKt {
+ }
+
+ public final class PagedListKt {
+ }
+
+ public final class Pager<Key, Value> {
+ ctor public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
+ }
+
+ public final class PagingConfig {
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize, optional int jumpThreshold);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance);
+ ctor public PagingConfig(int pageSize);
+ field public static final androidx.paging.PagingConfig.Companion Companion;
+ field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+ field public final boolean enablePlaceholders;
+ field public final int initialLoadSize;
+ field public final int jumpThreshold;
+ field public final int maxSize;
+ field public final int pageSize;
+ field public final int prefetchDistance;
+ }
+
+ public static final class PagingConfig.Companion {
+ }
+
+ public final class PagingData<T> {
+ method public static <T> androidx.paging.PagingData<T> empty();
+ method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
+ field public static final androidx.paging.PagingData.Companion Companion;
+ }
+
+ public static final class PagingData.Companion {
+ method public <T> androidx.paging.PagingData<T> empty();
+ method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
+ }
+
+ public final class PagingDataTransforms {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
+ method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+ method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+ }
+
+ public abstract class PagingSource<Key, Value> {
+ ctor public PagingSource();
+ method public final boolean getInvalid();
+ method public boolean getJumpingSupported();
+ method public boolean getKeyReuseSupported();
+ method public abstract Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
+ method public final void invalidate();
+ method public abstract suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+ method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+ property public final boolean invalid;
+ property public boolean jumpingSupported;
+ property public boolean keyReuseSupported;
+ }
+
+ public abstract static sealed class PagingSource.LoadParams<Key> {
+ method public abstract Key? getKey();
+ method public final int getLoadSize();
+ method public final boolean getPlaceholdersEnabled();
+ property public abstract Key? key;
+ property public final int loadSize;
+ property public final boolean placeholdersEnabled;
+ }
+
+ public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
+ method public Key getKey();
+ property public Key key;
+ }
+
+ public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
+ method public Key getKey();
+ property public Key key;
+ }
+
+ public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
+ method public Key? getKey();
+ property public Key? key;
+ }
+
+ public abstract static sealed class PagingSource.LoadResult<Key, Value> {
+ }
+
+ public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Error(Throwable throwable);
+ method public Throwable component1();
+ method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
+ method public Throwable getThrowable();
+ property public final Throwable throwable;
+ }
+
+ public static final class PagingSource.LoadResult.Invalid<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Invalid();
+ }
+
+ public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsBefore, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsAfter);
+ ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
+ method public java.util.List<Value> component1();
+ method public Key? component2();
+ method public Key? component3();
+ method public int component4();
+ method public int component5();
+ method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=-2147483648L) int itemsBefore, @IntRange(from=-2147483648L) int itemsAfter);
+ method public java.util.List<Value> getData();
+ method public int getItemsAfter();
+ method public int getItemsBefore();
+ method public Key? getNextKey();
+ method public Key? getPrevKey();
+ property public final java.util.List<Value> data;
+ property public final int itemsAfter;
+ property public final int itemsBefore;
+ property public final Key? nextKey;
+ property public final Key? prevKey;
+ field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
+ field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
+ }
+
+ public static final class PagingSource.LoadResult.Page.Companion {
+ }
+
+ public final class PagingSourceKt {
+ }
+
+ public final class PagingState<Key, Value> {
+ ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0) int leadingPlaceholderCount);
+ method public Value? closestItemToPosition(int anchorPosition);
+ method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
+ method public Value? firstItemOrNull();
+ method public Integer? getAnchorPosition();
+ method public androidx.paging.PagingConfig getConfig();
+ method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
+ method public boolean isEmpty();
+ method public Value? lastItemOrNull();
+ property public final Integer? anchorPosition;
+ property public final androidx.paging.PagingConfig config;
+ property public final java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages;
+ }
+
+ @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
+ ctor @Deprecated public PositionalDataSource();
+ method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
+ method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
+ method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
+ method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
+ }
+
+ @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
+ ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
+ }
+
+ @Deprecated public static class PositionalDataSource.LoadInitialParams {
+ ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
+ field @Deprecated public final int pageSize;
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final int requestedLoadSize;
+ field @Deprecated public final int requestedStartPosition;
+ }
+
+ @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
+ ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
+ }
+
+ @Deprecated public static class PositionalDataSource.LoadRangeParams {
+ ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
+ field @Deprecated public final int loadSize;
+ field @Deprecated public final int startPosition;
+ }
+
+ public final class RemoteMediatorAccessorKt {
+ }
+
+ public final class SeparatorsKt {
+ }
+
+ public final class SimpleChannelFlowKt {
+ }
+
+ public enum TerminalSeparatorType {
+ enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
+ enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
+ }
+
+}
+
diff --git a/paging/paging-common/api/current.txt b/paging/paging-common/api/current.txt
index e006221..cb81fc4 100644
--- a/paging/paging-common/api/current.txt
+++ b/paging/paging-common/api/current.txt
@@ -48,6 +48,9 @@
public final class FlowExtKt {
}
+ public final class HintHandlerKt {
+ }
+
public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
method public void invalidate();
diff --git a/paging/paging-common/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-common/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..059daf7
--- /dev/null
+++ b/paging/paging-common/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1,500 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ public final class CachedPagingDataKt {
+ method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ }
+
+ public final class CancelableChannelFlowKt {
+ }
+
+ public final class CombinedLoadStates {
+ ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
+ method public androidx.paging.LoadState getAppend();
+ method public androidx.paging.LoadStates? getMediator();
+ method public androidx.paging.LoadState getPrepend();
+ method public androidx.paging.LoadState getRefresh();
+ method public androidx.paging.LoadStates getSource();
+ property public final androidx.paging.LoadState append;
+ property public final androidx.paging.LoadStates? mediator;
+ property public final androidx.paging.LoadState prepend;
+ property public final androidx.paging.LoadState refresh;
+ property public final androidx.paging.LoadStates source;
+ }
+
+ public abstract class DataSource<Key, Value> {
+ method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+ method @AnyThread public void invalidate();
+ method @WorkerThread public boolean isInvalid();
+ method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+ property @WorkerThread public boolean isInvalid;
+ }
+
+ public abstract static class DataSource.Factory<Key, Value> {
+ ctor public DataSource.Factory();
+ method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
+ method public abstract androidx.paging.DataSource<Key,Value> create();
+ method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ }
+
+ public static fun interface DataSource.InvalidatedCallback {
+ method @AnyThread public void onInvalidated();
+ }
+
+ @kotlin.RequiresOptIn public @interface ExperimentalPagingApi {
+ }
+
+ public final class FlowExtKt {
+ }
+
+ public final class HintHandlerKt {
+ }
+
+ public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
+ ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ method public void invalidate();
+ method public androidx.paging.PagingSource<Key,Value> invoke();
+ }
+
+ @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+ ctor @Deprecated public ItemKeyedDataSource();
+ method @Deprecated public abstract Key getKey(Value item);
+ method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+ method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+ method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+ }
+
+ @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
+ }
+
+ @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
+ }
+
+ @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final Key? requestedInitialKey;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+ field @Deprecated public final Key key;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ public final class ItemSnapshotList<T> extends kotlin.collections.AbstractList<T> {
+ ctor public ItemSnapshotList(@IntRange(from=0) int placeholdersBefore, @IntRange(from=0) int placeholdersAfter, java.util.List<? extends T> items);
+ method public T? get(int index);
+ method public java.util.List<T> getItems();
+ method public int getPlaceholdersAfter();
+ method public int getPlaceholdersBefore();
+ method public int getSize();
+ property public final java.util.List<T> items;
+ property public final int placeholdersAfter;
+ property public final int placeholdersBefore;
+ property public int size;
+ }
+
+ public abstract sealed class LoadState {
+ method public final boolean getEndOfPaginationReached();
+ property public final boolean endOfPaginationReached;
+ }
+
+ public static final class LoadState.Error extends androidx.paging.LoadState {
+ ctor public LoadState.Error(Throwable error);
+ method public Throwable getError();
+ property public final Throwable error;
+ }
+
+ public static final class LoadState.Loading extends androidx.paging.LoadState {
+ field public static final androidx.paging.LoadState.Loading INSTANCE;
+ }
+
+ public static final class LoadState.NotLoading extends androidx.paging.LoadState {
+ ctor public LoadState.NotLoading(boolean endOfPaginationReached);
+ }
+
+ public final class LoadStates {
+ ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+ method public androidx.paging.LoadState component1();
+ method public androidx.paging.LoadState component2();
+ method public androidx.paging.LoadState component3();
+ method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+ method public androidx.paging.LoadState getAppend();
+ method public androidx.paging.LoadState getPrepend();
+ method public androidx.paging.LoadState getRefresh();
+ property public final androidx.paging.LoadState append;
+ property public final androidx.paging.LoadState prepend;
+ property public final androidx.paging.LoadState refresh;
+ }
+
+ public enum LoadType {
+ enum_constant public static final androidx.paging.LoadType APPEND;
+ enum_constant public static final androidx.paging.LoadType PREPEND;
+ enum_constant public static final androidx.paging.LoadType REFRESH;
+ }
+
+ public final class PageFetcherSnapshotKt {
+ }
+
+ @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+ ctor @Deprecated public PageKeyedDataSource();
+ method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+ method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+ method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+ }
+
+ @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
+ ctor @Deprecated public PageKeyedDataSource.LoadCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
+ }
+
+ @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
+ ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
+ }
+
+ @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
+ ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
+ ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+ field @Deprecated public final Key key;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
+ method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public abstract void detach();
+ method @Deprecated public T? get(int index);
+ method @Deprecated public final androidx.paging.PagedList.Config getConfig();
+ method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
+ method @Deprecated public abstract Object? getLastKey();
+ method @Deprecated public final int getLoadedCount();
+ method @Deprecated public final int getPositionOffset();
+ method @Deprecated public int getSize();
+ method @Deprecated public abstract boolean isDetached();
+ method @Deprecated public boolean isImmutable();
+ method @Deprecated public final void loadAround(int index);
+ method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void retry();
+ method @Deprecated public final java.util.List<T> snapshot();
+ property public final androidx.paging.PagedList.Config config;
+ property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
+ property public abstract boolean isDetached;
+ property public boolean isImmutable;
+ property public abstract Object? lastKey;
+ property public final int loadedCount;
+ property public final int positionOffset;
+ property public int size;
+ }
+
+ @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
+ ctor @Deprecated public PagedList.BoundaryCallback();
+ method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
+ method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
+ method @Deprecated public void onZeroItemsLoaded();
+ }
+
+ @Deprecated public static final class PagedList.Builder<Key, Value> {
+ ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
+ method @Deprecated public androidx.paging.PagedList<Value> build();
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
+ }
+
+ @Deprecated public abstract static class PagedList.Callback {
+ ctor @Deprecated public PagedList.Callback();
+ method @Deprecated public abstract void onChanged(int position, int count);
+ method @Deprecated public abstract void onInserted(int position, int count);
+ method @Deprecated public abstract void onRemoved(int position, int count);
+ }
+
+ @Deprecated public static final class PagedList.Config {
+ field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+ field @Deprecated public final boolean enablePlaceholders;
+ field @Deprecated public final int initialLoadSizeHint;
+ field @Deprecated public final int maxSize;
+ field @Deprecated public final int pageSize;
+ field @Deprecated public final int prefetchDistance;
+ }
+
+ @Deprecated public static final class PagedList.Config.Builder {
+ ctor @Deprecated public PagedList.Config.Builder();
+ method @Deprecated public androidx.paging.PagedList.Config build();
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
+ }
+
+ public final class PagedListConfigKt {
+ }
+
+ public final class PagedListKt {
+ }
+
+ public final class Pager<Key, Value> {
+ ctor @androidx.paging.ExperimentalPagingApi public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, androidx.paging.RemoteMediator<Key,Value>? remoteMediator, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ ctor public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
+ }
+
+ public final class PagingConfig {
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize, optional int jumpThreshold);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance);
+ ctor public PagingConfig(int pageSize);
+ field public static final androidx.paging.PagingConfig.Companion Companion;
+ field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+ field public final boolean enablePlaceholders;
+ field public final int initialLoadSize;
+ field public final int jumpThreshold;
+ field public final int maxSize;
+ field public final int pageSize;
+ field public final int prefetchDistance;
+ }
+
+ public static final class PagingConfig.Companion {
+ }
+
+ public final class PagingData<T> {
+ method public static <T> androidx.paging.PagingData<T> empty();
+ method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
+ field public static final androidx.paging.PagingData.Companion Companion;
+ }
+
+ public static final class PagingData.Companion {
+ method public <T> androidx.paging.PagingData<T> empty();
+ method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
+ }
+
+ public final class PagingDataTransforms {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
+ method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+ method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+ }
+
+ public abstract class PagingSource<Key, Value> {
+ ctor public PagingSource();
+ method public final boolean getInvalid();
+ method public boolean getJumpingSupported();
+ method public boolean getKeyReuseSupported();
+ method public abstract Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
+ method public final void invalidate();
+ method public abstract suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+ method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+ property public final boolean invalid;
+ property public boolean jumpingSupported;
+ property public boolean keyReuseSupported;
+ }
+
+ public abstract static sealed class PagingSource.LoadParams<Key> {
+ method public abstract Key? getKey();
+ method public final int getLoadSize();
+ method public final boolean getPlaceholdersEnabled();
+ property public abstract Key? key;
+ property public final int loadSize;
+ property public final boolean placeholdersEnabled;
+ }
+
+ public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
+ method public Key getKey();
+ property public Key key;
+ }
+
+ public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
+ method public Key getKey();
+ property public Key key;
+ }
+
+ public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
+ method public Key? getKey();
+ property public Key? key;
+ }
+
+ public abstract static sealed class PagingSource.LoadResult<Key, Value> {
+ }
+
+ public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Error(Throwable throwable);
+ method public Throwable component1();
+ method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
+ method public Throwable getThrowable();
+ property public final Throwable throwable;
+ }
+
+ public static final class PagingSource.LoadResult.Invalid<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Invalid();
+ }
+
+ public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsBefore, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsAfter);
+ ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
+ method public java.util.List<Value> component1();
+ method public Key? component2();
+ method public Key? component3();
+ method public int component4();
+ method public int component5();
+ method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=-2147483648L) int itemsBefore, @IntRange(from=-2147483648L) int itemsAfter);
+ method public java.util.List<Value> getData();
+ method public int getItemsAfter();
+ method public int getItemsBefore();
+ method public Key? getNextKey();
+ method public Key? getPrevKey();
+ property public final java.util.List<Value> data;
+ property public final int itemsAfter;
+ property public final int itemsBefore;
+ property public final Key? nextKey;
+ property public final Key? prevKey;
+ field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
+ field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
+ }
+
+ public static final class PagingSource.LoadResult.Page.Companion {
+ }
+
+ public final class PagingSourceKt {
+ }
+
+ public final class PagingState<Key, Value> {
+ ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0) int leadingPlaceholderCount);
+ method public Value? closestItemToPosition(int anchorPosition);
+ method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
+ method public Value? firstItemOrNull();
+ method public Integer? getAnchorPosition();
+ method public androidx.paging.PagingConfig getConfig();
+ method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
+ method public boolean isEmpty();
+ method public Value? lastItemOrNull();
+ property public final Integer? anchorPosition;
+ property public final androidx.paging.PagingConfig config;
+ property public final java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages;
+ }
+
+ @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
+ ctor @Deprecated public PositionalDataSource();
+ method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
+ method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
+ method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
+ method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
+ }
+
+ @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
+ ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
+ }
+
+ @Deprecated public static class PositionalDataSource.LoadInitialParams {
+ ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
+ field @Deprecated public final int pageSize;
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final int requestedLoadSize;
+ field @Deprecated public final int requestedStartPosition;
+ }
+
+ @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
+ ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
+ }
+
+ @Deprecated public static class PositionalDataSource.LoadRangeParams {
+ ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
+ field @Deprecated public final int loadSize;
+ field @Deprecated public final int startPosition;
+ }
+
+ @androidx.paging.ExperimentalPagingApi public abstract class RemoteMediator<Key, Value> {
+ ctor public RemoteMediator();
+ method public suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+ method public abstract suspend Object? load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+ }
+
+ public enum RemoteMediator.InitializeAction {
+ enum_constant public static final androidx.paging.RemoteMediator.InitializeAction LAUNCH_INITIAL_REFRESH;
+ enum_constant public static final androidx.paging.RemoteMediator.InitializeAction SKIP_INITIAL_REFRESH;
+ }
+
+ public abstract static sealed class RemoteMediator.MediatorResult {
+ }
+
+ public static final class RemoteMediator.MediatorResult.Error extends androidx.paging.RemoteMediator.MediatorResult {
+ ctor public RemoteMediator.MediatorResult.Error(Throwable throwable);
+ method public Throwable getThrowable();
+ property public final Throwable throwable;
+ }
+
+ public static final class RemoteMediator.MediatorResult.Success extends androidx.paging.RemoteMediator.MediatorResult {
+ ctor public RemoteMediator.MediatorResult.Success(boolean endOfPaginationReached);
+ method public boolean getEndOfPaginationReached();
+ property public final boolean endOfPaginationReached;
+ }
+
+ public final class RemoteMediatorAccessorKt {
+ }
+
+ public final class SeparatorsKt {
+ }
+
+ public final class SimpleChannelFlowKt {
+ }
+
+ public enum TerminalSeparatorType {
+ enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
+ enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
+ }
+
+}
+
diff --git a/paging/paging-common/api/public_plus_experimental_current.txt b/paging/paging-common/api/public_plus_experimental_current.txt
index 62e15c2..059daf7 100644
--- a/paging/paging-common/api/public_plus_experimental_current.txt
+++ b/paging/paging-common/api/public_plus_experimental_current.txt
@@ -51,6 +51,9 @@
public final class FlowExtKt {
}
+ public final class HintHandlerKt {
+ }
+
public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
method public void invalidate();
diff --git a/paging/paging-common/api/restricted_3.1.0-beta01.txt b/paging/paging-common/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..cb81fc4
--- /dev/null
+++ b/paging/paging-common/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1,470 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ public final class CachedPagingDataKt {
+ method @CheckResult public static <T> kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>> cachedIn(kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ }
+
+ public final class CancelableChannelFlowKt {
+ }
+
+ public final class CombinedLoadStates {
+ ctor public CombinedLoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append, androidx.paging.LoadStates source, optional androidx.paging.LoadStates? mediator);
+ method public androidx.paging.LoadState getAppend();
+ method public androidx.paging.LoadStates? getMediator();
+ method public androidx.paging.LoadState getPrepend();
+ method public androidx.paging.LoadState getRefresh();
+ method public androidx.paging.LoadStates getSource();
+ property public final androidx.paging.LoadState append;
+ property public final androidx.paging.LoadStates? mediator;
+ property public final androidx.paging.LoadState prepend;
+ property public final androidx.paging.LoadState refresh;
+ property public final androidx.paging.LoadStates source;
+ }
+
+ public abstract class DataSource<Key, Value> {
+ method @AnyThread public void addInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+ method @AnyThread public void invalidate();
+ method @WorkerThread public boolean isInvalid();
+ method public <ToValue> androidx.paging.DataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method public <ToValue> androidx.paging.DataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @AnyThread public void removeInvalidatedCallback(androidx.paging.DataSource.InvalidatedCallback onInvalidatedCallback);
+ property @WorkerThread public boolean isInvalid;
+ }
+
+ public abstract static class DataSource.Factory<Key, Value> {
+ ctor public DataSource.Factory();
+ method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory(optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method public final kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> asPagingSourceFactory();
+ method public abstract androidx.paging.DataSource<Key,Value> create();
+ method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method public <ToValue> androidx.paging.DataSource.Factory<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ }
+
+ public static fun interface DataSource.InvalidatedCallback {
+ method @AnyThread public void onInvalidated();
+ }
+
+ public final class FlowExtKt {
+ }
+
+ public final class HintHandlerKt {
+ }
+
+ public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
+ ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ method public void invalidate();
+ method public androidx.paging.PagingSource<Key,Value> invoke();
+ }
+
+ @Deprecated public abstract class ItemKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+ ctor @Deprecated public ItemKeyedDataSource();
+ method @Deprecated public abstract Key getKey(Value item);
+ method @Deprecated public abstract void loadAfter(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+ method @Deprecated public abstract void loadBefore(androidx.paging.ItemKeyedDataSource.LoadParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadCallback<Value> callback);
+ method @Deprecated public abstract void loadInitial(androidx.paging.ItemKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.ItemKeyedDataSource.LoadInitialCallback<Value> callback);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @Deprecated public final <ToValue> androidx.paging.ItemKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+ }
+
+ @Deprecated public abstract static class ItemKeyedDataSource.LoadCallback<Value> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data);
+ }
+
+ @Deprecated public abstract static class ItemKeyedDataSource.LoadInitialCallback<Value> extends androidx.paging.ItemKeyedDataSource.LoadCallback<Value> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount);
+ }
+
+ @Deprecated public static class ItemKeyedDataSource.LoadInitialParams<Key> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadInitialParams(Key? requestedInitialKey, int requestedLoadSize, boolean placeholdersEnabled);
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final Key? requestedInitialKey;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public static class ItemKeyedDataSource.LoadParams<Key> {
+ ctor @Deprecated public ItemKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+ field @Deprecated public final Key key;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ public final class ItemSnapshotList<T> extends kotlin.collections.AbstractList<T> {
+ ctor public ItemSnapshotList(@IntRange(from=0) int placeholdersBefore, @IntRange(from=0) int placeholdersAfter, java.util.List<? extends T> items);
+ method public T? get(int index);
+ method public java.util.List<T> getItems();
+ method public int getPlaceholdersAfter();
+ method public int getPlaceholdersBefore();
+ method public int getSize();
+ property public final java.util.List<T> items;
+ property public final int placeholdersAfter;
+ property public final int placeholdersBefore;
+ property public int size;
+ }
+
+ public abstract sealed class LoadState {
+ method public final boolean getEndOfPaginationReached();
+ property public final boolean endOfPaginationReached;
+ }
+
+ public static final class LoadState.Error extends androidx.paging.LoadState {
+ ctor public LoadState.Error(Throwable error);
+ method public Throwable getError();
+ property public final Throwable error;
+ }
+
+ public static final class LoadState.Loading extends androidx.paging.LoadState {
+ field public static final androidx.paging.LoadState.Loading INSTANCE;
+ }
+
+ public static final class LoadState.NotLoading extends androidx.paging.LoadState {
+ ctor public LoadState.NotLoading(boolean endOfPaginationReached);
+ }
+
+ public final class LoadStates {
+ ctor public LoadStates(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+ method public androidx.paging.LoadState component1();
+ method public androidx.paging.LoadState component2();
+ method public androidx.paging.LoadState component3();
+ method public androidx.paging.LoadStates copy(androidx.paging.LoadState refresh, androidx.paging.LoadState prepend, androidx.paging.LoadState append);
+ method public androidx.paging.LoadState getAppend();
+ method public androidx.paging.LoadState getPrepend();
+ method public androidx.paging.LoadState getRefresh();
+ property public final androidx.paging.LoadState append;
+ property public final androidx.paging.LoadState prepend;
+ property public final androidx.paging.LoadState refresh;
+ }
+
+ public enum LoadType {
+ enum_constant public static final androidx.paging.LoadType APPEND;
+ enum_constant public static final androidx.paging.LoadType PREPEND;
+ enum_constant public static final androidx.paging.LoadType REFRESH;
+ }
+
+ public final class PageFetcherSnapshotKt {
+ }
+
+ @Deprecated public abstract class PageKeyedDataSource<Key, Value> extends androidx.paging.DataSource<Key,Value> {
+ ctor @Deprecated public PageKeyedDataSource();
+ method @Deprecated public abstract void loadAfter(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+ method @Deprecated public abstract void loadBefore(androidx.paging.PageKeyedDataSource.LoadParams<Key> params, androidx.paging.PageKeyedDataSource.LoadCallback<Key,Value> callback);
+ method @Deprecated public abstract void loadInitial(androidx.paging.PageKeyedDataSource.LoadInitialParams<Key> params, androidx.paging.PageKeyedDataSource.LoadInitialCallback<Key,Value> callback);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(androidx.arch.core.util.Function<Value,ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> map(kotlin.jvm.functions.Function1<? super Value,? extends ToValue> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(androidx.arch.core.util.Function<java.util.List<Value>,java.util.List<ToValue>> function);
+ method @Deprecated public final <ToValue> androidx.paging.PageKeyedDataSource<Key,ToValue> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends Value>,? extends java.util.List<? extends ToValue>> function);
+ }
+
+ @Deprecated public abstract static class PageKeyedDataSource.LoadCallback<Key, Value> {
+ ctor @Deprecated public PageKeyedDataSource.LoadCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? adjacentPageKey);
+ }
+
+ @Deprecated public abstract static class PageKeyedDataSource.LoadInitialCallback<Key, Value> {
+ ctor @Deprecated public PageKeyedDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, int position, int totalCount, Key? previousPageKey, Key? nextPageKey);
+ method @Deprecated public abstract void onResult(java.util.List<? extends Value> data, Key? previousPageKey, Key? nextPageKey);
+ }
+
+ @Deprecated public static class PageKeyedDataSource.LoadInitialParams<Key> {
+ ctor @Deprecated public PageKeyedDataSource.LoadInitialParams(int requestedLoadSize, boolean placeholdersEnabled);
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public static class PageKeyedDataSource.LoadParams<Key> {
+ ctor @Deprecated public PageKeyedDataSource.LoadParams(Key key, int requestedLoadSize);
+ field @Deprecated public final Key key;
+ field @Deprecated public final int requestedLoadSize;
+ }
+
+ @Deprecated public abstract class PagedList<T> extends java.util.AbstractList<T> {
+ method @Deprecated public final void addWeakCallback(java.util.List<? extends T>? previousSnapshot, androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void addWeakCallback(androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void addWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public abstract void detach();
+ method @Deprecated public T? get(int index);
+ method @Deprecated public final androidx.paging.PagedList.Config getConfig();
+ method @Deprecated public final androidx.paging.DataSource<?,T> getDataSource();
+ method @Deprecated public abstract Object? getLastKey();
+ method @Deprecated public final int getLoadedCount();
+ method @Deprecated public final int getPositionOffset();
+ method @Deprecated public int getSize();
+ method @Deprecated public abstract boolean isDetached();
+ method @Deprecated public boolean isImmutable();
+ method @Deprecated public final void loadAround(int index);
+ method @Deprecated public final void removeWeakCallback(androidx.paging.PagedList.Callback callback);
+ method @Deprecated public final void removeWeakLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void retry();
+ method @Deprecated public final java.util.List<T> snapshot();
+ property public final androidx.paging.PagedList.Config config;
+ property @Deprecated public final androidx.paging.DataSource<?,T> dataSource;
+ property public abstract boolean isDetached;
+ property public boolean isImmutable;
+ property public abstract Object? lastKey;
+ property public final int loadedCount;
+ property public final int positionOffset;
+ property public int size;
+ }
+
+ @Deprecated @MainThread public abstract static class PagedList.BoundaryCallback<T> {
+ ctor @Deprecated public PagedList.BoundaryCallback();
+ method @Deprecated public void onItemAtEndLoaded(T itemAtEnd);
+ method @Deprecated public void onItemAtFrontLoaded(T itemAtFront);
+ method @Deprecated public void onZeroItemsLoaded();
+ }
+
+ @Deprecated public static final class PagedList.Builder<Key, Value> {
+ ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.DataSource<Key,Value> dataSource, int pageSize);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public PagedList.Builder(androidx.paging.PagingSource<Key,Value> pagingSource, androidx.paging.PagingSource.LoadResult.Page<Key,Value> initialPage, int pageSize);
+ method @Deprecated public androidx.paging.PagedList<Value> build();
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchDispatcher(kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setInitialKey(Key? initialKey);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyDispatcher(kotlinx.coroutines.CoroutineDispatcher notifyDispatcher);
+ method @Deprecated public androidx.paging.PagedList.Builder<Key,Value> setNotifyExecutor(java.util.concurrent.Executor notifyExecutor);
+ }
+
+ @Deprecated public abstract static class PagedList.Callback {
+ ctor @Deprecated public PagedList.Callback();
+ method @Deprecated public abstract void onChanged(int position, int count);
+ method @Deprecated public abstract void onInserted(int position, int count);
+ method @Deprecated public abstract void onRemoved(int position, int count);
+ }
+
+ @Deprecated public static final class PagedList.Config {
+ field @Deprecated public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+ field @Deprecated public final boolean enablePlaceholders;
+ field @Deprecated public final int initialLoadSizeHint;
+ field @Deprecated public final int maxSize;
+ field @Deprecated public final int pageSize;
+ field @Deprecated public final int prefetchDistance;
+ }
+
+ @Deprecated public static final class PagedList.Config.Builder {
+ ctor @Deprecated public PagedList.Config.Builder();
+ method @Deprecated public androidx.paging.PagedList.Config build();
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setEnablePlaceholders(boolean enablePlaceholders);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setInitialLoadSizeHint(@IntRange(from=1) int initialLoadSizeHint);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setMaxSize(@IntRange(from=2) int maxSize);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setPageSize(@IntRange(from=1) int pageSize);
+ method @Deprecated public androidx.paging.PagedList.Config.Builder setPrefetchDistance(@IntRange(from=0) int prefetchDistance);
+ }
+
+ public final class PagedListConfigKt {
+ }
+
+ public final class PagedListKt {
+ }
+
+ public final class Pager<Key, Value> {
+ ctor public Pager(androidx.paging.PagingConfig config, optional Key? initialKey, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ ctor public Pager(androidx.paging.PagingConfig config, kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
+ method public kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> getFlow();
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.PagingData<Value>> flow;
+ }
+
+ public final class PagingConfig {
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize, optional int jumpThreshold);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize, optional @IntRange(from=2) int maxSize);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders, optional @IntRange(from=1) int initialLoadSize);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance, optional boolean enablePlaceholders);
+ ctor public PagingConfig(int pageSize, optional @IntRange(from=0) int prefetchDistance);
+ ctor public PagingConfig(int pageSize);
+ field public static final androidx.paging.PagingConfig.Companion Companion;
+ field public static final int MAX_SIZE_UNBOUNDED = 2147483647; // 0x7fffffff
+ field public final boolean enablePlaceholders;
+ field public final int initialLoadSize;
+ field public final int jumpThreshold;
+ field public final int maxSize;
+ field public final int pageSize;
+ field public final int prefetchDistance;
+ }
+
+ public static final class PagingConfig.Companion {
+ }
+
+ public final class PagingData<T> {
+ method public static <T> androidx.paging.PagingData<T> empty();
+ method public static <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
+ field public static final androidx.paging.PagingData.Companion Companion;
+ }
+
+ public static final class PagingData.Companion {
+ method public <T> androidx.paging.PagingData<T> empty();
+ method public <T> androidx.paging.PagingData<T> from(java.util.List<? extends T> data);
+ }
+
+ public final class PagingDataTransforms {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,java.lang.Boolean> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends java.lang.Iterable<? extends R>> transform);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertFooterItem(androidx.paging.PagingData<T>, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, T item);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> insertHeaderItem(androidx.paging.PagingData<T>, T item);
+ method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, optional androidx.paging.TerminalSeparatorType terminalSeparatorType, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+ method @CheckResult public static <R, T extends R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function2<? super T,? super T,? extends R> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, java.util.concurrent.Executor executor, kotlin.jvm.functions.Function1<? super T,? extends R> transform);
+ }
+
+ public abstract class PagingSource<Key, Value> {
+ ctor public PagingSource();
+ method public final boolean getInvalid();
+ method public boolean getJumpingSupported();
+ method public boolean getKeyReuseSupported();
+ method public abstract Key? getRefreshKey(androidx.paging.PagingState<Key,Value> state);
+ method public final void invalidate();
+ method public abstract suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public final void registerInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+ method public final void unregisterInvalidatedCallback(kotlin.jvm.functions.Function0<kotlin.Unit> onInvalidatedCallback);
+ property public final boolean invalid;
+ property public boolean jumpingSupported;
+ property public boolean keyReuseSupported;
+ }
+
+ public abstract static sealed class PagingSource.LoadParams<Key> {
+ method public abstract Key? getKey();
+ method public final int getLoadSize();
+ method public final boolean getPlaceholdersEnabled();
+ property public abstract Key? key;
+ property public final int loadSize;
+ property public final boolean placeholdersEnabled;
+ }
+
+ public static final class PagingSource.LoadParams.Append<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Append(Key key, int loadSize, boolean placeholdersEnabled);
+ method public Key getKey();
+ property public Key key;
+ }
+
+ public static final class PagingSource.LoadParams.Prepend<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Prepend(Key key, int loadSize, boolean placeholdersEnabled);
+ method public Key getKey();
+ property public Key key;
+ }
+
+ public static final class PagingSource.LoadParams.Refresh<Key> extends androidx.paging.PagingSource.LoadParams<Key> {
+ ctor public PagingSource.LoadParams.Refresh(Key? key, int loadSize, boolean placeholdersEnabled);
+ method public Key? getKey();
+ property public Key? key;
+ }
+
+ public abstract static sealed class PagingSource.LoadResult<Key, Value> {
+ }
+
+ public static final class PagingSource.LoadResult.Error<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Error(Throwable throwable);
+ method public Throwable component1();
+ method public androidx.paging.PagingSource.LoadResult.Error<Key,Value> copy(Throwable throwable);
+ method public Throwable getThrowable();
+ property public final Throwable throwable;
+ }
+
+ public static final class PagingSource.LoadResult.Invalid<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Invalid();
+ }
+
+ public static final class PagingSource.LoadResult.Page<Key, Value> extends androidx.paging.PagingSource.LoadResult<Key,Value> {
+ ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsBefore, optional @IntRange(from=COUNT_UNDEFINED.toLong()) int itemsAfter);
+ ctor public PagingSource.LoadResult.Page(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey);
+ method public java.util.List<Value> component1();
+ method public Key? component2();
+ method public Key? component3();
+ method public int component4();
+ method public int component5();
+ method public androidx.paging.PagingSource.LoadResult.Page<Key,Value> copy(java.util.List<? extends Value> data, Key? prevKey, Key? nextKey, @IntRange(from=-2147483648L) int itemsBefore, @IntRange(from=-2147483648L) int itemsAfter);
+ method public java.util.List<Value> getData();
+ method public int getItemsAfter();
+ method public int getItemsBefore();
+ method public Key? getNextKey();
+ method public Key? getPrevKey();
+ property public final java.util.List<Value> data;
+ property public final int itemsAfter;
+ property public final int itemsBefore;
+ property public final Key? nextKey;
+ property public final Key? prevKey;
+ field public static final int COUNT_UNDEFINED = -2147483648; // 0x80000000
+ field public static final androidx.paging.PagingSource.LoadResult.Page.Companion Companion;
+ }
+
+ public static final class PagingSource.LoadResult.Page.Companion {
+ }
+
+ public final class PagingSourceKt {
+ }
+
+ public final class PagingState<Key, Value> {
+ ctor public PagingState(java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages, Integer? anchorPosition, androidx.paging.PagingConfig config, @IntRange(from=0) int leadingPlaceholderCount);
+ method public Value? closestItemToPosition(int anchorPosition);
+ method public androidx.paging.PagingSource.LoadResult.Page<Key,Value>? closestPageToPosition(int anchorPosition);
+ method public Value? firstItemOrNull();
+ method public Integer? getAnchorPosition();
+ method public androidx.paging.PagingConfig getConfig();
+ method public java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> getPages();
+ method public boolean isEmpty();
+ method public Value? lastItemOrNull();
+ property public final Integer? anchorPosition;
+ property public final androidx.paging.PagingConfig config;
+ property public final java.util.List<androidx.paging.PagingSource.LoadResult.Page<Key,Value>> pages;
+ }
+
+ @Deprecated public abstract class PositionalDataSource<T> extends androidx.paging.DataSource<java.lang.Integer,T> {
+ ctor @Deprecated public PositionalDataSource();
+ method @Deprecated public static final int computeInitialLoadPosition(androidx.paging.PositionalDataSource.LoadInitialParams params, int totalCount);
+ method @Deprecated public static final int computeInitialLoadSize(androidx.paging.PositionalDataSource.LoadInitialParams params, int initialLoadPosition, int totalCount);
+ method @Deprecated @WorkerThread public abstract void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams params, androidx.paging.PositionalDataSource.LoadInitialCallback<T> callback);
+ method @Deprecated @WorkerThread public abstract void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams params, androidx.paging.PositionalDataSource.LoadRangeCallback<T> callback);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(androidx.arch.core.util.Function<T,V> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> map(kotlin.jvm.functions.Function1<? super T,? extends V> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(androidx.arch.core.util.Function<java.util.List<T>,java.util.List<V>> function);
+ method @Deprecated public final <V> androidx.paging.PositionalDataSource<V> mapByPage(kotlin.jvm.functions.Function1<? super java.util.List<? extends T>,? extends java.util.List<? extends V>> function);
+ }
+
+ @Deprecated public abstract static class PositionalDataSource.LoadInitialCallback<T> {
+ ctor @Deprecated public PositionalDataSource.LoadInitialCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position, int totalCount);
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data, int position);
+ }
+
+ @Deprecated public static class PositionalDataSource.LoadInitialParams {
+ ctor @Deprecated public PositionalDataSource.LoadInitialParams(int requestedStartPosition, int requestedLoadSize, int pageSize, boolean placeholdersEnabled);
+ field @Deprecated public final int pageSize;
+ field @Deprecated public final boolean placeholdersEnabled;
+ field @Deprecated public final int requestedLoadSize;
+ field @Deprecated public final int requestedStartPosition;
+ }
+
+ @Deprecated public abstract static class PositionalDataSource.LoadRangeCallback<T> {
+ ctor @Deprecated public PositionalDataSource.LoadRangeCallback();
+ method @Deprecated public abstract void onResult(java.util.List<? extends T> data);
+ }
+
+ @Deprecated public static class PositionalDataSource.LoadRangeParams {
+ ctor @Deprecated public PositionalDataSource.LoadRangeParams(int startPosition, int loadSize);
+ field @Deprecated public final int loadSize;
+ field @Deprecated public final int startPosition;
+ }
+
+ public final class RemoteMediatorAccessorKt {
+ }
+
+ public final class SeparatorsKt {
+ }
+
+ public final class SimpleChannelFlowKt {
+ }
+
+ public enum TerminalSeparatorType {
+ enum_constant public static final androidx.paging.TerminalSeparatorType FULLY_COMPLETE;
+ enum_constant public static final androidx.paging.TerminalSeparatorType SOURCE_COMPLETE;
+ }
+
+}
+
diff --git a/paging/paging-common/api/restricted_current.txt b/paging/paging-common/api/restricted_current.txt
index e006221..cb81fc4 100644
--- a/paging/paging-common/api/restricted_current.txt
+++ b/paging/paging-common/api/restricted_current.txt
@@ -48,6 +48,9 @@
public final class FlowExtKt {
}
+ public final class HintHandlerKt {
+ }
+
public final class InvalidatingPagingSourceFactory<Key, Value> implements kotlin.jvm.functions.Function0<androidx.paging.PagingSource<Key,Value>> {
ctor public InvalidatingPagingSourceFactory(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory);
method public void invalidate();
diff --git a/paging/paging-common/build.gradle b/paging/paging-common/build.gradle
index ae0f19b..3249b5d 100644
--- a/paging/paging-common/build.gradle
+++ b/paging/paging-common/build.gradle
@@ -40,6 +40,8 @@
testImplementation(libs.kotlinTest)
testImplementation(libs.kotlinCoroutinesTest)
testImplementation(libs.truth)
+
+ samples(project(":paging:paging-samples"))
}
androidx {
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/CombinedLoadStates.kt b/paging/paging-common/src/main/kotlin/androidx/paging/CombinedLoadStates.kt
index fa88573..349f058 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/CombinedLoadStates.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/CombinedLoadStates.kt
@@ -18,6 +18,9 @@
/**
* Collection of pagination [LoadState]s for both a [PagingSource], and [RemoteMediator].
+ *
+ * Note: The [LoadType] [REFRESH][LoadType.REFRESH] always has [LoadState.endOfPaginationReached]
+ * set to `false`.
*/
public class CombinedLoadStates(
/**
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt b/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt
new file mode 100644
index 0000000..f5990a6
--- /dev/null
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/HintHandler.kt
@@ -0,0 +1,164 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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
+
+import androidx.paging.LoadType.APPEND
+import androidx.paging.LoadType.PREPEND
+import kotlinx.coroutines.channels.BufferOverflow
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableSharedFlow
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * Helper class to handle UI hints.
+ * It processes incoming hints and keeps a min/max (prepend/append) values and provides them as a
+ * flow to [PageFetcherSnapshot].
+ */
+internal class HintHandler {
+ private val state = State()
+
+ /**
+ * Latest call to [processHint]. Note that this value might be ignored wrt prepend and append
+ * hints if it is not expanding the range.
+ */
+ val lastAccessHint: ViewportHint.Access?
+ get() = state.lastAccessHint
+
+ /**
+ * Returns a flow of hints for the given [loadType].
+ */
+ fun hintFor(loadType: LoadType): Flow<ViewportHint> = when (loadType) {
+ PREPEND -> state.prependFlow
+ APPEND -> state.appendFlow
+ else -> throw IllegalArgumentException("invalid load type for hints")
+ }
+
+ /**
+ * Resets the hint for the given [loadType].
+ * Note that this won't update [lastAccessHint] or the other load type.
+ */
+ fun forceSetHint(
+ loadType: LoadType,
+ viewportHint: ViewportHint
+ ) {
+ require(
+ loadType == PREPEND || loadType == APPEND
+ ) {
+ "invalid load type for reset: $loadType"
+ }
+ state.modify(
+ accessHint = null
+ ) { prependHint, appendHint ->
+ if (loadType == PREPEND) {
+ prependHint.value = viewportHint
+ } else {
+ appendHint.value = viewportHint
+ }
+ }
+ }
+
+ /**
+ * Processes the hint coming from UI.
+ */
+ fun processHint(viewportHint: ViewportHint) {
+ state.modify(viewportHint as? ViewportHint.Access) { prependHint, appendHint ->
+ if (viewportHint.shouldPrioritizeOver(
+ previous = prependHint.value,
+ loadType = PREPEND
+ )
+ ) {
+ prependHint.value = viewportHint
+ }
+ if (viewportHint.shouldPrioritizeOver(
+ previous = appendHint.value,
+ loadType = APPEND
+ )
+ ) {
+ appendHint.value = viewportHint
+ }
+ }
+ }
+
+ private inner class State {
+ private val prepend = HintFlow()
+ private val append = HintFlow()
+ var lastAccessHint: ViewportHint.Access? = null
+ private set
+ val prependFlow
+ get() = prepend.flow
+ val appendFlow
+ get() = append.flow
+ private val lock = ReentrantLock()
+
+ /**
+ * Modifies the state inside a lock where it gets access to the mutable values.
+ */
+ fun modify(
+ accessHint: ViewportHint.Access?,
+ block: (prepend: HintFlow, append: HintFlow) -> Unit
+ ) {
+ lock.withLock {
+ if (accessHint != null) {
+ lastAccessHint = accessHint
+ }
+ block(prepend, append)
+ }
+ }
+ }
+
+ /**
+ * Like a StateFlow that holds the value but does not do de-duping.
+ * Note that, this class is not thread safe.
+ */
+ private inner class HintFlow {
+ var value: ViewportHint? = null
+ set(value) {
+ field = value
+ if (value != null) {
+ _flow.tryEmit(value)
+ }
+ }
+ private val _flow = MutableSharedFlow<ViewportHint>(
+ replay = 1,
+ onBufferOverflow = BufferOverflow.DROP_OLDEST
+ )
+ val flow: Flow<ViewportHint>
+ get() = _flow
+ }
+}
+
+internal fun ViewportHint.shouldPrioritizeOver(
+ previous: ViewportHint?,
+ loadType: LoadType
+): Boolean {
+ return when {
+ previous == null -> true
+ // Prioritize Access hints over Initialize hints
+ previous is ViewportHint.Initial && this is ViewportHint.Access -> true
+ this is ViewportHint.Initial && previous is ViewportHint.Access -> false
+ // Prioritize hints from most recent presenter state
+ // not that this it not a gt/lt check because we would like to prioritize any
+ // change in available pages, not necessarily more or less as drops can have an impact.
+ this.originalPageOffsetFirst != previous.originalPageOffsetFirst -> true
+ this.originalPageOffsetLast != previous.originalPageOffsetLast -> true
+ // Prioritize hints that would load the most items
+ previous.presentedItemsBeyondAnchor(loadType) <= presentedItemsBeyondAnchor(loadType) ->
+ false
+ else -> true
+ }
+}
\ No newline at end of file
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/LoadState.kt b/paging/paging-common/src/main/kotlin/androidx/paging/LoadState.kt
index 11c5d59..d554721 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/LoadState.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/LoadState.kt
@@ -28,6 +28,9 @@
* should continue to make requests for additional data in this direction or if it should
* halt as the end of the dataset has been reached.
*
+ * Note: The [LoadType] [REFRESH][LoadType.REFRESH] always has [LoadState.endOfPaginationReached]
+ * set to `false`.
+ *
* @see LoadType
*/
public sealed class LoadState(
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
index 0675ade..21e1d41 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/PageFetcherSnapshot.kt
@@ -34,7 +34,6 @@
import kotlinx.coroutines.channels.Channel.Factory.BUFFERED
import kotlinx.coroutines.channels.ClosedSendChannelException
import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.conflate
@@ -69,8 +68,7 @@
}
}
- private val hintSharedFlow = MutableSharedFlow<ViewportHint>(replay = 1)
- private var lastHint: ViewportHint.Access? = null
+ private val hintHandler = HintHandler()
private val pageEventChCollected = AtomicBoolean(false)
private val pageEventCh = Channel<PageEvent<Value>>(BUFFERED)
@@ -110,7 +108,9 @@
retryChannel.consumeAsFlow()
.collect {
val (sourceLoadStates, remotePagingState) = stateHolder.withLock { state ->
- state.sourceLoadStates.snapshot() to state.currentPagingState(lastHint)
+ state.sourceLoadStates.snapshot() to state.currentPagingState(
+ hintHandler.lastAccessHint
+ )
}
// tell remote mediator to retry and it will trigger necessary work / change
// its state as necessary.
@@ -188,17 +188,13 @@
"Cannot retry APPEND / PREPEND load on PagingSource without ViewportHint"
}
- hintSharedFlow.tryEmit(viewportHint)
+ hintHandler.forceSetHint(loadType, viewportHint)
}
}
}
fun accessHint(viewportHint: ViewportHint) {
- if (viewportHint is ViewportHint.Access) {
- lastHint = viewportHint
- }
-
- hintSharedFlow.tryEmit(viewportHint)
+ hintHandler.processHint(viewportHint)
}
fun close() {
@@ -206,19 +202,25 @@
}
suspend fun currentPagingState(): PagingState<Key, Value> {
- return stateHolder.withLock { state -> state.currentPagingState(lastHint) }
+ return stateHolder.withLock { state ->
+ state.currentPagingState(hintHandler.lastAccessHint)
+ }
}
private fun CoroutineScope.startConsumingHints() {
// Pseudo-tiling via invalidation on jumps.
if (config.jumpThreshold != COUNT_UNDEFINED) {
- launch {
- hintSharedFlow
- .filter { hint ->
+ listOf(
+ APPEND, PREPEND
+ ).forEach { loadType ->
+ launch {
+ hintHandler.hintFor(
+ loadType
+ ).filter { hint ->
hint.presentedItemsBefore * -1 > config.jumpThreshold ||
hint.presentedItemsAfter * -1 > config.jumpThreshold
- }
- .collectLatest { invalidate() }
+ }.collectLatest { invalidate() }
+ }
}
}
@@ -235,7 +237,7 @@
/**
* Maps a [Flow] of generation ids from [PageFetcherSnapshotState] to [ViewportHint]s from
- * [hintSharedFlow] with back-pressure handling via conflation by prioritizing hints which
+ * [hintHandler] with back-pressure handling via conflation by prioritizing hints which
* either update presenter state or those that would load the most items.
*
* @param loadType [PREPEND] or [APPEND]
@@ -256,19 +258,16 @@
}
}
- hintSharedFlow
+ hintHandler.hintFor(loadType)
// Prevent infinite loop when competing PREPEND / APPEND cancel each other
.drop(if (generationId == 0) 0 else 1)
.map { hint -> GenerationalViewportHint(generationId, hint) }
- }
+ }.simpleRunningReduce { previous, next ->
// Prioritize new hints that would load the maximum number of items.
- .simpleRunningReduce { previous, next ->
- if (next.shouldPrioritizeOver(previous, loadType)) next else previous
- }
- .conflate()
- .collect { generationalHint ->
- doLoad(loadType, generationalHint)
- }
+ if (next.shouldPrioritizeOver(previous, loadType)) next else previous
+ }.conflate().collect { generationalHint ->
+ doLoad(loadType, generationalHint)
+ }
private fun loadParams(loadType: LoadType, key: Key?) = LoadParams.create(
loadType = loadType,
@@ -324,7 +323,7 @@
if (remoteMediatorConnection != null) {
if (result.prevKey == null || result.nextKey == null) {
val pagingState = stateHolder.withLock { state ->
- state.currentPagingState(lastHint)
+ state.currentPagingState(hintHandler.lastAccessHint)
}
if (result.prevKey == null) {
@@ -395,7 +394,7 @@
state.nextLoadKeyOrNull(
loadType,
generationalHint.generationId,
- generationalHint.presentedItemsBeyondAnchor(loadType) + itemsLoaded,
+ generationalHint.hint.presentedItemsBeyondAnchor(loadType) + itemsLoaded,
)?.also { state.setLoading(loadType) }
}
@@ -474,7 +473,7 @@
loadKey = state.nextLoadKeyOrNull(
loadType,
generationalHint.generationId,
- generationalHint.presentedItemsBeyondAnchor(loadType) + itemsLoaded,
+ generationalHint.hint.presentedItemsBeyondAnchor(loadType) + itemsLoaded,
)
// Update load state to success if this is the final load result for this
@@ -501,7 +500,7 @@
val endsAppend = params is LoadParams.Append && result.nextKey == null
if (remoteMediatorConnection != null && (endsPrepend || endsAppend)) {
val pagingState = stateHolder.withLock { state ->
- state.currentPagingState(lastHint)
+ state.currentPagingState(hintHandler.lastAccessHint)
}
if (endsPrepend) {
@@ -576,20 +575,7 @@
* between loads from jobs that have been cancelled, but continued to run to completion.
*/
@VisibleForTesting
-internal data class GenerationalViewportHint(val generationId: Int, val hint: ViewportHint) {
- /**
- * @return Count of presented items between [hint], and either:
- * * the beginning of the list if [loadType] == PREPEND
- * * the end of the list if loadType == APPEND
- */
- internal fun presentedItemsBeyondAnchor(loadType: LoadType): Int = when (loadType) {
- REFRESH -> throw IllegalArgumentException(
- "Cannot get presentedItems for loadType: REFRESH"
- )
- PREPEND -> hint.presentedItemsBefore
- APPEND -> hint.presentedItemsAfter
- }
-}
+internal data class GenerationalViewportHint(val generationId: Int, val hint: ViewportHint)
/**
* Helper for [GenerationalViewportHint] prioritization in cases where item accesses are being sent
@@ -609,20 +595,7 @@
return when {
// Prioritize hints from new generations, which increments after dropping.
generationId > previous.generationId -> true
- // Prioritize Access hints over Initialize hints
- previous.hint is ViewportHint.Initial && hint is ViewportHint.Access -> true
- hint is ViewportHint.Initial && previous.hint is ViewportHint.Access -> false
- // Prioritize hints from most recent presenter state
- hint.originalPageOffsetFirst != previous.hint.originalPageOffsetFirst -> true
- hint.originalPageOffsetLast != previous.hint.originalPageOffsetLast -> true
- // Prioritize hints that would load the most items in PREPEND direction.
- loadType == PREPEND && previous.hint.presentedItemsBefore < hint.presentedItemsBefore -> {
- false
- }
- // Prioritize hints that would load the most items in APPEND direction.
- loadType == APPEND && previous.hint.presentedItemsAfter < hint.presentedItemsAfter -> {
- false
- }
- else -> true
+ generationId < previous.generationId -> false
+ else -> hint.shouldPrioritizeOver(previous.hint, loadType)
}
}
\ No newline at end of file
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/RemoteMediatorAccessor.kt b/paging/paging-common/src/main/kotlin/androidx/paging/RemoteMediatorAccessor.kt
index 0c6bd29..0d04153 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/RemoteMediatorAccessor.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/RemoteMediatorAccessor.kt
@@ -119,7 +119,10 @@
// b) it might be blocked due to refresh being required first -> Incomplete
// c) it might have never run -> Incomplete
return when (blockState) {
- COMPLETED -> LoadState.NotLoading.Complete
+ COMPLETED -> when (loadType) {
+ LoadType.REFRESH -> LoadState.NotLoading.Incomplete
+ else -> LoadState.NotLoading.Complete
+ }
REQUIRES_REFRESH -> LoadState.NotLoading.Incomplete
UNBLOCKED -> LoadState.NotLoading.Incomplete
}
diff --git a/paging/paging-common/src/main/kotlin/androidx/paging/ViewportHint.kt b/paging/paging-common/src/main/kotlin/androidx/paging/ViewportHint.kt
index 7cb85eb..296a79d 100644
--- a/paging/paging-common/src/main/kotlin/androidx/paging/ViewportHint.kt
+++ b/paging/paging-common/src/main/kotlin/androidx/paging/ViewportHint.kt
@@ -63,6 +63,19 @@
originalPageOffsetLast == other.originalPageOffsetLast
}
+ /**
+ * @return Count of presented items between this hint, and either:
+ * * the beginning of the list if [loadType] == PREPEND
+ * * the end of the list if loadType == APPEND
+ */
+ internal fun presentedItemsBeyondAnchor(loadType: LoadType): Int = when (loadType) {
+ LoadType.REFRESH -> throw IllegalArgumentException(
+ "Cannot get presentedItems for loadType: REFRESH"
+ )
+ LoadType.PREPEND -> presentedItemsBefore
+ LoadType.APPEND -> presentedItemsAfter
+ }
+
override fun hashCode(): Int {
return presentedItemsBefore.hashCode() + presentedItemsAfter.hashCode() +
originalPageOffsetFirst.hashCode() + originalPageOffsetLast.hashCode()
diff --git a/paging/paging-common/src/test/kotlin/androidx/paging/HintHandlerTest.kt b/paging/paging-common/src/test/kotlin/androidx/paging/HintHandlerTest.kt
new file mode 100644
index 0000000..5a8cc53
--- /dev/null
+++ b/paging/paging-common/src/test/kotlin/androidx/paging/HintHandlerTest.kt
@@ -0,0 +1,305 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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
+
+import androidx.paging.LoadType.APPEND
+import androidx.paging.LoadType.PREPEND
+import androidx.paging.LoadType.REFRESH
+import com.google.common.truth.Truth.assertThat
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.ExperimentalCoroutinesApi
+import kotlinx.coroutines.Job
+import kotlinx.coroutines.async
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.take
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.runBlockingTest
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+@OptIn(ExperimentalCoroutinesApi::class)
+class HintHandlerTest {
+ private val hintHandler = HintHandler()
+
+ @Test
+ fun initialState() {
+ assertThat(hintHandler.lastAccessHint).isNull()
+ assertThat(hintHandler.currentValue(APPEND)).isNull()
+ assertThat(hintHandler.currentValue(PREPEND)).isNull()
+ }
+
+ @Test
+ fun noStateForRefresh() = runBlockingTest {
+ val refreshHints = kotlin.runCatching {
+ hintHandler.hintFor(REFRESH)
+ }
+ assertThat(refreshHints.exceptionOrNull()).isInstanceOf(
+ IllegalArgumentException::class.java
+ )
+ }
+
+ @Test
+ fun expandChecks() {
+ val initialHint = ViewportHint.Initial(
+ presentedItemsAfter = 0,
+ presentedItemsBefore = 0,
+ originalPageOffsetFirst = 0,
+ originalPageOffsetLast = 0
+ ).also(hintHandler::processHint)
+ hintHandler.assertValues(
+ prepend = initialHint,
+ append = initialHint,
+ lastAccessHint = null
+ )
+
+ // both hints get updated w/ access hint
+ val accessHint1 = ViewportHint.Access(
+ pageOffset = 0,
+ indexInPage = 1,
+ presentedItemsBefore = 100,
+ presentedItemsAfter = 100,
+ originalPageOffsetLast = 0,
+ originalPageOffsetFirst = 0
+ ).also(hintHandler::processHint)
+
+ hintHandler.assertValues(
+ prepend = accessHint1,
+ append = accessHint1,
+ lastAccessHint = accessHint1
+ )
+
+ // new access that only affects prepend
+ val accessHintPrepend = accessHint1.copy(
+ presentedItemsBefore = 70,
+ presentedItemsAfter = 110
+ ).also(hintHandler::processHint)
+ hintHandler.assertValues(
+ prepend = accessHintPrepend,
+ append = accessHint1,
+ lastAccessHint = accessHintPrepend
+ )
+
+ // new access hints that should be ignored
+ val ignoredPrependHint = accessHintPrepend.copy(
+ presentedItemsBefore = 90,
+ ).also(hintHandler::processHint)
+ hintHandler.assertValues(
+ prepend = accessHintPrepend,
+ append = accessHint1,
+ lastAccessHint = ignoredPrependHint
+ )
+
+ val accessHintAppend = accessHintPrepend.copy(
+ presentedItemsAfter = 80,
+ ).also(hintHandler::processHint)
+ hintHandler.assertValues(
+ prepend = accessHintPrepend,
+ append = accessHintAppend,
+ lastAccessHint = accessHintAppend
+ )
+
+ // more ignored access hints
+ hintHandler.processHint(
+ accessHint1
+ )
+ hintHandler.assertValues(
+ prepend = accessHintPrepend,
+ append = accessHintAppend,
+ lastAccessHint = accessHint1
+ )
+ hintHandler.processHint(
+ initialHint
+ )
+ hintHandler.assertValues(
+ prepend = accessHintPrepend,
+ append = accessHintAppend,
+ lastAccessHint = accessHint1
+ )
+
+ // try changing original page offsets
+ val newFirstOffset = accessHintPrepend.copy(
+ originalPageOffsetFirst = 2
+ ).also(hintHandler::processHint)
+ hintHandler.assertValues(
+ prepend = newFirstOffset,
+ append = newFirstOffset,
+ lastAccessHint = newFirstOffset
+ )
+ val newLastOffset = newFirstOffset.copy(
+ originalPageOffsetLast = 5
+ ).also(hintHandler::processHint)
+ hintHandler.assertValues(
+ prepend = newLastOffset,
+ append = newLastOffset,
+ lastAccessHint = newLastOffset
+ )
+ }
+
+ @Test
+ fun reset() {
+ val initial = ViewportHint.Access(
+ pageOffset = 0,
+ indexInPage = 3,
+ presentedItemsBefore = 10,
+ presentedItemsAfter = 10,
+ originalPageOffsetFirst = 0,
+ originalPageOffsetLast = 0
+ )
+ hintHandler.processHint(initial)
+
+ val appendReset = initial.copy(
+ presentedItemsBefore = 20,
+ presentedItemsAfter = 5
+ )
+ hintHandler.forceSetHint(
+ APPEND,
+ appendReset
+ )
+ hintHandler.assertValues(
+ prepend = initial,
+ append = appendReset,
+ lastAccessHint = initial
+ )
+
+ val prependReset = initial.copy(
+ presentedItemsBefore = 4,
+ presentedItemsAfter = 19
+ )
+ hintHandler.forceSetHint(
+ PREPEND,
+ prependReset
+ )
+ hintHandler.assertValues(
+ prepend = prependReset,
+ append = appendReset,
+ lastAccessHint = initial
+ )
+ }
+
+ @Test
+ fun resetCanReSendSameValues() = runBlockingTest {
+ val hint = ViewportHint.Access(
+ pageOffset = 0,
+ indexInPage = 1,
+ presentedItemsAfter = 10,
+ presentedItemsBefore = 10,
+ originalPageOffsetFirst = 0,
+ originalPageOffsetLast = 0,
+ )
+ val prependHints = collectAsync(
+ hintHandler.hintFor(PREPEND)
+ )
+ val appendHints = collectAsync(
+ hintHandler.hintFor(APPEND)
+ )
+ runCurrent()
+ assertThat(prependHints.values).isEmpty()
+ assertThat(appendHints.values).isEmpty()
+ hintHandler.processHint(hint)
+ runCurrent()
+ assertThat(prependHints.values).containsExactly(hint)
+ assertThat(appendHints.values).containsExactly(hint)
+
+ // send same hint twice, it should not get dispatched
+ hintHandler.processHint(hint.copy())
+ runCurrent()
+ assertThat(prependHints.values).containsExactly(hint)
+ assertThat(appendHints.values).containsExactly(hint)
+
+ // how send that hint as reset, now it should get dispatched
+ hintHandler.forceSetHint(PREPEND, hint)
+ runCurrent()
+ assertThat(prependHints.values).containsExactly(hint, hint)
+ assertThat(appendHints.values).containsExactly(hint)
+ hintHandler.forceSetHint(APPEND, hint)
+ runCurrent()
+ assertThat(prependHints.values).containsExactly(hint, hint)
+ assertThat(appendHints.values).containsExactly(hint, hint)
+ }
+
+ private fun HintHandler.assertValues(
+ prepend: ViewportHint,
+ append: ViewportHint,
+ lastAccessHint: ViewportHint.Access?
+ ) {
+ assertThat(currentValue(PREPEND)).isEqualTo(prepend)
+ assertThat(currentValue(APPEND)).isEqualTo(append)
+ assertThat(hintHandler.lastAccessHint).isEqualTo(lastAccessHint)
+ }
+
+ private fun HintHandler.currentValue(
+ loadType: LoadType
+ ): ViewportHint? {
+ var value: ViewportHint? = null
+ runBlockingTest {
+ val job = launch {
+ this@currentValue.hintFor(loadType).take(1).collect {
+ value = it
+ }
+ }
+ runCurrent()
+ job.cancel()
+ }
+ return value
+ }
+
+ private suspend fun CoroutineScope.collectAsync(
+ flow: Flow<ViewportHint>
+ ): TestCollection {
+ val impl = TestCollectionImpl()
+ async(context = impl.job) {
+ flow.collect {
+ impl.values.add(it)
+ }
+ }
+ return impl
+ }
+
+ private interface TestCollection {
+ val values: List<ViewportHint>
+ fun stop()
+ val latest: ViewportHint?
+ get() = values.lastOrNull()
+ }
+
+ private class TestCollectionImpl : TestCollection {
+ val job = Job()
+ override val values = mutableListOf<ViewportHint>()
+ override fun stop() {
+ job.cancel()
+ }
+ }
+
+ private fun ViewportHint.Access.copy(
+ pageOffset: Int = this@copy.pageOffset,
+ indexInPage: Int = this@copy.indexInPage,
+ presentedItemsBefore: Int = this@copy.presentedItemsBefore,
+ presentedItemsAfter: Int = this@copy.presentedItemsAfter,
+ originalPageOffsetFirst: Int = this@copy.originalPageOffsetFirst,
+ originalPageOffsetLast: Int = this@copy.originalPageOffsetLast
+ ) = ViewportHint.Access(
+ pageOffset = pageOffset,
+ indexInPage = indexInPage,
+ presentedItemsBefore = presentedItemsBefore,
+ presentedItemsAfter = presentedItemsAfter,
+ originalPageOffsetFirst = originalPageOffsetFirst,
+ originalPageOffsetLast = originalPageOffsetLast
+ )
+}
\ No newline at end of file
diff --git a/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt b/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt
index 756c88a..119b56e 100644
--- a/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt
+++ b/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherSnapshotTest.kt
@@ -713,6 +713,57 @@
}
@Test
+ fun rapidViewportHints() = testScope.runBlockingTest {
+ val config = PagingConfig(
+ pageSize = 10,
+ prefetchDistance = 5,
+ enablePlaceholders = true,
+ initialLoadSize = 10,
+ maxSize = 100
+ )
+ val pageFetcher = PageFetcher(pagingSourceFactory, 0, config)
+ val fetcherState = collectFetcherState(pageFetcher)
+
+ advanceUntilIdle()
+ assertThat(fetcherState.newEvents()).containsExactly(
+ localLoadStateUpdate<Int>(refreshLocal = Loading),
+ createRefresh(0..9, startState = NotLoading.Complete)
+ )
+ pauseDispatcher {
+ val receiver = fetcherState.pagingDataList[0].receiver
+ // send a bunch of access hints while collection is paused
+ (0..9).forEach { pos ->
+ receiver.accessHint(
+ ViewportHint.Access(
+ pageOffset = 0,
+ indexInPage = pos,
+ presentedItemsBefore = pos,
+ presentedItemsAfter = 9 - pos,
+ originalPageOffsetFirst = 0,
+ originalPageOffsetLast = 0
+ )
+ )
+ }
+ }
+
+ advanceUntilIdle()
+ assertThat(fetcherState.newEvents()).containsExactly(
+ localLoadStateUpdate<Int>(
+ appendLocal = Loading,
+ prependLocal = NotLoading.Complete
+ ),
+ createAppend(
+ pageOffset = 1,
+ range = 10..19,
+ startState = NotLoading.Complete,
+ endState = NotLoading.Incomplete
+ ),
+ )
+
+ fetcherState.job.cancel()
+ }
+
+ @Test
fun append() = testScope.runBlockingTest {
val pageFetcher = PageFetcher(pagingSourceFactory, 50, config)
val fetcherState = collectFetcherState(pageFetcher)
@@ -2353,7 +2404,7 @@
assertThat(state.newEvents()).containsExactly(
remoteLoadStateUpdate<Int>(
- refreshRemote = NotLoading.Complete,
+ refreshRemote = NotLoading.Incomplete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
refreshLocal = Loading,
@@ -2368,7 +2419,7 @@
append = NotLoading.Complete,
),
mediator = loadStates(
- refresh = NotLoading.Complete,
+ refresh = NotLoading.Incomplete,
prepend = NotLoading.Complete,
append = NotLoading.Complete,
)
@@ -2416,7 +2467,7 @@
),
remoteLoadStateUpdate<Int>(
refreshLocal = Loading,
- refreshRemote = NotLoading.Complete,
+ refreshRemote = NotLoading.Incomplete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
),
@@ -2434,7 +2485,7 @@
prepend = NotLoading.Complete,
),
mediator = loadStates(
- refresh = NotLoading.Complete,
+ refresh = NotLoading.Incomplete,
append = NotLoading.Complete,
prepend = NotLoading.Complete,
),
@@ -3071,7 +3122,7 @@
appendLocal = NotLoading.Complete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
- refreshRemote = NotLoading.Complete
+ refreshRemote = NotLoading.Incomplete,
),
)
@@ -3444,7 +3495,7 @@
assertTrue { accessHint.shouldPrioritizeOver(initialHint, PREPEND) }
assertFalse { initialHint.shouldPrioritizeOver(accessHint, PREPEND) }
- assertTrue { accessHint.shouldPrioritizeOver(accessHint, APPEND) }
+ assertTrue { accessHint.shouldPrioritizeOver(initialHint, APPEND) }
assertFalse { initialHint.shouldPrioritizeOver(accessHint, APPEND) }
}
diff --git a/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherTest.kt b/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherTest.kt
index e24dcfe..b70fc21 100644
--- a/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherTest.kt
+++ b/paging/paging-common/src/test/kotlin/androidx/paging/PageFetcherTest.kt
@@ -1134,7 +1134,7 @@
// all remote States should be updated within single LoadStateUpdate
remoteLoadStateUpdate<Int>(
refreshLocal = Loading,
- refreshRemote = NotLoading.Complete,
+ refreshRemote = NotLoading.Incomplete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
),
@@ -1148,7 +1148,7 @@
// Remote state carried over from previous generation.
remoteLoadStateUpdate<Int>(
refreshLocal = Loading,
- refreshRemote = NotLoading.Complete,
+ refreshRemote = NotLoading.Incomplete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
),
@@ -1160,7 +1160,7 @@
),
remoteLoadStateUpdate<Int>(
refreshLocal = Loading,
- refreshRemote = NotLoading.Complete,
+ refreshRemote = NotLoading.Incomplete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
),
@@ -1203,7 +1203,7 @@
),
remoteLoadStateUpdate<Int>(
refreshLocal = Loading,
- refreshRemote = NotLoading.Complete,
+ refreshRemote = NotLoading.Incomplete,
prependRemote = NotLoading.Complete,
appendRemote = NotLoading.Complete,
),
@@ -1213,7 +1213,7 @@
prepend = NotLoading.Complete,
),
mediator = loadStates(
- refresh = NotLoading.Complete,
+ refresh = NotLoading.Incomplete,
append = NotLoading.Complete,
prepend = NotLoading.Complete,
),
@@ -1454,7 +1454,7 @@
prepend = NotLoading.Complete,
),
mediator = loadStates(
- refresh = NotLoading.Complete,
+ refresh = NotLoading.Incomplete,
append = NotLoading.Complete,
prepend = NotLoading.Complete,
),
diff --git a/paging/paging-common/src/test/kotlin/androidx/paging/RemoteMediatorAccessorTest.kt b/paging/paging-common/src/test/kotlin/androidx/paging/RemoteMediatorAccessorTest.kt
index b9ce456..3863aee 100644
--- a/paging/paging-common/src/test/kotlin/androidx/paging/RemoteMediatorAccessorTest.kt
+++ b/paging/paging-common/src/test/kotlin/androidx/paging/RemoteMediatorAccessorTest.kt
@@ -229,7 +229,7 @@
// they are waiting for refresh.
assertThat(remoteMediatorAccessor.state.value).isEqualTo(
LoadStates(
- refresh = LoadState.NotLoading.Complete,
+ refresh = LoadState.NotLoading.Incomplete,
prepend = LoadState.NotLoading.Complete,
append = LoadState.NotLoading.Complete
)
diff --git a/paging/paging-compose/build.gradle b/paging/paging-compose/build.gradle
index 0bc5db8..8d4c4db 100644
--- a/paging/paging-compose/build.gradle
+++ b/paging/paging-compose/build.gradle
@@ -41,6 +41,8 @@
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.truth)
+
+ samples(projectOrArtifact(":paging:paging-compose:paging-compose-samples"))
}
androidx {
diff --git a/paging/paging-guava/api/3.1.0-beta01.txt b/paging/paging-guava/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..0bb9b7a
--- /dev/null
+++ b/paging/paging-guava/api/3.1.0-beta01.txt
@@ -0,0 +1,29 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ public final class AdjacentItems<T> {
+ ctor public AdjacentItems(T? before, T? after);
+ method public T? component1();
+ method public T? component2();
+ method public androidx.paging.AdjacentItems<T> copy(T? before, T? after);
+ method public T? getAfter();
+ method public T? getBefore();
+ property public final T? after;
+ property public final T? before;
+ }
+
+ public abstract class ListenableFuturePagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public ListenableFuturePagingSource();
+ method public suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.PagingSource.LoadResult<Key,Value>> loadFuture(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+ public final class PagingDataFutures {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,java.lang.Boolean> predicate, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,java.lang.Iterable<R>> transform, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<androidx.paging.AdjacentItems<T>,R> generator, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,R> transform, java.util.concurrent.Executor executor);
+ }
+
+}
+
diff --git a/paging/paging-guava/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-guava/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..381ebbb4
--- /dev/null
+++ b/paging/paging-guava/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1,37 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ public final class AdjacentItems<T> {
+ ctor public AdjacentItems(T? before, T? after);
+ method public T? component1();
+ method public T? component2();
+ method public androidx.paging.AdjacentItems<T> copy(T? before, T? after);
+ method public T? getAfter();
+ method public T? getBefore();
+ property public final T? after;
+ property public final T? before;
+ }
+
+ public abstract class ListenableFuturePagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public ListenableFuturePagingSource();
+ method public suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.PagingSource.LoadResult<Key,Value>> loadFuture(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+ @androidx.paging.ExperimentalPagingApi public abstract class ListenableFutureRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+ ctor public ListenableFutureRemoteMediator();
+ method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+ method public com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.InitializeAction> initializeFuture();
+ method public final suspend Object? load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.RemoteMediator.MediatorResult> loadFuture(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+ }
+
+ public final class PagingDataFutures {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,java.lang.Boolean> predicate, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,java.lang.Iterable<R>> transform, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<androidx.paging.AdjacentItems<T>,R> generator, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,R> transform, java.util.concurrent.Executor executor);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/paging/paging-guava/api/res-3.1.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to paging/paging-guava/api/res-3.1.0-beta01.txt
diff --git a/paging/paging-guava/api/restricted_3.1.0-beta01.txt b/paging/paging-guava/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..0bb9b7a
--- /dev/null
+++ b/paging/paging-guava/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1,29 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ public final class AdjacentItems<T> {
+ ctor public AdjacentItems(T? before, T? after);
+ method public T? component1();
+ method public T? component2();
+ method public androidx.paging.AdjacentItems<T> copy(T? before, T? after);
+ method public T? getAfter();
+ method public T? getBefore();
+ property public final T? after;
+ property public final T? before;
+ }
+
+ public abstract class ListenableFuturePagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public ListenableFuturePagingSource();
+ method public suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.paging.PagingSource.LoadResult<Key,Value>> loadFuture(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+ public final class PagingDataFutures {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,java.lang.Boolean> predicate, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,java.lang.Iterable<R>> transform, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<androidx.paging.AdjacentItems<T>,R> generator, java.util.concurrent.Executor executor);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, com.google.common.util.concurrent.AsyncFunction<T,R> transform, java.util.concurrent.Executor executor);
+ }
+
+}
+
diff --git a/paging/paging-guava/build.gradle b/paging/paging-guava/build.gradle
index 0b21de1..faee59a 100644
--- a/paging/paging-guava/build.gradle
+++ b/paging/paging-guava/build.gradle
@@ -35,6 +35,8 @@
testImplementation(libs.junit)
testImplementation(libs.kotlinTest)
testImplementation(libs.kotlinCoroutinesTest)
+
+ samples(project(":paging:paging-samples"))
}
androidx {
diff --git a/paging/paging-runtime-ktx/api/3.1.0-beta01.txt b/paging/paging-runtime-ktx/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-runtime-ktx/api/3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-runtime-ktx/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-runtime-ktx/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-runtime-ktx/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/paging/paging-runtime-ktx/api/res-3.1.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to paging/paging-runtime-ktx/api/res-3.1.0-beta01.txt
diff --git a/paging/paging-runtime-ktx/api/restricted_3.1.0-beta01.txt b/paging/paging-runtime-ktx/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-runtime-ktx/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-runtime/api/3.1.0-beta01.txt b/paging/paging-runtime/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..4fcb026
--- /dev/null
+++ b/paging/paging-runtime/api/3.1.0-beta01.txt
@@ -0,0 +1,139 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ @Deprecated public class AsyncPagedListDiffer<T> {
+ ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+ method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+ method @Deprecated public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+ method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+ method @Deprecated public T? getItem(int index);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+ method @Deprecated public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+ property public androidx.paging.PagedList<T>? currentList;
+ property public int itemCount;
+ }
+
+ @Deprecated public static interface AsyncPagedListDiffer.PagedListListener<T> {
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+ }
+
+ public final class AsyncPagingDataDiffer<T> {
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher, optional kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public void addOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public T? getItem(@IntRange(from=0) int index);
+ method public int getItemCount();
+ method public kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+ method public kotlinx.coroutines.flow.Flow<kotlin.Unit> getOnPagesUpdatedFlow();
+ method public T? peek(@IntRange(from=0) int index);
+ method public void refresh();
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public void removeOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public void retry();
+ method public androidx.paging.ItemSnapshotList<T> snapshot();
+ method public suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+ property public final int itemCount;
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+ property public final kotlinx.coroutines.flow.Flow<kotlin.Unit> onPagesUpdatedFlow;
+ }
+
+ @Deprecated public final class LivePagedListBuilder<Key, Value> {
+ ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ method @Deprecated public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ }
+
+ public final class LivePagedListKt {
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional kotlinx.coroutines.CoroutineScope coroutineScope, optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional kotlinx.coroutines.CoroutineScope coroutineScope, optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ }
+
+ public abstract class LoadStateAdapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor public LoadStateAdapter();
+ method public boolean displayLoadStateAsItem(androidx.paging.LoadState loadState);
+ method public final int getItemCount();
+ method public final int getItemViewType(int position);
+ method public final androidx.paging.LoadState getLoadState();
+ method public int getStateViewType(androidx.paging.LoadState loadState);
+ method public final void onBindViewHolder(VH holder, int position);
+ method public abstract void onBindViewHolder(VH holder, androidx.paging.LoadState loadState);
+ method public final VH onCreateViewHolder(android.view.ViewGroup parent, int viewType);
+ method public abstract VH onCreateViewHolder(android.view.ViewGroup parent, androidx.paging.LoadState loadState);
+ method public final void setLoadState(androidx.paging.LoadState loadState);
+ property public final androidx.paging.LoadState loadState;
+ }
+
+ public final class NullPaddedListDiffHelperKt {
+ }
+
+ @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+ method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+ method @Deprecated protected T? getItem(int position);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+ method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+ property public androidx.paging.PagedList<T>? currentList;
+ }
+
+ public abstract class PagingDataAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher, optional kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ method public final void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public final void addOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method protected final T? getItem(@IntRange(from=0) int position);
+ method public int getItemCount();
+ method public final long getItemId(int position);
+ method public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+ method public final kotlinx.coroutines.flow.Flow<kotlin.Unit> getOnPagesUpdatedFlow();
+ method public final T? peek(@IntRange(from=0) int index);
+ method public final void refresh();
+ method public final void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public final void removeOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public final void retry();
+ method public final void setHasStableIds(boolean hasStableIds);
+ method public final androidx.paging.ItemSnapshotList<T> snapshot();
+ method public final suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public final void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+ property public final kotlinx.coroutines.flow.Flow<kotlin.Unit> onPagesUpdatedFlow;
+ }
+
+ public final class PagingLiveData {
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.Lifecycle lifecycle);
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.ViewModel viewModel);
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagingData<Value>> getLiveData(androidx.paging.Pager<Key,Value>);
+ }
+
+}
+
diff --git a/paging/paging-runtime/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-runtime/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..4fcb026
--- /dev/null
+++ b/paging/paging-runtime/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1,139 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ @Deprecated public class AsyncPagedListDiffer<T> {
+ ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+ method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+ method @Deprecated public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+ method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+ method @Deprecated public T? getItem(int index);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+ method @Deprecated public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+ property public androidx.paging.PagedList<T>? currentList;
+ property public int itemCount;
+ }
+
+ @Deprecated public static interface AsyncPagedListDiffer.PagedListListener<T> {
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+ }
+
+ public final class AsyncPagingDataDiffer<T> {
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher, optional kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public void addOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public T? getItem(@IntRange(from=0) int index);
+ method public int getItemCount();
+ method public kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+ method public kotlinx.coroutines.flow.Flow<kotlin.Unit> getOnPagesUpdatedFlow();
+ method public T? peek(@IntRange(from=0) int index);
+ method public void refresh();
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public void removeOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public void retry();
+ method public androidx.paging.ItemSnapshotList<T> snapshot();
+ method public suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+ property public final int itemCount;
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+ property public final kotlinx.coroutines.flow.Flow<kotlin.Unit> onPagesUpdatedFlow;
+ }
+
+ @Deprecated public final class LivePagedListBuilder<Key, Value> {
+ ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ method @Deprecated public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ }
+
+ public final class LivePagedListKt {
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional kotlinx.coroutines.CoroutineScope coroutineScope, optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional kotlinx.coroutines.CoroutineScope coroutineScope, optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ }
+
+ public abstract class LoadStateAdapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor public LoadStateAdapter();
+ method public boolean displayLoadStateAsItem(androidx.paging.LoadState loadState);
+ method public final int getItemCount();
+ method public final int getItemViewType(int position);
+ method public final androidx.paging.LoadState getLoadState();
+ method public int getStateViewType(androidx.paging.LoadState loadState);
+ method public final void onBindViewHolder(VH holder, int position);
+ method public abstract void onBindViewHolder(VH holder, androidx.paging.LoadState loadState);
+ method public final VH onCreateViewHolder(android.view.ViewGroup parent, int viewType);
+ method public abstract VH onCreateViewHolder(android.view.ViewGroup parent, androidx.paging.LoadState loadState);
+ method public final void setLoadState(androidx.paging.LoadState loadState);
+ property public final androidx.paging.LoadState loadState;
+ }
+
+ public final class NullPaddedListDiffHelperKt {
+ }
+
+ @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+ method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+ method @Deprecated protected T? getItem(int position);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+ method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+ property public androidx.paging.PagedList<T>? currentList;
+ }
+
+ public abstract class PagingDataAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher, optional kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ method public final void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public final void addOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method protected final T? getItem(@IntRange(from=0) int position);
+ method public int getItemCount();
+ method public final long getItemId(int position);
+ method public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+ method public final kotlinx.coroutines.flow.Flow<kotlin.Unit> getOnPagesUpdatedFlow();
+ method public final T? peek(@IntRange(from=0) int index);
+ method public final void refresh();
+ method public final void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public final void removeOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public final void retry();
+ method public final void setHasStableIds(boolean hasStableIds);
+ method public final androidx.paging.ItemSnapshotList<T> snapshot();
+ method public final suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public final void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+ property public final kotlinx.coroutines.flow.Flow<kotlin.Unit> onPagesUpdatedFlow;
+ }
+
+ public final class PagingLiveData {
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.Lifecycle lifecycle);
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.ViewModel viewModel);
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagingData<Value>> getLiveData(androidx.paging.Pager<Key,Value>);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/paging/paging-runtime/api/res-3.1.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to paging/paging-runtime/api/res-3.1.0-beta01.txt
diff --git a/paging/paging-runtime/api/restricted_3.1.0-beta01.txt b/paging/paging-runtime/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..4fcb026
--- /dev/null
+++ b/paging/paging-runtime/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1,139 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ @Deprecated public class AsyncPagedListDiffer<T> {
+ ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.RecyclerView.Adapter<?> adapter, androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ ctor @Deprecated public AsyncPagedListDiffer(androidx.recyclerview.widget.ListUpdateCallback listUpdateCallback, androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+ method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void addPagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+ method @Deprecated public final void addPagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+ method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+ method @Deprecated public T? getItem(int index);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void removePagedListListener(androidx.paging.AsyncPagedListDiffer.PagedListListener<T> listener);
+ method @Deprecated public final void removePagedListListener(kotlin.jvm.functions.Function2<? super androidx.paging.PagedList<T>,? super androidx.paging.PagedList<T>,kotlin.Unit> callback);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+ property public androidx.paging.PagedList<T>? currentList;
+ property public int itemCount;
+ }
+
+ @Deprecated public static interface AsyncPagedListDiffer.PagedListListener<T> {
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+ }
+
+ public final class AsyncPagingDataDiffer<T> {
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher, optional kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+ ctor public AsyncPagingDataDiffer(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, androidx.recyclerview.widget.ListUpdateCallback updateCallback);
+ method public void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public void addOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public T? getItem(@IntRange(from=0) int index);
+ method public int getItemCount();
+ method public kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+ method public kotlinx.coroutines.flow.Flow<kotlin.Unit> getOnPagesUpdatedFlow();
+ method public T? peek(@IntRange(from=0) int index);
+ method public void refresh();
+ method public void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public void removeOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public void retry();
+ method public androidx.paging.ItemSnapshotList<T> snapshot();
+ method public suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+ property public final int itemCount;
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+ property public final kotlinx.coroutines.flow.Flow<kotlin.Unit> onPagesUpdatedFlow;
+ }
+
+ @Deprecated public final class LivePagedListBuilder<Key, Value> {
+ ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public LivePagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public LivePagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ method @Deprecated public androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> build();
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setCoroutineScope(kotlinx.coroutines.CoroutineScope coroutineScope);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setFetchExecutor(java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public androidx.paging.LivePagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ }
+
+ public final class LivePagedListKt {
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional java.util.concurrent.Executor fetchExecutor);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional kotlinx.coroutines.CoroutineScope coroutineScope, optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ method @Deprecated public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagedList<Value>> toLiveData(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional kotlinx.coroutines.CoroutineScope coroutineScope, optional kotlinx.coroutines.CoroutineDispatcher fetchDispatcher);
+ }
+
+ public abstract class LoadStateAdapter<VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor public LoadStateAdapter();
+ method public boolean displayLoadStateAsItem(androidx.paging.LoadState loadState);
+ method public final int getItemCount();
+ method public final int getItemViewType(int position);
+ method public final androidx.paging.LoadState getLoadState();
+ method public int getStateViewType(androidx.paging.LoadState loadState);
+ method public final void onBindViewHolder(VH holder, int position);
+ method public abstract void onBindViewHolder(VH holder, androidx.paging.LoadState loadState);
+ method public final VH onCreateViewHolder(android.view.ViewGroup parent, int viewType);
+ method public abstract VH onCreateViewHolder(android.view.ViewGroup parent, androidx.paging.LoadState loadState);
+ method public final void setLoadState(androidx.paging.LoadState loadState);
+ property public final androidx.paging.LoadState loadState;
+ }
+
+ public final class NullPaddedListDiffHelperKt {
+ }
+
+ @Deprecated public abstract class PagedListAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ ctor @Deprecated protected PagedListAdapter(androidx.recyclerview.widget.AsyncDifferConfig<T> config);
+ method @Deprecated public void addLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public androidx.paging.PagedList<T>? getCurrentList();
+ method @Deprecated protected T? getItem(int position);
+ method @Deprecated public int getItemCount();
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? currentList);
+ method @Deprecated public void onCurrentListChanged(androidx.paging.PagedList<T>? previousList, androidx.paging.PagedList<T>? currentList);
+ method @Deprecated public void removeLoadStateListener(kotlin.jvm.functions.Function2<? super androidx.paging.LoadType,? super androidx.paging.LoadState,kotlin.Unit> listener);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList);
+ method @Deprecated public void submitList(androidx.paging.PagedList<T>? pagedList, Runnable? commitCallback);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+ method @Deprecated public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+ property public androidx.paging.PagedList<T>? currentList;
+ }
+
+ public abstract class PagingDataAdapter<T, VH extends androidx.recyclerview.widget.RecyclerView.ViewHolder> extends androidx.recyclerview.widget.RecyclerView.Adapter<VH> {
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher, optional kotlinx.coroutines.CoroutineDispatcher workerDispatcher);
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback, optional kotlinx.coroutines.CoroutineDispatcher mainDispatcher);
+ ctor public PagingDataAdapter(androidx.recyclerview.widget.DiffUtil.ItemCallback<T> diffCallback);
+ method public final void addLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public final void addOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method protected final T? getItem(@IntRange(from=0) int position);
+ method public int getItemCount();
+ method public final long getItemId(int position);
+ method public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> getLoadStateFlow();
+ method public final kotlinx.coroutines.flow.Flow<kotlin.Unit> getOnPagesUpdatedFlow();
+ method public final T? peek(@IntRange(from=0) int index);
+ method public final void refresh();
+ method public final void removeLoadStateListener(kotlin.jvm.functions.Function1<? super androidx.paging.CombinedLoadStates,kotlin.Unit> listener);
+ method public final void removeOnPagesUpdatedListener(kotlin.jvm.functions.Function0<kotlin.Unit> listener);
+ method public final void retry();
+ method public final void setHasStableIds(boolean hasStableIds);
+ method public final androidx.paging.ItemSnapshotList<T> snapshot();
+ method public final suspend Object? submitData(androidx.paging.PagingData<T> pagingData, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public final void submitData(androidx.lifecycle.Lifecycle lifecycle, androidx.paging.PagingData<T> pagingData);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateFooter(androidx.paging.LoadStateAdapter<?> footer);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeader(androidx.paging.LoadStateAdapter<?> header);
+ method public final androidx.recyclerview.widget.ConcatAdapter withLoadStateHeaderAndFooter(androidx.paging.LoadStateAdapter<?> header, androidx.paging.LoadStateAdapter<?> footer);
+ property public final kotlinx.coroutines.flow.Flow<androidx.paging.CombinedLoadStates> loadStateFlow;
+ property public final kotlinx.coroutines.flow.Flow<kotlin.Unit> onPagesUpdatedFlow;
+ }
+
+ public final class PagingLiveData {
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.Lifecycle lifecycle);
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, androidx.lifecycle.ViewModel viewModel);
+ method public static <T> androidx.lifecycle.LiveData<androidx.paging.PagingData<T>> cachedIn(androidx.lifecycle.LiveData<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method public static <Key, Value> androidx.lifecycle.LiveData<androidx.paging.PagingData<Value>> getLiveData(androidx.paging.Pager<Key,Value>);
+ }
+
+}
+
diff --git a/paging/paging-runtime/build.gradle b/paging/paging-runtime/build.gradle
index 32d8093..88add9b 100644
--- a/paging/paging-runtime/build.gradle
+++ b/paging/paging-runtime/build.gradle
@@ -56,6 +56,8 @@
androidTestImplementation(libs.kotlinCoroutinesTest)
androidTestImplementation(libs.junit)
androidTestImplementation(libs.multidex)
+
+ samples(project(":paging:paging-samples"))
}
androidx {
diff --git a/paging/paging-rxjava2-ktx/api/3.1.0-beta01.txt b/paging/paging-rxjava2-ktx/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-rxjava2-ktx/api/3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-rxjava2-ktx/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-rxjava2-ktx/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-rxjava2-ktx/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/paging/paging-rxjava2-ktx/api/res-3.1.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to paging/paging-rxjava2-ktx/api/res-3.1.0-beta01.txt
diff --git a/paging/paging-rxjava2-ktx/api/restricted_3.1.0-beta01.txt b/paging/paging-rxjava2-ktx/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/paging/paging-rxjava2-ktx/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/paging/paging-rxjava2/api/3.1.0-beta01.txt b/paging/paging-rxjava2/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..afe197e
--- /dev/null
+++ b/paging/paging-rxjava2/api/3.1.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ @Deprecated public final class RxPagedListBuilder<Key, Value> {
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method @Deprecated public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
+ }
+
+ public final class RxPagedListKt {
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ }
+
+}
+
+package androidx.paging.rxjava2 {
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<R>> transform);
+ }
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<R>> transform);
+ }
+
+ public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public RxPagingSource();
+ method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract io.reactivex.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+}
+
diff --git a/paging/paging-rxjava2/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-rxjava2/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..89bd6c6
--- /dev/null
+++ b/paging/paging-rxjava2/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1,69 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ @Deprecated public final class RxPagedListBuilder<Key, Value> {
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method @Deprecated public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
+ }
+
+ public final class RxPagedListKt {
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ }
+
+}
+
+package androidx.paging.rxjava2 {
+
+ public final class PagingRx {
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<R>> transform);
+ }
+
+ public final class PagingRx {
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<R>> transform);
+ }
+
+ public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public RxPagingSource();
+ method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract io.reactivex.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+ @androidx.paging.ExperimentalPagingApi public abstract class RxRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+ ctor public RxRemoteMediator();
+ method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+ method public io.reactivex.Single<androidx.paging.RemoteMediator.InitializeAction> initializeSingle();
+ method public final suspend Object? load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+ method public abstract io.reactivex.Single<androidx.paging.RemoteMediator.MediatorResult> loadSingle(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/paging/paging-rxjava2/api/res-3.1.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to paging/paging-rxjava2/api/res-3.1.0-beta01.txt
diff --git a/paging/paging-rxjava2/api/restricted_3.1.0-beta01.txt b/paging/paging-rxjava2/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..afe197e
--- /dev/null
+++ b/paging/paging-rxjava2/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1,57 @@
+// Signature format: 4.0
+package androidx.paging {
+
+ @Deprecated public final class RxPagedListBuilder<Key, Value> {
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method @Deprecated public io.reactivex.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public io.reactivex.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.Scheduler scheduler);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method @Deprecated public androidx.paging.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.Scheduler scheduler);
+ }
+
+ public final class RxPagedListKt {
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler, optional io.reactivex.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.Scheduler? fetchScheduler, optional io.reactivex.Scheduler? notifyScheduler);
+ }
+
+}
+
+package androidx.paging.rxjava2 {
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<R>> transform);
+ }
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.Single<R>> transform);
+ }
+
+ public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public RxPagingSource();
+ method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract io.reactivex.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+}
+
diff --git a/paging/paging-rxjava2/build.gradle b/paging/paging-rxjava2/build.gradle
index 459bc18..22b5a44 100644
--- a/paging/paging-rxjava2/build.gradle
+++ b/paging/paging-rxjava2/build.gradle
@@ -43,6 +43,8 @@
androidTestImplementation(libs.testCore)
androidTestImplementation(libs.testRunner)
androidTestImplementation("androidx.arch.core:core-testing:2.1.0")
+
+ samples(project(":paging:paging-samples"))
}
androidx {
diff --git a/paging/paging-rxjava3/api/3.1.0-beta01.txt b/paging/paging-rxjava3/api/3.1.0-beta01.txt
new file mode 100644
index 0000000..304fe98
--- /dev/null
+++ b/paging/paging-rxjava3/api/3.1.0-beta01.txt
@@ -0,0 +1,53 @@
+// Signature format: 4.0
+package androidx.paging.rxjava3 {
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.rxjava3.core.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
+ }
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.rxjava3.core.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
+ }
+
+ @Deprecated public final class RxPagedListBuilder<Key, Value> {
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method @Deprecated public io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+ }
+
+ public final class RxPagedListKt {
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ }
+
+ public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public RxPagingSource();
+ method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract io.reactivex.rxjava3.core.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+}
+
diff --git a/paging/paging-rxjava3/api/public_plus_experimental_3.1.0-beta01.txt b/paging/paging-rxjava3/api/public_plus_experimental_3.1.0-beta01.txt
new file mode 100644
index 0000000..f847113
--- /dev/null
+++ b/paging/paging-rxjava3/api/public_plus_experimental_3.1.0-beta01.txt
@@ -0,0 +1,65 @@
+// Signature format: 4.0
+package androidx.paging.rxjava3 {
+
+ public final class PagingRx {
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.rxjava3.core.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
+ }
+
+ public final class PagingRx {
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @kotlinx.coroutines.ExperimentalCoroutinesApi public static <T> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<T>> cachedIn(io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<T>>, kotlinx.coroutines.CoroutineScope scope);
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.rxjava3.core.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
+ }
+
+ @Deprecated public final class RxPagedListBuilder<Key, Value> {
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method @Deprecated public io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+ }
+
+ public final class RxPagedListKt {
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ }
+
+ public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public RxPagingSource();
+ method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract io.reactivex.rxjava3.core.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+ @androidx.paging.ExperimentalPagingApi public abstract class RxRemoteMediator<Key, Value> extends androidx.paging.RemoteMediator<Key,Value> {
+ ctor public RxRemoteMediator();
+ method public final suspend Object? initialize(kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.InitializeAction> p);
+ method public io.reactivex.rxjava3.core.Single<androidx.paging.RemoteMediator.InitializeAction> initializeSingle();
+ method public final suspend Object? load(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state, kotlin.coroutines.Continuation<? super androidx.paging.RemoteMediator.MediatorResult> p);
+ method public abstract io.reactivex.rxjava3.core.Single<androidx.paging.RemoteMediator.MediatorResult> loadSingle(androidx.paging.LoadType loadType, androidx.paging.PagingState<Key,Value> state);
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/paging/paging-rxjava3/api/res-3.1.0-beta01.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to paging/paging-rxjava3/api/res-3.1.0-beta01.txt
diff --git a/paging/paging-rxjava3/api/restricted_3.1.0-beta01.txt b/paging/paging-rxjava3/api/restricted_3.1.0-beta01.txt
new file mode 100644
index 0000000..304fe98
--- /dev/null
+++ b/paging/paging-rxjava3/api/restricted_3.1.0-beta01.txt
@@ -0,0 +1,53 @@
+// Signature format: 4.0
+package androidx.paging.rxjava3 {
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.rxjava3.core.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
+ }
+
+ public final class PagingRx {
+ method @CheckResult public static <T> androidx.paging.PagingData<T> filter(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Boolean>> predicate);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> flatMap(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<java.lang.Iterable<R>>> transform);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagingData<Value>> getFlowable(androidx.paging.Pager<Key,Value>);
+ method public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagingData<Value>> getObservable(androidx.paging.Pager<Key,Value>);
+ method @CheckResult public static <T extends R, R> androidx.paging.PagingData<R> insertSeparators(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function2<? super T,? super T,? extends io.reactivex.rxjava3.core.Maybe<R>> generator);
+ method @CheckResult public static <T, R> androidx.paging.PagingData<R> map(androidx.paging.PagingData<T>, kotlin.jvm.functions.Function1<? super T,? extends io.reactivex.rxjava3.core.Single<R>> transform);
+ }
+
+ @Deprecated public final class RxPagedListBuilder<Key, Value> {
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>> pagingSourceFactory, int pageSize);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, androidx.paging.PagedList.Config config);
+ ctor @Deprecated public RxPagedListBuilder(androidx.paging.DataSource.Factory<Key,Value> dataSourceFactory, int pageSize);
+ method @Deprecated public io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> buildFlowable(io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> buildObservable();
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setBoundaryCallback(androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setFetchScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setInitialLoadKey(Key? key);
+ method @Deprecated public androidx.paging.rxjava3.RxPagedListBuilder<Key,Value> setNotifyScheduler(io.reactivex.rxjava3.core.Scheduler scheduler);
+ }
+
+ public final class RxPagedListKt {
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Flowable<androidx.paging.PagedList<Value>> toFlowable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler, optional io.reactivex.rxjava3.core.BackpressureStrategy backpressureStrategy);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(androidx.paging.DataSource.Factory<Key,Value>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, androidx.paging.PagedList.Config config, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ method @Deprecated public static <Key, Value> io.reactivex.rxjava3.core.Observable<androidx.paging.PagedList<Value>> toObservable(kotlin.jvm.functions.Function0<? extends androidx.paging.PagingSource<Key,Value>>, int pageSize, optional Key? initialLoadKey, optional androidx.paging.PagedList.BoundaryCallback<Value>? boundaryCallback, optional io.reactivex.rxjava3.core.Scheduler? fetchScheduler, optional io.reactivex.rxjava3.core.Scheduler? notifyScheduler);
+ }
+
+ public abstract class RxPagingSource<Key, Value> extends androidx.paging.PagingSource<Key,Value> {
+ ctor public RxPagingSource();
+ method public final suspend Object? load(androidx.paging.PagingSource.LoadParams<Key> params, kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>> p);
+ method public abstract io.reactivex.rxjava3.core.Single<androidx.paging.PagingSource.LoadResult<Key,Value>> loadSingle(androidx.paging.PagingSource.LoadParams<Key> params);
+ }
+
+}
+
diff --git a/playground-common/gradlew.bat b/playground-common/gradlew.bat
index ac1b06f..107acd3 100644
--- a/playground-common/gradlew.bat
+++ b/playground-common/gradlew.bat
@@ -1,89 +1,89 @@
-@rem
-@rem Copyright 2015 the original author or authors.
-@rem
-@rem Licensed under the Apache License, Version 2.0 (the "License");
-@rem you may not use this file except in compliance with the License.
-@rem You may obtain a copy of the License at
-@rem
-@rem https://www.apache.org/licenses/LICENSE-2.0
-@rem
-@rem Unless required by applicable law or agreed to in writing, software
-@rem distributed under the License is distributed on an "AS IS" BASIS,
-@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-@rem See the License for the specific language governing permissions and
-@rem limitations under the License.
-@rem
-
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Resolve any "." and ".." in APP_HOME to make it shorter.
-for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto execute
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto execute
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Resolve any "." and ".." in APP_HOME to make it shorter.
+for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto execute
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/playground-common/playground.properties b/playground-common/playground.properties
index b8e90bc..2510bf3 100644
--- a/playground-common/playground.properties
+++ b/playground-common/playground.properties
@@ -26,7 +26,7 @@
kotlin.code.style=official
# Disable docs
androidx.enableDocumentation=false
-androidx.playground.snapshotBuildId=7680668
+androidx.playground.snapshotBuildId=7782543
androidx.playground.metalavaBuildId=7743859
androidx.playground.dokkaBuildId=7472101
androidx.studio.type=playground
diff --git a/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt b/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt
index 8c3cebc..ed2d6be 100644
--- a/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt
+++ b/profileinstaller/profileinstaller-benchmark/src/androidTest/java/androidx/profileinstaller/benchmark/ProfileInstallerTranscodeBenchmark.kt
@@ -66,6 +66,7 @@
Diagnostics(),
APK_NAME,
PROFILE_LOCATION,
+ PROFILE_META_LOCATION,
mTempCurFile!!
).also(block)
}
@@ -80,6 +81,7 @@
Diagnostics(),
APK_NAME,
PROFILE_LOCATION,
+ PROFILE_META_LOCATION,
mTempCurFile!!
)
assumeTrue(
@@ -97,6 +99,7 @@
Diagnostics(),
APK_NAME,
PROFILE_LOCATION,
+ PROFILE_META_LOCATION,
mTempCurFile!!
)
benchmarkRule.measureRepeated {
@@ -153,6 +156,7 @@
Diagnostics(),
APK_NAME,
PROFILE_LOCATION,
+ PROFILE_META_LOCATION,
mTempCurFile!!
)
transcoder.deviceAllowsProfileInstallerAotWrites()
@@ -165,6 +169,7 @@
companion object {
const val PROFILE_LOCATION = "golden/profileinstaller.prof"
+ const val PROFILE_META_LOCATION = "golden/profileinstaller.profm"
}
class Diagnostics : ProfileInstaller.DiagnosticsCallback {
diff --git a/profileinstaller/profileinstaller/api/current.txt b/profileinstaller/profileinstaller/api/current.txt
index 80c25f8..4fb75af 100644
--- a/profileinstaller/profileinstaller/api/current.txt
+++ b/profileinstaller/profileinstaller/api/current.txt
@@ -19,6 +19,7 @@
field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+ field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
diff --git a/profileinstaller/profileinstaller/api/public_plus_experimental_current.txt b/profileinstaller/profileinstaller/api/public_plus_experimental_current.txt
index 80c25f8..4fb75af 100644
--- a/profileinstaller/profileinstaller/api/public_plus_experimental_current.txt
+++ b/profileinstaller/profileinstaller/api/public_plus_experimental_current.txt
@@ -19,6 +19,7 @@
field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+ field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
diff --git a/profileinstaller/profileinstaller/api/restricted_current.txt b/profileinstaller/profileinstaller/api/restricted_current.txt
index 80c25f8..4fb75af 100644
--- a/profileinstaller/profileinstaller/api/restricted_current.txt
+++ b/profileinstaller/profileinstaller/api/restricted_current.txt
@@ -19,6 +19,7 @@
field public static final int RESULT_DESIRED_FORMAT_UNSUPPORTED = 5; // 0x5
field public static final int RESULT_INSTALL_SUCCESS = 1; // 0x1
field public static final int RESULT_IO_EXCEPTION = 7; // 0x7
+ field public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9; // 0x9
field public static final int RESULT_NOT_WRITABLE = 4; // 0x4
field public static final int RESULT_PARSE_EXCEPTION = 8; // 0x8
field public static final int RESULT_UNSUPPORTED_ART_VERSION = 3; // 0x3
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DeviceProfileWriter.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DeviceProfileWriter.java
index 23ef5e8..5b50458 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DeviceProfileWriter.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DeviceProfileWriter.java
@@ -16,6 +16,9 @@
package androidx.profileinstaller;
+import static androidx.profileinstaller.ProfileTranscoder.MAGIC_PROF;
+import static androidx.profileinstaller.ProfileTranscoder.MAGIC_PROFM;
+
import android.content.res.AssetFileDescriptor;
import android.content.res.AssetManager;
import android.os.Build;
@@ -72,6 +75,8 @@
private final String mApkName;
@NonNull
private final String mProfileSourceLocation;
+ @NonNull
+ private final String mProfileMetaSourceLocation;
private boolean mDeviceSupportsAotProfile = false;
@Nullable
private DexProfileData[] mProfile;
@@ -86,17 +91,21 @@
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY)
- public DeviceProfileWriter(@NonNull AssetManager assetManager,
+ public DeviceProfileWriter(
+ @NonNull AssetManager assetManager,
@NonNull Executor executor,
@NonNull ProfileInstaller.DiagnosticsCallback diagnosticsCallback,
@NonNull String apkName,
@NonNull String profileSourceLocation,
- @NonNull File curProfile) {
+ @NonNull String profileMetaSourceLocation,
+ @NonNull File curProfile
+ ) {
mAssetManager = assetManager;
mExecutor = executor;
mDiagnostics = diagnosticsCallback;
mApkName = apkName;
mProfileSourceLocation = profileSourceLocation;
+ mProfileMetaSourceLocation = profileMetaSourceLocation;
mCurProfile = curProfile;
mDesiredVersion = desiredVersion();
}
@@ -153,9 +162,8 @@
}
try (AssetFileDescriptor fd = mAssetManager.openFd(mProfileSourceLocation)) {
try (InputStream is = fd.createInputStream()) {
- byte[] baselineVersion = ProfileTranscoder.readHeader(is);
+ byte[] baselineVersion = ProfileTranscoder.readHeader(is, MAGIC_PROF);
mProfile = ProfileTranscoder.readProfile(is, baselineVersion, mApkName);
- return this;
}
} catch (FileNotFoundException e) {
mDiagnostics.onResultReceived(ProfileInstaller.RESULT_BASELINE_PROFILE_NOT_FOUND, e);
@@ -164,6 +172,29 @@
} catch (IllegalStateException e) {
mDiagnostics.onResultReceived(ProfileInstaller.RESULT_PARSE_EXCEPTION, e);
}
+ DexProfileData[] profile = mProfile;
+ if (profile != null && requiresMetadata()) {
+ try (AssetFileDescriptor fd = mAssetManager.openFd(mProfileMetaSourceLocation)) {
+ try (InputStream is = fd.createInputStream()) {
+ byte[] metaVersion = ProfileTranscoder.readHeader(is, MAGIC_PROFM);
+ mProfile = ProfileTranscoder.readMeta(
+ is,
+ metaVersion,
+ profile
+ );
+ return this;
+ }
+ } catch (FileNotFoundException e) {
+ mDiagnostics.onResultReceived(
+ ProfileInstaller.RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND,
+ e
+ );
+ } catch (IOException e) {
+ mDiagnostics.onResultReceived(ProfileInstaller.RESULT_IO_EXCEPTION, e);
+ } catch (IllegalStateException e) {
+ mDiagnostics.onResultReceived(ProfileInstaller.RESULT_PARSE_EXCEPTION, e);
+ }
+ }
return this;
}
@@ -277,4 +308,30 @@
return null;
}
}
+
+ private static boolean requiresMetadata() {
+ // If SDK is pre-N, we don't want to do anything, so return null.
+ if (Build.VERSION.SDK_INT < ProfileVersion.MIN_SUPPORTED_SDK) {
+ return false;
+ }
+
+ switch (Build.VERSION.SDK_INT) {
+ // The profiles for N and N_MR1 used class ids to identify classes instead of type
+ // ids, which is what the V0.1.0 profile encodes, so a metadata file is required in
+ // order to transcode to this profile.
+ case Build.VERSION_CODES.N:
+ case Build.VERSION_CODES.N_MR1:
+ return true;
+
+ // for all of these versions, the data encoded in the V0.1.0 profile is enough to
+ // losslessly transcode into these other formats.
+ case Build.VERSION_CODES.O:
+ case Build.VERSION_CODES.O_MR1:
+ case Build.VERSION_CODES.P:
+ case Build.VERSION_CODES.Q:
+ case Build.VERSION_CODES.R:
+ default:
+ return false;
+ }
+ }
}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java
index ec659b7..840dc13 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/DexProfileData.java
@@ -18,8 +18,7 @@
import androidx.annotation.NonNull;
-import java.util.HashMap;
-import java.util.HashSet;
+import java.util.TreeMap;
class DexProfileData {
@NonNull
@@ -27,13 +26,12 @@
@NonNull
final String dexName;
final long dexChecksum;
- final int classSetSize;
+ int classSetSize;
final int hotMethodRegionSize;
final int numMethodIds;
+ @NonNull int[] classes;
final @NonNull
- HashSet<Integer> classes;
- final @NonNull
- HashMap<Integer, Integer> methods;
+ TreeMap<Integer, Integer> methods;
DexProfileData(
@NonNull String apkName,
@@ -42,8 +40,8 @@
int classSetSize,
int hotMethodRegionSize,
int numMethodIds,
- @NonNull HashSet<Integer> classes,
- @NonNull HashMap<Integer, Integer> methods
+ @NonNull int[] classes,
+ @NonNull TreeMap<Integer, Integer> methods
) {
this.apkName = apkName;
this.dexName = dexName;
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
index 920f9ab..4312dd1 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileInstaller.java
@@ -56,6 +56,7 @@
private static final String PROFILE_BASE_DIR = "/data/misc/profiles/cur/0";
private static final String PROFILE_FILE = "primary.prof";
private static final String PROFILE_SOURCE_LOCATION = "dexopt/baseline.prof";
+ private static final String PROFILE_META_LOCATION = "dexopt/baseline.profm";
private static final String PROFILE_INSTALLER_SKIP_FILE_NAME =
"profileinstaller_profileWrittenFor_lastUpdateTime.dat";
@@ -225,7 +226,8 @@
RESULT_DESIRED_FORMAT_UNSUPPORTED,
RESULT_BASELINE_PROFILE_NOT_FOUND,
RESULT_IO_EXCEPTION,
- RESULT_PARSE_EXCEPTION
+ RESULT_PARSE_EXCEPTION,
+ RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND
})
public @interface ResultCode {}
@@ -280,6 +282,12 @@
@ResultCode public static final int RESULT_PARSE_EXCEPTION = 8;
/**
+ * Indicates that the device requires a metadata file in order to install the profile
+ * successfully, but there was not one included in the APK.
+ */
+ @ResultCode public static final int RESULT_META_FILE_REQUIRED_BUT_NOT_FOUND = 9;
+
+ /**
* Check if we've already installed a profile for this app installation.
*
* @hide
@@ -352,7 +360,7 @@
File curProfile = new File(new File(PROFILE_BASE_DIR, packageName), PROFILE_FILE);
DeviceProfileWriter deviceProfileWriter = new DeviceProfileWriter(assets, executor,
- diagnostics, apkName, PROFILE_SOURCE_LOCATION, curProfile);
+ diagnostics, apkName, PROFILE_SOURCE_LOCATION, PROFILE_META_LOCATION, curProfile);
if (!deviceProfileWriter.deviceAllowsProfileInstallerAotWrites()) {
return; /* nothing else to do here */
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java
index ba49125..8dccf9b 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileTranscoder.java
@@ -47,6 +47,8 @@
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
+import java.util.TreeMap;
+import java.util.TreeSet;
@RequiresApi(19)
class ProfileTranscoder {
@@ -59,11 +61,12 @@
private static final int INLINE_CACHE_MISSING_TYPES_ENCODING = 6;
private static final int INLINE_CACHE_MEGAMORPHIC_ENCODING = 7;
- static final byte[] MAGIC = new byte[]{'p', 'r', 'o', '\u0000'};
+ static final byte[] MAGIC_PROF = new byte[]{'p', 'r', 'o', '\u0000'};
+ static final byte[] MAGIC_PROFM = new byte[]{'p', 'r', 'm', '\u0000'};
- static byte[] readHeader(@NonNull InputStream is) throws IOException {
- byte[] fileMagic = read(is, MAGIC.length);
- if (!Arrays.equals(MAGIC, fileMagic)) {
+ static byte[] readHeader(@NonNull InputStream is, @NonNull byte[] magic) throws IOException {
+ byte[] fileMagic = read(is, magic.length);
+ if (!Arrays.equals(magic, fileMagic)) {
// If we find a file that doesn't claim to be a profile, something really unexpected
// has happened. Fail.
throw error("Invalid magic");
@@ -72,7 +75,7 @@
}
static void writeHeader(@NonNull OutputStream os, byte[] version) throws IOException {
- os.write(MAGIC);
+ os.write(MAGIC_PROF);
os.write(version);
}
@@ -137,7 +140,7 @@
String profileKey = generateDexKey(data.apkName, data.dexName, ProfileVersion.V001_N);
writeUInt16(os, utf8Length(profileKey));
writeUInt16(os, data.methods.size());
- writeUInt16(os, data.classes.size());
+ writeUInt16(os, data.classes.length);
writeUInt32(os, data.dexChecksum);
writeString(os, profileKey);
@@ -245,7 +248,7 @@
UINT_16_SIZE);// inline cache size (should always be 0 for us)
String dexKey = generateDexKey(data.apkName, data.dexName, ProfileVersion.V005_O);
writeUInt16(os, utf8Length(dexKey));
- writeUInt16(os, data.classes.size());
+ writeUInt16(os, data.classes.length);
writeUInt32(os, hotMethodRegionSize);
writeUInt32(os, data.dexChecksum);
writeString(os, dexKey);
@@ -466,7 +469,6 @@
os.write(bitmap);
}
-
/**
* Reads and parses data from the InputStream into an in-memory representation, to later be
* written to disk using [writeProfileForO] or [writeProfileForN]. This method expects that
@@ -531,6 +533,93 @@
}
/**
+ *
+ *
+ * [profile_header, zipped[[dex_data_header1, dex_data_header2...],[dex_data1,
+ * dex_data2...], global_aggregation_count]]
+ * profile_header:
+ * magic,version,number_of_dex_files,uncompressed_size_of_zipped_data,compressed_data_size
+ * dex_data_header:
+ * dex_location,number_of_classes
+ * dex_data:
+ * class_id1,class_id2...
+ *
+ * @param is
+ * @param version
+ * @param profile
+ * @return
+ * @throws IOException
+ */
+ static @NonNull DexProfileData[] readMeta(
+ @NonNull InputStream is,
+ @NonNull byte[] version,
+ DexProfileData[] profile
+ ) throws IOException {
+ if (!Arrays.equals(version, ProfileVersion.METADATA_V001_N)) {
+ throw error("Unsupported meta version");
+ }
+ int numberOfDexFiles = readUInt8(is);
+ long uncompressedDataSize = readUInt32(is);
+ long compressedDataSize = readUInt32(is);
+
+ // We are done with the header, so everything that follows is the compressed blob. We
+ // uncompress it all and load it into memory
+ byte[] uncompressedData = readCompressed(
+ is,
+ (int) compressedDataSize,
+ (int) uncompressedDataSize
+ );
+ if (is.read() > 0) throw error("Content found after the end of file");
+
+ try (InputStream dataStream = new ByteArrayInputStream(uncompressedData)) {
+ return readMetadataForNBody(dataStream, numberOfDexFiles, profile);
+ }
+ }
+
+ /**
+ * Parses the un-zipped blob of data in the P+ profile format. It is assumed that no data has
+ * been read from this blob, and that the InputStream that this method is passed was just
+ * decompressed from the original file.
+ *
+ * @return A map of keys (dex names) to the parsed [DexProfileData] for that dex.
+ */
+ private static @NonNull DexProfileData[] readMetadataForNBody(
+ @NonNull InputStream is,
+ int numberOfDexFiles,
+ DexProfileData[] profile
+ ) throws IOException {
+ // If the uncompressed profile data stream is empty then we have nothing more to do.
+ if (is.available() == 0) {
+ return new DexProfileData[0];
+ }
+ if (numberOfDexFiles != profile.length) {
+ throw error("Mismatched number of dex files found in metadata");
+ }
+ // Read the dex file line headers.
+ String[] names = new String[numberOfDexFiles];
+ int[] sizes = new int[numberOfDexFiles];
+ for (int i = 0; i < numberOfDexFiles; i++) {
+ int dexNameSize = readUInt16(is);
+ sizes[i] = readUInt16(is);
+ names[i] = readString(is, dexNameSize);
+ }
+
+ // Load data for each discovered dex file.
+ for (int i = 0; i < numberOfDexFiles; i++) {
+ DexProfileData data = profile[i];
+ if (!data.dexName.equals(names[i])) {
+ throw error("Order of dexfiles in metadata did not match baseline");
+ }
+ data.classSetSize = sizes[i];
+ data.classes = new int[data.classSetSize];
+ // Then the startup classes are stored
+ readClasses(is, data);
+ }
+
+ return profile;
+ }
+
+ /**
* Return a correctly formatted dex key in the format
* APK_NAME SEPARATOR DEX_NAME
*
@@ -586,8 +675,8 @@
(int) numMethodIds,
// NOTE: It is important to use LinkedHashSet/LinkedHashMap here to
// ensure that iteration order matches insertion order
- new LinkedHashSet<>(),
- new LinkedHashMap<>()
+ new int[classSetSize],
+ new TreeMap<>()
);
}
@@ -676,7 +765,7 @@
for (int k = 0; k < data.classSetSize; k++) {
int diffWithTheLastClassIndex = readUInt16(is);
int classDexIndex = lastClassIndex + diffWithTheLastClassIndex;
- data.classes.add(classDexIndex);
+ data.classes[k] = classDexIndex;
lastClassIndex = classDexIndex;
}
}
diff --git a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java
index 7844e49..799131b 100644
--- a/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java
+++ b/profileinstaller/profileinstaller/src/main/java/androidx/profileinstaller/ProfileVersion.java
@@ -26,6 +26,7 @@
static final byte[] V009_O_MR1 = new byte[]{'0', '0', '9', '\0'};
static final byte[] V005_O = new byte[]{'0', '0', '5', '\0'};
static final byte[] V001_N = new byte[]{'0', '0', '1', '\0'};
+ static final byte[] METADATA_V001_N = new byte[]{'0', '0', '1', '\0'};
static final int MIN_SUPPORTED_SDK = Build.VERSION_CODES.N;
static String dexKeySeparator(byte[] version) {
diff --git a/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java b/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java
index 875988d..18e8b32 100644
--- a/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java
+++ b/profileinstaller/profileinstaller/src/test/java/androidx/profileinstaller/ProfileTranscoderTests.java
@@ -17,7 +17,8 @@
package androidx.profileinstaller;
-import static androidx.profileinstaller.ProfileTranscoder.MAGIC;
+import static androidx.profileinstaller.ProfileTranscoder.MAGIC_PROF;
+import static androidx.profileinstaller.ProfileTranscoder.MAGIC_PROFM;
import android.os.Build;
@@ -38,6 +39,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
+import java.util.Arrays;
@RequiresApi(api = Build.VERSION_CODES.O)
@RunWith(JUnit4.class)
@@ -48,7 +50,7 @@
byte[] version = ProfileVersion.V010_P;
File pprof = testFile("baseline-p.prof");
try (InputStream is = new FileInputStream(pprof)) {
- expectBytes(is, MAGIC);
+ expectBytes(is, MAGIC_PROF);
expectBytes(is, version);
DexProfileData[] data = ProfileTranscoder.readProfile(is, version, APK_NAME);
Truth.assertThat(data).hasLength(1);
@@ -115,8 +117,9 @@
@Test
public void testMultidexTranscodeForN() throws IOException {
- assertGoldenTranscode(
+ assertGoldenTranscodeWithMeta(
testFile("baseline-multidex.prof"),
+ testFile("baseline-multidex.profm"),
testFile("baseline-multidex-n.prof"),
ProfileVersion.V001_N
);
@@ -135,7 +138,7 @@
InputStream is = new FileInputStream(input);
ByteArrayOutputStream os = new ByteArrayOutputStream()
) {
- byte[] version = ProfileTranscoder.readHeader(is);
+ byte[] version = ProfileTranscoder.readHeader(is, MAGIC_PROF);
ProfileTranscoder.writeHeader(os, desiredVersion);
DexProfileData[] data = ProfileTranscoder.readProfile(
is,
@@ -145,7 +148,36 @@
ProfileTranscoder.transcodeAndWriteBody(os, desiredVersion, data);
byte[] goldenBytes = Files.readAllBytes(golden.toPath());
byte[] actualBytes = os.toByteArray();
- Truth.assertThat(actualBytes).isEqualTo(goldenBytes);
+ Truth.assertThat(Arrays.equals(goldenBytes, actualBytes)).isTrue();
+ }
+ }
+
+ private static void assertGoldenTranscodeWithMeta(
+ @NonNull File input,
+ @NonNull File inputMeta,
+ @NonNull File golden,
+ @NonNull byte[] desiredVersion
+ ) throws IOException {
+ try (
+ InputStream isProf = new FileInputStream(input);
+ InputStream isProfM = new FileInputStream(inputMeta);
+ ByteArrayOutputStream os = new ByteArrayOutputStream();
+ ) {
+ byte[] version = ProfileTranscoder.readHeader(isProf, MAGIC_PROF);
+ DexProfileData[] data = ProfileTranscoder.readProfile(
+ isProf,
+ version,
+ APK_NAME
+ );
+
+ byte[] metaVersion = ProfileTranscoder.readHeader(isProfM, MAGIC_PROFM);
+ data = ProfileTranscoder.readMeta(isProfM, metaVersion, data);
+
+ ProfileTranscoder.writeHeader(os, desiredVersion);
+ ProfileTranscoder.transcodeAndWriteBody(os, desiredVersion, data);
+ byte[] goldenBytes = Files.readAllBytes(golden.toPath());
+ byte[] actualBytes = os.toByteArray();
+ Truth.assertThat(Arrays.equals(goldenBytes, actualBytes)).isTrue();
}
}
@@ -164,7 +196,7 @@
InputStream is = new FileInputStream(input);
OutputStream os = new FileOutputStream(golden)
) {
- byte[] version = ProfileTranscoder.readHeader(is);
+ byte[] version = ProfileTranscoder.readHeader(is, MAGIC_PROF);
ProfileTranscoder.writeHeader(os, desiredVersion);
DexProfileData[] data = ProfileTranscoder.readProfile(
is,
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-n.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-n.prof
index 35c5990..64b59f5 100644
--- a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-n.prof
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-n.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o-mr1.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o-mr1.prof
index 3da29e6..3551871 100644
--- a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o-mr1.prof
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o-mr1.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o.prof
index 5a10e45..ee2c2b7 100644
--- a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o.prof
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex-o.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.prof b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.prof
index 4ae77708..52fa8ed 100644
--- a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.prof
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.prof
Binary files differ
diff --git a/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.profm b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.profm
new file mode 100644
index 0000000..c5a99d4
--- /dev/null
+++ b/profileinstaller/profileinstaller/src/test/test-data/baseline-multidex.profm
Binary files differ
diff --git a/room/room-common/src/main/java/androidx/room/Index.java b/room/room-common/src/main/java/androidx/room/Index.java
index dc9206a..04fe4e8 100644
--- a/room/room-common/src/main/java/androidx/room/Index.java
+++ b/room/room-common/src/main/java/androidx/room/Index.java
@@ -64,7 +64,7 @@
* Note that there is no value in providing a sort order on a single-column index. Column sort
* order of an index are relevant on multi-column indices and specifically in those that are
* considered 'covering indices', for such indices specifying an order can have performance
- * improvements on queries containing ORDER BY clauses.SchemaDifferTest See
+ * improvements on queries containing ORDER BY clauses. See
* <a href="https://www.sqlite.org/queryplanner.html#_sorting_by_index">SQLite documentation</a>
* for details on sorting by index and the usage of the sort order by the query optimizer.
* <p>
diff --git a/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt b/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
index 4658f0e..43f7efa 100644
--- a/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
+++ b/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticJavacProcessor.kt
@@ -16,7 +16,6 @@
package androidx.room.compiler.processing
-import androidx.room.compiler.processing.compat.XConverters.toJavac
import androidx.room.compiler.processing.javac.JavacBasicAnnotationProcessor
import androidx.room.compiler.processing.util.XTestInvocation
import javax.lang.model.SourceVersion
@@ -31,7 +30,7 @@
override fun processingSteps(): Iterable<XProcessingStep> = impl.processingSteps()
override fun postRound(env: XProcessingEnv, round: XRoundEnv) {
- if (!round.toJavac().processingOver()) {
+ if (!round.isProcessingOver) {
impl.postRound(env, round)
}
}
diff --git a/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt b/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
index 58872b3..e9c0231 100644
--- a/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
+++ b/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/SyntheticKspProcessor.kt
@@ -32,9 +32,11 @@
SyntheticProcessorImpl(handlers)
)
- override fun finish() {}
-
override fun processingSteps(): Iterable<XProcessingStep> = impl.processingSteps()
- override fun postRound(env: XProcessingEnv, round: XRoundEnv) = impl.postRound(env, round)
+ override fun postRound(env: XProcessingEnv, round: XRoundEnv) {
+ if (!round.isProcessingOver) {
+ impl.postRound(env, round)
+ }
+ }
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt
index b87d357..f0b7ed5 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/DeclarationCollector.kt
@@ -17,119 +17,29 @@
package androidx.room.compiler.processing
/**
- * Helper method to collect declarations from a type element and its parents.
- *
- * To be able to benefit from multi level caching (e.g. each type element caching its important
- * fields / declarations), parents are not visited recursively. Instead, callers are expected to
- * call the right methods when traversing immediate parents / interfaces.
- */
-private fun <T> collectDeclarations(
- /**
- * The root element
- */
- target: XTypeElement,
- /**
- * Elements that will be added without verification. These are usually inherited from the
- * root element.
- */
- initialList: List<T>,
- /**
- * Returns a list of possible elements that can be included in the final list.
- * The receiver is either a super class or interface.
- */
- getCandidateDeclarations: XTypeElement.() -> Sequence<T>,
- /**
- * Returns a partitan key for each element to optimize override checks etc.
- */
- getPartitionKey: T.() -> String,
- /**
- * Returns true if this item should be added to the list, false otherwise.
- */
- isAcceptable: (candidate: T, existing: List<T>) -> Boolean,
- /**
- * Copies the element to the root element
- */
- copyToTarget: (T) -> T,
- /**
- * If true, parent class will be visited.
- */
- visitParent: Boolean,
- /**
- * If true, parent interfaces will be visited.
- */
- visitInterfaces: Boolean
-): Sequence<T> {
- val parents = sequence {
- if (visitParent) {
- target.superType?.typeElement?.let {
- yield(it)
- }
- }
- if (visitInterfaces) {
- yieldAll(target.getSuperInterfaceElements())
- }
- }
- return sequence {
- // group members by name for faster override checks
- val selectionByName = mutableMapOf<String, MutableList<T>>()
- suspend fun SequenceScope<T>.addToSelection(item: T) {
- val key = getPartitionKey(item)
- selectionByName.getOrPut(key) {
- mutableListOf()
- }.add(item)
- yield(item)
- }
-
- suspend fun SequenceScope<T>.maybeAddToSelection(candidate: T) {
- val partitionKey = candidate.getPartitionKey()
- val existing = selectionByName[partitionKey] ?: emptyList()
- if (isAcceptable(candidate, existing)) {
- addToSelection(copyToTarget(candidate))
- }
- }
-
- // yield everything in the root list
- initialList.forEach {
- addToSelection(it)
- }
- // now start yielding it from parents
- parents.flatMap { it.getCandidateDeclarations() }.forEach {
- maybeAddToSelection(copyToTarget(it))
- }
- }
-}
-
-private fun XTypeElement.canAccessSuperMethod(other: XMethodElement): Boolean {
- if (other.isPublic() || other.isProtected()) {
- return true
- }
- if (other.isPrivate()) {
- return false
- }
- // check package
- return packageName == other.enclosingElement.className.packageName()
-}
-
-/**
* see [XTypeElement.getAllFieldsIncludingPrivateSupers]
*/
internal fun collectFieldsIncludingPrivateSupers(
xTypeElement: XTypeElement
): Sequence<XFieldElement> {
- return collectDeclarations(
- target = xTypeElement,
- visitParent = true,
- visitInterfaces = false,
- getPartitionKey = XFieldElement::name,
- initialList = xTypeElement.getDeclaredFields(),
- copyToTarget = {
- it.copyTo(xTypeElement)
- },
- isAcceptable = { _, existing ->
- existing.isEmpty()
- },
- getCandidateDeclarations = XTypeElement::getAllFieldsIncludingPrivateSupers
- )
+ return sequence {
+ val existingFieldNames = mutableSetOf<String>()
+
+ // yield all fields declared directly on this type
+ xTypeElement.getDeclaredFields().forEach {
+ if (existingFieldNames.add(it.name)) {
+ yield(it)
+ }
+ }
+ // yield all fields on the parents
+ xTypeElement.superType?.typeElement?.let { parent ->
+ parent.getAllFieldsIncludingPrivateSupers().forEach {
+ if (existingFieldNames.add(it.name)) {
+ yield(it.copyTo(xTypeElement))
+ }
+ }
+ }
+ }
}
/**
@@ -138,35 +48,77 @@
internal fun collectAllMethods(
xTypeElement: XTypeElement
): Sequence<XMethodElement> {
- return collectDeclarations(
- target = xTypeElement,
- visitParent = true,
- visitInterfaces = true,
- getPartitionKey = XMethodElement::name,
- initialList = xTypeElement.getDeclaredMethods(),
- copyToTarget = {
- it.copyTo(xTypeElement)
- },
- isAcceptable = { candidate, existing ->
- when {
- // my method, accept all
- candidate.enclosingElement == xTypeElement -> true
- // cannot access, reject
- !xTypeElement.canAccessSuperMethod(candidate) -> false
- // static in an interface
- candidate.isStatic() &&
- (candidate.enclosingElement as? XTypeElement)?.isInterface() == true ->
- false
- // accept if not overridden
- else -> existing.none {
- // we might see the same method twice due to diamond inheritance so we need
- // check for equals in addition to overrides
- // note that this is OK to check because you cannot implement the same interface
- // twice with different type parameters (due to erasure).
- it == candidate || it.overrides(candidate, xTypeElement)
- }
+ return sequence {
+ // group methods by name for faster override checks
+ val methodsByName = mutableMapOf<String, LinkedHashSet<XMethodElement>>()
+ val visitedTypes = mutableSetOf<XTypeElement>()
+ fun collectAllMethodsByName(type: XTypeElement) {
+ if (!visitedTypes.add(type)) {
+ // Just return if we've already visited the methods in this type.
+ return
}
- },
- getCandidateDeclarations = XTypeElement::getAllMethods,
- )
-}
\ No newline at end of file
+ // First, visit all super interface methods.
+ type.getSuperInterfaceElements().forEach {
+ collectAllMethodsByName(it)
+ }
+ // Next, visit all super class methods.
+ type.superType?.typeElement?.let {
+ collectAllMethodsByName(it)
+ }
+ // Finally, visit all methods declared in this type.
+ if (type == xTypeElement) {
+ type.getDeclaredMethods().forEach {
+ methodsByName.getOrPut(it.name) { linkedSetOf() }.add(it)
+ }
+ } else {
+ type.getDeclaredMethods()
+ .filter { it.isAccessibleFrom(type.packageName) }
+ .filterNot { it.isStaticInterfaceMethod() }
+ .map { it.copyTo(xTypeElement) }
+ .forEach { methodsByName.getOrPut(it.name) { linkedSetOf() }.add(it) }
+ }
+ }
+ collectAllMethodsByName(xTypeElement)
+
+ // Yield all non-overridden methods
+ methodsByName.values.forEach { methodSet ->
+ if (methodSet.size == 1) {
+ // There's only one method with this name, so it can't be overridden
+ yield(methodSet.single())
+ } else {
+ // There are multiple methods with the same name, so we must check for overridden
+ // methods. The order of the methods should guarantee that any potentially
+ // overridden method comes first in the list, so we only need to check each method
+ // against subsequent methods.
+ val methods = methodSet.toList()
+ val overridden = mutableSetOf<XMethodElement>()
+ methods.forEachIndexed { i, methodOne ->
+ methods.subList(i + 1, methods.size).forEach { methodTwo ->
+ if (methodTwo.overrides(methodOne, xTypeElement)) {
+ overridden.add(methodOne)
+ // Once we've added methodI, we can break out of this inner loop since
+ // additional checks would only try to add methodI again.
+ return@forEachIndexed
+ }
+ }
+ }
+ methods.filterNot { overridden.contains(it) }.forEach { yield(it) }
+ }
+ }
+ }
+}
+
+private fun XMethodElement.isAccessibleFrom(packageName: String): Boolean {
+ if (isPublic() || isProtected()) {
+ return true
+ }
+ if (isPrivate()) {
+ return false
+ }
+ // check package
+ return packageName == enclosingElement.className.packageName()
+}
+
+private fun XMethodElement.isStaticInterfaceMethod(): Boolean {
+ return isStatic() && (enclosingElement as? XTypeElement)?.isInterface() == true
+}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt
index f5e76d7..fe4854c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotated.kt
@@ -145,4 +145,16 @@
fun requireAnnotation(annotationName: ClassName): XAnnotation {
return getAnnotation(annotationName)!!
}
+
+ /**
+ * Returns a boxed instance of the given [annotation] class where fields can be read.
+ *
+ * @see [hasAnnotation]
+ * @see [getAnnotations]
+ * @see [hasAnnotationWithPackage]
+ */
+ fun <T : Annotation> requireAnnotation(annotation: KClass<T>) =
+ checkNotNull(getAnnotation(annotation)) {
+ "Cannot find required annotation $annotation"
+ }
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XBasicAnnotationProcessor.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XBasicAnnotationProcessor.kt
index 7ae0f0f..a7fc791 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XBasicAnnotationProcessor.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XBasicAnnotationProcessor.kt
@@ -16,12 +16,26 @@
package androidx.room.compiler.processing
+import javax.tools.Diagnostic
+
/**
* Common interface for basic annotation processors.
*
* A processor should not implement this interface directly and instead should extend
* [androidx.room.compiler.processing.javac.JavacBasicAnnotationProcessor] or
* [androidx.room.compiler.processing.ksp.KspBasicAnnotationProcessor].
+ *
+ * The XProcessing Javac and KSP implementations of this interface will automatically validate and
+ * defer annotated elements for the steps. If no valid annotated element is found for a
+ * [XProcessingStep] then its [XProcessingStep.process] function will not be invoked, except for
+ * the last round in which [XProcessingStep.processOver] is invoked regardless if the annotated
+ * elements are valid or not. If there were invalid annotated elements until the last round, then
+ * the XProcessing implementations will report an error for each invalid element.
+ *
+ * Be aware that even though the similarity in name, the Javac implementation of this interface
+ * is not 1:1 with [com.google.auto.common.BasicAnnotationProcessor]. Specifically, validation is
+ * done for each annotated element as opposed to the enclosing type element of the annotated
+ * elements for the [XProcessingStep].
*/
interface XBasicAnnotationProcessor {
@@ -39,4 +53,173 @@
* Called at the end of a processing round after all [processingSteps] have been executed.
*/
fun postRound(env: XProcessingEnv, round: XRoundEnv) { }
+}
+
+/**
+ * Common code for implementations of [XBasicAnnotationProcessor] offered by XProcessing.
+ */
+internal class CommonProcessorDelegate(
+ private val processorClass: Class<*>,
+ private val env: XProcessingEnv,
+ private val steps: List<XProcessingStep>,
+) {
+ // Type names of deferred elements from the processor.
+ private val deferredElementNames = mutableSetOf<String>()
+ // Type element names containing deferred elements from processing steps.
+ private val elementsDeferredBySteps = mutableMapOf<XProcessingStep, Set<String>>()
+
+ fun processRound(roundEnv: XRoundEnv) {
+ val previousRoundDeferredElementNames = deferredElementNames.toMutableSet()
+ deferredElementNames.clear()
+ val currentElementsDeferredByStep = steps.associateWith { step ->
+ // Previous round processor deferred elements, these need to be re-validated.
+ val previousRoundDeferredElementsByAnnotation =
+ getStepElementsByAnnotation(step, previousRoundDeferredElementNames)
+ .withDefault { emptySet() }
+ // Previous round step deferred elements, these don't need to be re-validated.
+ val stepDeferredElementsByAnnotation =
+ getStepElementsByAnnotation(step, elementsDeferredBySteps[step] ?: emptySet())
+ .withDefault { emptySet() }
+ val deferredElements = mutableSetOf<XElement>()
+ val elementsByAnnotation = step.annotations().mapNotNull { annotation ->
+ val annotatedElements = roundEnv.getElementsAnnotatedWith(annotation) +
+ previousRoundDeferredElementsByAnnotation.getValue(annotation)
+ // Split between valid and invalid elements. Unlike auto-common, validation is only
+ // done in the annotated element from the round and not in the closest enclosing
+ // type element.
+ val (validElements, invalidElements) = annotatedElements.partition { it.validate() }
+ deferredElements.addAll(invalidElements)
+ (validElements + stepDeferredElementsByAnnotation.getValue(annotation)).let {
+ if (it.isNotEmpty()) {
+ annotation to it.toSet()
+ } else {
+ null
+ }
+ }
+ }.toMap()
+ // Store all processor deferred elements.
+ deferredElementNames.addAll(
+ deferredElements.mapNotNull { getClosestEnclosingTypeElement(it)?.qualifiedName }
+ )
+ // Only process the step if there are annotated elements found for this step.
+ return@associateWith if (elementsByAnnotation.isNotEmpty()) {
+ step.process(env, elementsByAnnotation)
+ .mapNotNull { getClosestEnclosingTypeElement(it)?.qualifiedName }.toSet()
+ } else {
+ emptySet()
+ }
+ }
+ // Store elements deferred by steps.
+ elementsDeferredBySteps.clear()
+ elementsDeferredBySteps.putAll(currentElementsDeferredByStep)
+ }
+
+ fun processLastRound(): List<String> {
+ steps.forEach { step ->
+ val stepDeferredElementsByAnnotation = getStepElementsByAnnotation(
+ step = step,
+ typeElementNames =
+ deferredElementNames + elementsDeferredBySteps.getOrElse(step) { emptySet() }
+ )
+ val elementsByAnnotation = step.annotations().mapNotNull { annotation ->
+ val annotatedElements = stepDeferredElementsByAnnotation[annotation] ?: emptySet()
+ if (annotatedElements.isNotEmpty()) {
+ annotation to annotatedElements
+ } else {
+ null
+ }
+ }.toMap()
+ step.processOver(env, elementsByAnnotation)
+ }
+ // Return element names that were deferred until the last round, an error should be reported
+ // for these, failing compilation. Sadly we currently don't have the mechanism to know if
+ // the missing types were generated in the last round.
+ return elementsDeferredBySteps.values.flatten()
+ }
+
+ /**
+ * Get elements annotated with [step]'s annotations from the type element in [typeElementNames].
+ *
+ * Does not traverse type element members, so that if looking at `Outer` in the example
+ * below, looking for `@X`, then `Outer`, `Outer.foo`, and `Outer.foo()` will be in the result,
+ * but neither `Inner` nor its members will unless `Inner` is also in the [typeElementNames].
+ * ```
+ * @X class Outer {
+ * @X Object foo;
+ * @X void foo() {}
+ * @X static class Inner {
+ * @X Object bar;
+ * @X void bar() {}
+ * }
+ * }
+ * ```
+ */
+ private fun getStepElementsByAnnotation(
+ step: XProcessingStep,
+ typeElementNames: Set<String>
+ ): Map<String, Set<XElement>> {
+ if (typeElementNames.isEmpty()) {
+ return emptyMap()
+ }
+ val stepAnnotations = step.annotations()
+ val elementsByAnnotation = mutableMapOf<String, MutableSet<XElement>>()
+ fun putStepAnnotatedElements(element: XElement) = element.getAllAnnotations()
+ .map { it.qualifiedName }
+ .forEach { annotationName ->
+ if (stepAnnotations.contains(annotationName)) {
+ elementsByAnnotation.getOrPut(annotationName) { mutableSetOf() }.add(element)
+ }
+ }
+ typeElementNames
+ .mapNotNull { env.findTypeElement(it) }
+ .forEach { typeElement ->
+ typeElement.getEnclosedElements()
+ .filterNot { it.isTypeElement() }
+ .forEach { enclosedElement ->
+ if (enclosedElement is XExecutableElement) {
+ enclosedElement.parameters.forEach {
+ putStepAnnotatedElements(it)
+ }
+ }
+ putStepAnnotatedElements(enclosedElement)
+ }
+ putStepAnnotatedElements(typeElement)
+ }
+ return elementsByAnnotation.withDefault { mutableSetOf() }
+ }
+
+ // TODO(b/201308409): Does not work with top-level KSP functions or properties whose
+ // container are synthetic.
+ private fun getClosestEnclosingTypeElement(element: XElement): XTypeElement? {
+ return when {
+ element.isTypeElement() -> element
+ element.isField() -> element.enclosingElement as? XTypeElement
+ element.isMethod() -> element.enclosingElement as? XTypeElement
+ element.isConstructor() -> element.enclosingElement
+ element.isMethodParameter() ->
+ element.enclosingMethodElement.enclosingElement as? XTypeElement
+ element.isEnumEntry() -> element.enumTypeElement
+ else -> {
+ env.messager.printMessage(
+ kind = Diagnostic.Kind.WARNING,
+ msg = "Unable to defer element '$element': Don't know how to find " +
+ "closest enclosing type element."
+ )
+ null
+ }
+ }
+ }
+
+ fun reportMissingElements(missingElementNames: List<String>) {
+ missingElementNames.forEach { missingElementName ->
+ env.messager.printMessage(
+ kind = Diagnostic.Kind.ERROR,
+ msg = (
+ "%s was unable to process '%s' because not all of its dependencies " +
+ "could be resolved. Check for compilation errors or a circular " +
+ "dependency with generated code."
+ ).format(processorClass.canonicalName, missingElementName),
+ )
+ }
+ }
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
index cdc8d4a..60e92ca 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XElement.kt
@@ -49,6 +49,11 @@
* The documentation comment of the element, or null if there is none.
*/
val docComment: String?
+
+ /**
+ * Returns true if all types referenced by this element are valid, i.e. resolvable.
+ */
+ fun validate(): Boolean
}
/**
@@ -73,6 +78,16 @@
}
/**
+ * Checks whether this element represents an [XFieldElement].
+ */
+fun XElement.isField(): Boolean {
+ contract {
+ returns(true) implies (this@isField is XFieldElement)
+ }
+ return this is XFieldElement
+}
+
+/**
* Checks whether this element represents an [XMethodElement].
*/
fun XElement.isMethod(): Boolean {
@@ -82,6 +97,19 @@
return this is XMethodElement
}
+/**
+ * Checks whether this element represents an [XExecutableParameterElement].
+ */
+fun XElement.isMethodParameter(): Boolean {
+ contract {
+ returns(true) implies (this@isMethodParameter is XExecutableParameterElement)
+ }
+ return this is XExecutableParameterElement
+}
+
+/**
+ * Checks whether this element represents an [XConstructorElement].
+ */
fun XElement.isConstructor(): Boolean {
contract {
returns(true) implies (this@isConstructor is XConstructorElement)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumEntry.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumEntry.kt
index 0006ad5..fa74017 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumEntry.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumEntry.kt
@@ -33,7 +33,7 @@
val enumTypeElement: XEnumTypeElement
}
-fun XTypeElement.isEnumEntry(): Boolean {
+fun XElement.isEnumEntry(): Boolean {
contract {
returns(true) implies (this@isEnumEntry is XEnumEntry)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumTypeElement.kt
index 5061d0a..aabc79f 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XEnumTypeElement.kt
@@ -23,6 +23,10 @@
*/
interface XEnumTypeElement : XTypeElement {
val entries: Set<XEnumEntry>
+
+ override fun getEnclosedElements(): List<XElement> {
+ return super.getEnclosedElements() + entries
+ }
}
fun XTypeElement.isEnum(): Boolean {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableParameterElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableParameterElement.kt
index 1303624..7c08754 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableParameterElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XExecutableParameterElement.kt
@@ -20,6 +20,12 @@
* Parameter of a method.
*/
interface XExecutableParameterElement : XVariableElement {
+
+ /**
+ * The enclosing [XExecutableElement] this parameter belongs to.
+ */
+ val enclosingMethodElement: XExecutableElement
+
/**
* `true` if the parameter has a default value, `false` otherwise.
*
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingStep.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingStep.kt
index 96f3994..d88fb64 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingStep.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XProcessingStep.kt
@@ -34,6 +34,16 @@
): Set<XElement>
/**
+ * An optional hook for logic to be executed in the last round of processing.
+ *
+ * Unlike [process], the elements in [elementsByAnnotation] are not validated and are those
+ * that have been kept being deferred.
+ *
+ * @see [XRoundEnv.isProcessingOver]
+ */
+ fun processOver(env: XProcessingEnv, elementsByAnnotation: Map<String, Set<XElement>>) { }
+
+ /**
* The set of annotation qualified names processed by this step.
*/
fun annotations(): Set<String>
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt
index a260f5a..72df731 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRoundEnv.kt
@@ -35,6 +35,14 @@
val rootElements: Set<XElement>
/**
+ * Returns true if no further rounds of processing will be done.
+ *
+ * Sources generated in this round will not be not be subject to a subsequent round of
+ * annotation processing, however they will be compiled.
+ */
+ val isProcessingOver: Boolean
+
+ /**
* Returns the set of [XElement]s that are annotated with the given annotation [klass].
*/
fun getElementsAnnotatedWith(klass: KClass<out Annotation>): Set<XElement>
@@ -48,7 +56,8 @@
@JvmStatic
fun create(
processingEnv: XProcessingEnv,
- roundEnvironment: RoundEnvironment? = null
+ roundEnvironment: RoundEnvironment? = null,
+ isProcessingOver: Boolean = roundEnvironment?.processingOver() ?: false,
): XRoundEnv {
return when (processingEnv) {
is JavacProcessingEnv -> {
@@ -56,7 +65,7 @@
JavacRoundEnv(processingEnv, roundEnvironment)
}
is KspProcessingEnv -> {
- KspRoundEnv(processingEnv)
+ KspRoundEnv(processingEnv, isProcessingOver)
}
else -> error("invalid processing environment type: $processingEnv")
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
index 9888e92..00fb0e1 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
@@ -140,6 +140,11 @@
* includes all instance/static methods in parent CLASS if they are accessible from this (e.g.
* not private).
* does not include static methods in parent interfaces
+ *
+ * The order is defined as:
+ * 1. All interfaces methods appear before all class methods,
+ * 2. All super class methods appear before all sub class methods,
+ * 3. Within a given class/interface methods appear in the order they're declared in source.
*/
fun getAllMethods(): Sequence<XMethodElement> {
return collectAllMethods(this)
@@ -171,4 +176,11 @@
* objects.
*/
fun getEnclosedTypeElements(): List<XTypeElement>
+
+ fun getEnclosedElements(): List<XElement> = mutableListOf<XElement>().apply {
+ addAll(getEnclosedTypeElements())
+ addAll(getDeclaredFields())
+ addAll(getConstructors())
+ addAll(getDeclaredMethods())
+ }
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationValue.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationValue.kt
index 77e1e6e..8767264 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationValue.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacAnnotationValue.kt
@@ -16,16 +16,17 @@
package androidx.room.compiler.processing.javac
+import androidx.room.compiler.processing.XAnnotationValue
import androidx.room.compiler.processing.XEnumTypeElement
import androidx.room.compiler.processing.XNullability
-import androidx.room.compiler.processing.XAnnotationValue
import com.google.auto.common.MoreTypes
import javax.lang.model.element.AnnotationMirror
import javax.lang.model.element.AnnotationValue
-import javax.lang.model.element.ElementKind
import javax.lang.model.element.ExecutableElement
import javax.lang.model.element.VariableElement
+import javax.lang.model.type.TypeKind
import javax.lang.model.type.TypeMirror
+import javax.lang.model.util.AbstractAnnotationValueVisitor8
internal class JavacAnnotationValue(
val env: JavacProcessingEnv,
@@ -35,36 +36,49 @@
override val name: String
get() = element.simpleName.toString()
- override val value: Any? by lazy { annotationValue.unwrap() }
+ override val value: Any? by lazy { UNWRAP_VISITOR.visit(annotationValue, env) }
+}
- private fun AnnotationValue.unwrap(): Any? {
- val value = this.value
- fun Any?.unwrapIfNeeded(): Any? {
- return if (this is AnnotationValue) this.unwrap() else this
+private val UNWRAP_VISITOR = object : AbstractAnnotationValueVisitor8<Any?, JavacProcessingEnv>() {
+ override fun visitBoolean(b: Boolean, env: JavacProcessingEnv) = b
+ override fun visitByte(b: Byte, env: JavacProcessingEnv) = b
+ override fun visitChar(c: Char, env: JavacProcessingEnv) = c
+ override fun visitDouble(d: Double, env: JavacProcessingEnv) = d
+ override fun visitFloat(f: Float, env: JavacProcessingEnv) = f
+ override fun visitInt(i: Int, env: JavacProcessingEnv) = i
+ override fun visitLong(i: Long, env: JavacProcessingEnv) = i
+ override fun visitShort(s: Short, env: JavacProcessingEnv) = s
+
+ override fun visitString(s: String?, env: JavacProcessingEnv) =
+ if (s == "<error>") {
+ throw TypeNotPresentException(s, null)
+ } else {
+ s
}
- return when {
- // The List implementation further wraps each value as a AnnotationValue.
- // We don't expose arrays because we don't have a reified type to instantiate the array
- // with, and using "Any" prevents the array from being cast to the correct
- // type later on.
- value is List<*> -> value.map { it.unwrapIfNeeded() }
- value is TypeMirror -> env.wrap(value, kotlinType = null, XNullability.NONNULL)
- value is AnnotationMirror -> JavacAnnotation(env, value)
- // Enums are wrapped in a variable element with kind ENUM_CONSTANT
- value is VariableElement -> {
- when {
- value.kind == ElementKind.ENUM_CONSTANT -> {
- val enumTypeElement = MoreTypes.asTypeElement(value.asType())
- JavacEnumEntry(
- env,
- value,
- JavacTypeElement.create(env, enumTypeElement) as XEnumTypeElement
- )
- }
- else -> error("Unexpected annotation value $value for argument $name")
- }
- }
- else -> value
+
+ override fun visitType(t: TypeMirror, env: JavacProcessingEnv): JavacType {
+ if (t.kind == TypeKind.ERROR) {
+ throw TypeNotPresentException(t.toString(), null)
}
+ return env.wrap(t, kotlinType = null, XNullability.NONNULL)
}
+
+ override fun visitEnumConstant(c: VariableElement, env: JavacProcessingEnv): JavacEnumEntry {
+ val type = c.asType()
+ if (type.kind == TypeKind.ERROR) {
+ throw TypeNotPresentException(type.toString(), null)
+ }
+ val enumTypeElement = MoreTypes.asTypeElement(type)
+ return JavacEnumEntry(
+ env = env,
+ entryElement = c,
+ enumTypeElement = JavacTypeElement.create(env, enumTypeElement) as XEnumTypeElement
+ )
+ }
+
+ override fun visitAnnotation(a: AnnotationMirror, env: JavacProcessingEnv) =
+ JavacAnnotation(env, a)
+
+ override fun visitArray(vals: MutableList<out AnnotationValue>, env: JavacProcessingEnv) =
+ vals.map { it.accept(this, env) }
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacBasicAnnotationProcessor.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacBasicAnnotationProcessor.kt
index 767d4a9..dd65b9e 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacBasicAnnotationProcessor.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacBasicAnnotationProcessor.kt
@@ -16,58 +16,54 @@
package androidx.room.compiler.processing.javac
+import androidx.room.compiler.processing.CommonProcessorDelegate
import androidx.room.compiler.processing.XBasicAnnotationProcessor
-import androidx.room.compiler.processing.XElement
import androidx.room.compiler.processing.XProcessingEnv
-import androidx.room.compiler.processing.XProcessingStep
-import com.google.auto.common.BasicAnnotationProcessor
-import com.google.common.collect.ImmutableSetMultimap
+import javax.annotation.processing.AbstractProcessor
+import javax.annotation.processing.ProcessingEnvironment
import javax.annotation.processing.RoundEnvironment
-import javax.lang.model.element.Element
+import javax.lang.model.element.TypeElement
/**
* Javac implementation of a [XBasicAnnotationProcessor] with built-in support for validating and
- * deferring elements via auto-common's [BasicAnnotationProcessor].
+ * deferring elements.
*/
abstract class JavacBasicAnnotationProcessor :
- BasicAnnotationProcessor(), XBasicAnnotationProcessor {
+ AbstractProcessor(), XBasicAnnotationProcessor {
private val xEnv: JavacProcessingEnv by lazy { JavacProcessingEnv(processingEnv) }
+ // Cache and lazily get steps during the initial process() so steps initialization is done once.
+ private val steps by lazy { processingSteps().toList() }
+
+ private val commonDelegate by lazy { CommonProcessorDelegate(this.javaClass, xEnv, steps) }
+
final override val xProcessingEnv: XProcessingEnv get() = xEnv
- final override fun steps(): Iterable<Step> {
- return processingSteps().map { DelegatingStep(it) }
+ final override fun init(processingEnv: ProcessingEnvironment?) {
+ super.init(processingEnv)
}
- @Suppress("DEPRECATION") // Override initSteps to make it final.
- final override fun initSteps() = super.initSteps()
+ final override fun getSupportedAnnotationTypes() = steps.flatMap { it.annotations() }.toSet()
- /** A [Step] that delegates to an [XProcessingStep]. */
- private inner class DelegatingStep(val xStep: XProcessingStep) : Step {
- override fun annotations() = xStep.annotations()
-
- override fun process(
- elementsByAnnotation: ImmutableSetMultimap<String, Element>
- ): Set<Element> {
- // The first step in a round initializes the cachedXEnv. Note: the "first" step can
- // change each round depending on which annotations are present in the current round and
- // which elements were deferred in the previous round.
- val xElementsByAnnotation = mutableMapOf<String, Set<XElement>>()
- xStep.annotations().forEach { annotation ->
- xElementsByAnnotation[annotation] =
- elementsByAnnotation[annotation].mapNotNull { element ->
- xEnv.wrapAnnotatedElement(element, annotation)
- }.toSet()
+ final override fun process(
+ annotations: MutableSet<out TypeElement>,
+ roundEnv: RoundEnvironment
+ ): Boolean {
+ val xRoundEnv = JavacRoundEnv(xEnv, roundEnv)
+ if (roundEnv.processingOver()) {
+ val missingElements = commonDelegate.processLastRound()
+ postRound(xEnv, xRoundEnv)
+ if (!roundEnv.errorRaised()) {
+ // Report missing elements if no error was raised to avoid being noisy.
+ commonDelegate.reportMissingElements(missingElements)
}
- return xStep.process(xEnv, xElementsByAnnotation).map {
- (it as JavacElement).element
- }.toSet()
+ } else {
+ commonDelegate.processRound(xRoundEnv)
+ postRound(xEnv, xRoundEnv)
+ xEnv.clearCache()
}
- }
- final override fun postRound(roundEnv: RoundEnvironment) {
- postRound(xEnv, JavacRoundEnv(xEnv, roundEnv))
- xEnv.clearCache() // Reset cache after every round to avoid leaking elements across rounds
+ return false
}
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt
index 494a356..0d847a7 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacElement.kt
@@ -24,6 +24,7 @@
import androidx.room.compiler.processing.unwrapRepeatedAnnotationsFromContainer
import com.google.auto.common.MoreElements
import com.google.auto.common.MoreElements.isAnnotationPresent
+import com.google.auto.common.SuperficialValidation
import java.util.Locale
import javax.lang.model.element.Element
import kotlin.reflect.KClass
@@ -99,4 +100,8 @@
override val docComment: String? by lazy {
env.elementUtils.getDocComment(element)
}
+
+ override fun validate(): Boolean {
+ return SuperficialValidation.validateElement(element)
+ }
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt
index 100182f..c578727c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacExecutableElement.kt
@@ -43,10 +43,10 @@
element.parameters.mapIndexed { index, variable ->
JavacMethodParameter(
env = env,
- executable = this,
+ enclosingMethodElement = this,
containing = containing,
element = variable,
- kotlinMetadata = kotlinMetadata?.parameters?.getOrNull(index),
+ kotlinMetadataFactory = { kotlinMetadata?.parameters?.getOrNull(index) },
argIndex = index
)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
index 8122cc0..f1961d3 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodElement.kt
@@ -103,7 +103,8 @@
override fun overrides(other: XMethodElement, owner: XTypeElement): Boolean {
check(other is JavacMethodElement)
check(owner is JavacTypeElement)
- return env.elementUtils.overrides(element, other.element, owner.element)
+ // Use auto-common's overrides, which provides consistency across javac and ejc (Eclipse).
+ return MoreElements.overrides(element, other.element, owner.element, env.typeUtils)
}
override fun copyTo(newContainer: XTypeElement): XMethodElement {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt
index 0b03ca4..1700130 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacMethodParameter.kt
@@ -24,13 +24,15 @@
internal class JavacMethodParameter(
env: JavacProcessingEnv,
- private val executable: JavacExecutableElement,
+ override val enclosingMethodElement: JavacExecutableElement,
containing: JavacTypeElement,
element: VariableElement,
- val kotlinMetadata: KmValueParameter?,
+ kotlinMetadataFactory: () -> KmValueParameter?,
val argIndex: Int
) : JavacVariableElement(env, containing, element), XExecutableParameterElement {
+ private val kotlinMetadata by lazy { kotlinMetadataFactory() }
+
override val name: String
get() = (kotlinMetadata?.name ?: super.name).sanitizeAsJavaParameterName(
argIndex = argIndex
@@ -43,11 +45,13 @@
get() = kotlinMetadata?.hasDefault() ?: false
override val fallbackLocationText: String
- get() = if (executable is JavacMethodElement && executable.isSuspendFunction() &&
- this === executable.parameters.last()
+ get() = if (
+ enclosingMethodElement is JavacMethodElement &&
+ enclosingMethodElement.isSuspendFunction() &&
+ this === enclosingMethodElement.parameters.last()
) {
- "return type of ${executable.fallbackLocationText}"
+ "return type of ${enclosingMethodElement.fallbackLocationText}"
} else {
- "$name in ${executable.fallbackLocationText}"
+ "$name in ${enclosingMethodElement.fallbackLocationText}"
}
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt
index f230ef6..16c191d 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRoundEnv.kt
@@ -35,17 +35,21 @@
}.toSet()
}
+ override val isProcessingOver: Boolean
+ get() = delegate.processingOver()
+
override fun getElementsAnnotatedWith(klass: KClass<out Annotation>): Set<XElement> {
val elements = delegate.getElementsAnnotatedWith(klass.java)
return wrapAnnotatedElements(elements, klass.java.canonicalName)
}
override fun getElementsAnnotatedWith(annotationQualifiedName: String): Set<XElement> {
- val element = env.elementUtils.getTypeElement(annotationQualifiedName)
- ?: error("Cannot find TypeElement: $annotationQualifiedName")
-
- val elements = delegate.getElementsAnnotatedWith(element)
-
+ if (annotationQualifiedName == "*") {
+ return emptySet()
+ }
+ val annotationTypeElement =
+ env.elementUtils.getTypeElement(annotationQualifiedName) ?: return emptySet()
+ val elements = delegate.getElementsAnnotatedWith(annotationTypeElement)
return wrapAnnotatedElements(elements, annotationQualifiedName)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspBasicAnnotationProcessor.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspBasicAnnotationProcessor.kt
index 7896f48..8c0ee1a 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspBasicAnnotationProcessor.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspBasicAnnotationProcessor.kt
@@ -16,16 +16,15 @@
package androidx.room.compiler.processing.ksp
+import androidx.room.compiler.processing.CommonProcessorDelegate
import androidx.room.compiler.processing.XBasicAnnotationProcessor
-import androidx.room.compiler.processing.XElement
import androidx.room.compiler.processing.XProcessingEnv
-import com.google.devtools.ksp.isLocal
+import com.google.devtools.ksp.processing.KSPLogger
import com.google.devtools.ksp.processing.Resolver
import com.google.devtools.ksp.processing.SymbolProcessor
import com.google.devtools.ksp.processing.SymbolProcessorEnvironment
import com.google.devtools.ksp.symbol.KSAnnotated
-import com.google.devtools.ksp.symbol.KSDeclaration
-import com.google.devtools.ksp.validate
+import com.google.devtools.ksp.symbol.KSNode
/**
* KSP implementation of a [XBasicAnnotationProcessor] with built-in support for validating and
@@ -35,57 +34,55 @@
val symbolProcessorEnvironment: SymbolProcessorEnvironment
) : SymbolProcessor, XBasicAnnotationProcessor {
+ private val logger = DelegateLogger(symbolProcessorEnvironment.logger)
+
private val xEnv = KspProcessingEnv(
symbolProcessorEnvironment.options,
symbolProcessorEnvironment.codeGenerator,
- symbolProcessorEnvironment.logger
+ logger
)
+ // Cache and lazily get steps during the initial process() so steps initialization is done once.
+ private val steps by lazy { processingSteps().toList() }
+
+ private val commonDelegate by lazy { CommonProcessorDelegate(this.javaClass, xEnv, steps) }
+
final override val xProcessingEnv: XProcessingEnv get() = xEnv
- // Cache and lazily get steps during the initial process() so steps initialization is done once.
- private val steps by lazy { processingSteps() }
-
final override fun process(resolver: Resolver): List<KSAnnotated> {
xEnv.resolver = resolver // Set the resolver at the beginning of each round
- val xRoundEnv = KspRoundEnv(xEnv)
- val deferredElements = steps.flatMap { step ->
- val invalidElements = mutableSetOf<XElement>()
- val elementsByAnnotation = step.annotations().mapNotNull { annotation ->
- val annotatedElements = xRoundEnv.getElementsAnnotatedWith(annotation)
- val validElements = annotatedElements
- .filter { (it as KspElement).declaration.validateExceptLocals() }
- .toSet()
- invalidElements.addAll(annotatedElements - validElements)
- if (validElements.isNotEmpty()) {
- annotation to validElements
- } else {
- null
- }
- }.toMap()
- // Only process the step if there are annotated elements found for this step.
- if (elementsByAnnotation.isNotEmpty()) {
- invalidElements + step.process(xEnv, elementsByAnnotation)
- } else {
- invalidElements
- }
- }
+ val xRoundEnv = KspRoundEnv(xEnv, false)
+ commonDelegate.processRound(xRoundEnv)
postRound(xEnv, xRoundEnv)
xEnv.clearCache() // Reset cache after every round to avoid leaking elements across rounds
- return deferredElements.map { (it as KspElement).declaration }
+ // TODO(b/201307003): Use KSP deferring API.
+ // For now don't defer symbols since this impl of basic annotation processor mimics
+ // javac's impl where elements are deferred by remembering the name of the closest enclosing
+ // type element and later in a subsequent round finding the type element using the
+ // Resolver and then searching it for annotations requested by the steps.
+ return emptyList()
}
-}
-/**
- * TODO remove this once we update to KSP beta03
- * https://github.com/google/ksp/pull/479
- */
-private fun KSAnnotated.validateExceptLocals(): Boolean {
- return this.validate { parent, current ->
- // skip locals
- // https://github.com/google/ksp/issues/489
- val skip = (parent as? KSDeclaration)?.isLocal() == true ||
- (current as? KSDeclaration)?.isLocal() == true
- !skip
+ final override fun finish() {
+ val xRoundEnv = KspRoundEnv(xEnv, true)
+ val missingElements = commonDelegate.processLastRound()
+ postRound(xEnv, xRoundEnv)
+ if (!logger.hasError) {
+ // Report missing elements if no error was raised to avoid being noisy.
+ commonDelegate.reportMissingElements(missingElements)
+ }
+ }
+
+ // KSPLogger delegate to keep track if an error was raised or not.
+ private class DelegateLogger(val delegate: KSPLogger) : KSPLogger by delegate {
+ var hasError = false
+ override fun error(message: String, symbol: KSNode?) {
+ hasError = true
+ delegate.error(message, symbol)
+ }
+ override fun exception(e: Throwable) {
+ hasError = true
+ delegate.exception(e)
+ }
}
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
index 393b554..13913a4 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspElement.kt
@@ -23,6 +23,7 @@
import com.google.devtools.ksp.symbol.KSDeclaration
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
import com.google.devtools.ksp.symbol.KSPropertyDeclaration
+import com.google.devtools.ksp.validate
import java.util.Locale
internal abstract class KspElement(
@@ -55,4 +56,8 @@
override val docComment: String? by lazy {
(declaration as? KSDeclaration)?.docString
}
+
+ override fun validate(): Boolean {
+ return declaration.validate()
+ }
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt
index 5e620f7..bc3c358 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableElement.kt
@@ -56,7 +56,7 @@
declaration.parameters.map {
KspExecutableParameterElement(
env = env,
- method = this,
+ enclosingMethodElement = this,
parameter = it
)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
index 168d33a..b585d2d 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspExecutableParameterElement.kt
@@ -20,18 +20,19 @@
import androidx.room.compiler.processing.XExecutableParameterElement
import androidx.room.compiler.processing.XType
import androidx.room.compiler.processing.ksp.KspAnnotated.UseSiteFilter.Companion.NO_USE_SITE_OR_METHOD_PARAMETER
+import com.google.devtools.ksp.symbol.KSFunctionDeclaration
import com.google.devtools.ksp.symbol.KSValueParameter
internal class KspExecutableParameterElement(
env: KspProcessingEnv,
- val method: KspExecutableElement,
+ override val enclosingMethodElement: KspExecutableElement,
val parameter: KSValueParameter
) : KspElement(env, parameter),
XExecutableParameterElement,
XAnnotated by KspAnnotated.create(env, parameter, NO_USE_SITE_OR_METHOD_PARAMETER) {
override val equalityItems: Array<out Any?>
- get() = arrayOf(method, parameter)
+ get() = arrayOf(enclosingMethodElement, parameter)
override val name: String
get() = parameter.name?.asString() ?: "_no_param_name"
@@ -41,8 +42,8 @@
override val type: KspType by lazy {
parameter.typeAsMemberOf(
- functionDeclaration = method.declaration,
- ksType = method.containing.type?.ksType
+ functionDeclaration = enclosingMethodElement.declaration,
+ ksType = enclosingMethodElement.containing.type?.ksType
).let {
env.wrap(
originatingReference = parameter.type,
@@ -52,15 +53,15 @@
}
override val fallbackLocationText: String
- get() = "$name in ${method.fallbackLocationText}"
+ get() = "$name in ${enclosingMethodElement.fallbackLocationText}"
override fun asMemberOf(other: XType): KspType {
- if (method.containing.type?.isSameType(other) != false) {
+ if (enclosingMethodElement.containing.type?.isSameType(other) != false) {
return type
}
check(other is KspType)
return parameter.typeAsMemberOf(
- functionDeclaration = method.declaration,
+ functionDeclaration = enclosingMethodElement.declaration,
ksType = other.ksType
).let {
env.wrap(
@@ -73,4 +74,26 @@
override fun kindName(): String {
return "function parameter"
}
+
+ companion object {
+ fun create(
+ env: KspProcessingEnv,
+ parameter: KSValueParameter
+ ): KspExecutableParameterElement {
+ val parent = checkNotNull(parameter.parent) {
+ "Expected value parameter '$parameter' to contain a parent node."
+ }
+ if (parent !is KSFunctionDeclaration) {
+ error(
+ "Don't know how to create a parameter element whose parent is a " +
+ "'${parent::class}'"
+ )
+ }
+ return KspExecutableParameterElement(
+ env = env,
+ enclosingMethodElement = KspExecutableElement.create(env, parent),
+ parameter = parameter
+ )
+ }
+ }
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
index d02b407..83ce6bf 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
@@ -20,6 +20,7 @@
import com.google.devtools.ksp.symbol.AnnotationUseSiteTarget
import com.google.devtools.ksp.symbol.KSDeclaration
import com.google.devtools.ksp.symbol.KSFile
+import com.google.devtools.ksp.validate
import com.squareup.javapoet.ClassName
/**
@@ -61,6 +62,10 @@
override val docComment: String?
get() = null
+ override fun validate(): Boolean {
+ return ksFile.validate()
+ }
+
companion object {
private fun KSFile.findClassName(): String {
return annotations.firstOrNull {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt
index e0fa644..9fe2531 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodElement.kt
@@ -124,7 +124,7 @@
override val parameters: List<XExecutableParameterElement>
get() = super.parameters + KspSyntheticContinuationParameterElement(
env = env,
- containing = this
+ enclosingMethodElement = this
)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt
index ea17e57..ae79a0d 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspProcessingEnv.kt
@@ -241,7 +241,6 @@
}
internal fun clearCache() {
- _resolver = null
typeElementStore.clear()
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt
index d94df42..b9c13a4 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRoundEnv.kt
@@ -23,10 +23,12 @@
import com.google.devtools.ksp.symbol.KSFunctionDeclaration
import com.google.devtools.ksp.symbol.KSPropertyAccessor
import com.google.devtools.ksp.symbol.KSPropertyDeclaration
+import com.google.devtools.ksp.symbol.KSValueParameter
import kotlin.reflect.KClass
internal class KspRoundEnv(
- private val env: KspProcessingEnv
+ private val env: KspProcessingEnv,
+ override val isProcessingOver: Boolean
) : XRoundEnv {
override val rootElements: Set<XElement>
get() = TODO("not supported")
@@ -53,6 +55,9 @@
is KSPropertyAccessor -> {
KspSyntheticPropertyMethodElement.create(env, symbol)
}
+ is KSValueParameter -> {
+ KspExecutableParameterElement.create(env, symbol)
+ }
else -> error("Unsupported $symbol with annotation $annotationQualifiedName")
}
}.toSet()
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
index 3ebf79b..3264948 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticContinuationParameterElement.kt
@@ -31,12 +31,12 @@
import com.google.devtools.ksp.symbol.Variance
/**
- * XProcessing adds an additional argument to each suspend function for the continiuation because
+ * XProcessing adds an additional argument to each suspend function for the continuation because
* this is what KAPT generates and Room needs it as long as it generates java code.
*/
internal class KspSyntheticContinuationParameterElement(
private val env: KspProcessingEnv,
- private val containing: KspExecutableElement
+ override val enclosingMethodElement: KspExecutableElement
) : XExecutableParameterElement,
XEquality,
XAnnotated by KspAnnotated.create(
@@ -50,7 +50,7 @@
var candidate = "continuation"
var suffix = 0
while (
- containing.declaration.parameters.any { it.name?.asString() == candidate }
+ enclosingMethodElement.declaration.parameters.any { it.name?.asString() == candidate }
) {
candidate = "continuation_$suffix"
suffix ++
@@ -59,7 +59,7 @@
}
override val equalityItems: Array<out Any?> by lazy {
- arrayOf("continuation", containing)
+ arrayOf("continuation", enclosingMethodElement)
}
override val hasDefaultValue: Boolean
@@ -70,7 +70,7 @@
val contType = continuation.asType(
listOf(
env.resolver.getTypeArgument(
- checkNotNull(containing.declaration.returnType) {
+ checkNotNull(enclosingMethodElement.declaration.returnType) {
"cannot find return type for $this"
},
Variance.CONTRAVARIANT
@@ -84,7 +84,7 @@
}
override val fallbackLocationText: String
- get() = "return type of ${containing.fallbackLocationText}"
+ get() = "return type of ${enclosingMethodElement.fallbackLocationText}"
// Not applicable
override val docComment: String? get() = null
@@ -92,10 +92,10 @@
override fun asMemberOf(other: XType): XType {
check(other is KspType)
val continuation = env.resolver.requireContinuationClass()
- val asMember = containing.declaration.returnTypeAsMemberOf(
+ val asMember = enclosingMethodElement.declaration.returnTypeAsMemberOf(
ksType = other.ksType
)
- val returnTypeRef = checkNotNull(containing.declaration.returnType) {
+ val returnTypeRef = checkNotNull(enclosingMethodElement.declaration.returnType) {
"cannot find return type reference for $this"
}
val returnTypeAsTypeArgument = env.resolver.getTypeArgument(
@@ -113,6 +113,10 @@
return "synthetic continuation parameter"
}
+ override fun validate(): Boolean {
+ return true
+ }
+
override fun equals(other: Any?): Boolean {
return XEquality.equals(this, other)
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt
index 35dc043..17505b0 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt
@@ -72,6 +72,10 @@
override val docComment: String?
get() = null
+ override fun validate(): Boolean {
+ return true
+ }
+
override fun <T : Annotation> getAnnotations(annotation: KClass<T>): List<XAnnotationBox<T>> {
return emptyList()
}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
index 9c9e4f9..63d4bae 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticPropertyMethodElement.kt
@@ -93,6 +93,10 @@
override val docComment: String?
get() = null
+ override fun validate(): Boolean {
+ return true
+ }
+
@OptIn(KspExperimental::class)
override val thrownTypes: List<XType> by lazy {
env.resolver.getJvmCheckedException(accessor).map {
@@ -181,7 +185,7 @@
listOf(
SyntheticExecutableParameterElement(
env = env,
- origin = this
+ enclosingMethodElement = this
)
)
}
@@ -192,29 +196,29 @@
private class SyntheticExecutableParameterElement(
env: KspProcessingEnv,
- private val origin: Setter
+ override val enclosingMethodElement: Setter
) : XExecutableParameterElement,
XAnnotated by KspAnnotated.create(
env = env,
- delegate = origin.field.declaration.setter?.parameter,
+ delegate = enclosingMethodElement.field.declaration.setter?.parameter,
filter = NO_USE_SITE_OR_SET_PARAM
) {
override val name: String by lazy {
- val originalName = origin.accessor.parameter.name?.asString()
+ val originalName = enclosingMethodElement.accessor.parameter.name?.asString()
originalName.sanitizeAsJavaParameterName(0)
}
override val type: XType
- get() = origin.field.type
+ get() = enclosingMethodElement.field.type
override val fallbackLocationText: String
- get() = "$name in ${origin.fallbackLocationText}"
+ get() = "$name in ${enclosingMethodElement.fallbackLocationText}"
override val hasDefaultValue: Boolean
get() = false
override fun asMemberOf(other: XType): XType {
- return origin.field.asMemberOf(other)
+ return enclosingMethodElement.field.asMemberOf(other)
}
override val docComment: String?
@@ -223,6 +227,10 @@
override fun kindName(): String {
return "method parameter"
}
+
+ override fun validate(): Boolean {
+ return true
+ }
}
}
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
index f55ec49..0985b25 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
@@ -26,7 +26,6 @@
import androidx.room.compiler.processing.util.getParameter
import androidx.room.compiler.processing.util.runProcessorTest
import androidx.room.compiler.processing.util.typeName
-import com.google.common.truth.Truth
import com.google.common.truth.Truth.assertThat
import com.google.common.truth.Truth.assertWithMessage
import com.squareup.javapoet.ClassName
@@ -51,6 +50,7 @@
"""
package foo.bar;
public class Baz {
+ public Baz(String param1) {}
private void foo() {}
public String bar(String[] param1) {
return "";
@@ -79,9 +79,14 @@
check(paramType.isArray())
assertThat(paramType.componentType.typeName)
.isEqualTo(String::class.typeName())
+ assertThat(param.enclosingMethodElement).isEqualTo(method)
}
assertThat(method.returnType.typeName).isEqualTo(String::class.typeName())
}
+ element.getConstructors().single().let { ctor ->
+ assertThat(ctor.parameters).hasSize(1)
+ assertThat(ctor.parameters.single().enclosingMethodElement).isEqualTo(ctor)
+ }
}
}
@@ -346,12 +351,15 @@
}
subject.getMethod("intReturn").let { method ->
assertThat(method.parameters).hasSize(1)
- assertThat(method.parameters.last().type.typeName).isEqualTo(
- ParameterizedTypeName.get(
- CONTINUATION_CLASS_NAME,
- WildcardTypeName.supertypeOf(Integer::class.java)
+ method.parameters.last().let { cont ->
+ assertThat(cont.type.typeName).isEqualTo(
+ ParameterizedTypeName.get(
+ CONTINUATION_CLASS_NAME,
+ WildcardTypeName.supertypeOf(Integer::class.java)
+ )
)
- )
+ assertThat(cont.enclosingMethodElement).isEqualTo(method)
+ }
assertThat(method.isSuspendFunction()).isTrue()
assertThat(method.returnType.typeName).isEqualTo(TypeName.OBJECT)
method.executableType.parameterTypes.last().let { cont ->
@@ -546,7 +554,7 @@
}
listOf(impl, javaImpl).forEach { subject ->
listOf("getY", "getX", "setY").forEach { methodName ->
- Truth.assertWithMessage("${subject.className}:$methodName").that(
+ assertWithMessage("${subject.className}:$methodName").that(
overrides(
owner = subject,
ownerMethodName = methodName,
@@ -555,7 +563,7 @@
).isTrue()
}
- Truth.assertWithMessage(subject.className.canonicalName()).that(
+ assertWithMessage(subject.className.canonicalName()).that(
overrides(
owner = subject,
ownerMethodName = "getY",
@@ -564,7 +572,7 @@
)
).isFalse()
- Truth.assertWithMessage(subject.className.canonicalName()).that(
+ assertWithMessage(subject.className.canonicalName()).that(
overrides(
owner = subject,
ownerMethodName = "getY",
@@ -573,7 +581,7 @@
)
).isFalse()
- Truth.assertWithMessage(subject.className.canonicalName()).that(
+ assertWithMessage(subject.className.canonicalName()).that(
overrides(
owner = base,
ownerMethodName = "getX",
@@ -582,7 +590,7 @@
)
).isFalse()
- Truth.assertWithMessage(subject.className.canonicalName()).that(
+ assertWithMessage(subject.className.canonicalName()).that(
overrides(
owner = subject,
ownerMethodName = "setY",
@@ -591,7 +599,7 @@
)
).isFalse()
- Truth.assertWithMessage(subject.className.canonicalName()).that(
+ assertWithMessage(subject.className.canonicalName()).that(
overrides(
owner = subject,
ownerMethodName = "setY",
@@ -1025,11 +1033,11 @@
).isEqualTo(
"""
getAndReturnKey(java.lang.Integer):java.lang.Integer
- getAndReturnKeyOverridden(int):java.lang.Integer
getAndReturnKeyOverridden(java.lang.Integer):java.lang.Integer
+ getAndReturnKeyOverridden(int):java.lang.Integer
getKey(java.lang.Integer):void
- getKeyOverridden(int):void
getKeyOverridden(java.lang.Integer):void
+ getKeyOverridden(int):void
returnKey():java.lang.Integer
returnKeyOverridden():java.lang.Integer
""".trimIndent()
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
index 993a4d0..11281de 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
@@ -19,10 +19,13 @@
import androidx.room.compiler.processing.javac.JavacBasicAnnotationProcessor
import androidx.room.compiler.processing.ksp.KspBasicAnnotationProcessor
import androidx.room.compiler.processing.ksp.KspElement
+import androidx.room.compiler.processing.testcode.AnywhereAnnotation
import androidx.room.compiler.processing.testcode.MainAnnotation
import androidx.room.compiler.processing.testcode.OtherAnnotation
+import androidx.room.compiler.processing.testcode.SingleTypeValueAnnotation
import androidx.room.compiler.processing.util.CompilationTestCapabilities
import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.className
import androidx.room.compiler.processing.util.compiler.TestCompilationArguments
import androidx.room.compiler.processing.util.compiler.compile
import com.google.common.truth.Truth.assertAbout
@@ -42,6 +45,7 @@
import org.junit.Rule
import org.junit.Test
import org.junit.rules.TemporaryFolder
+import javax.tools.Diagnostic
import kotlin.reflect.KClass
class XProcessingStepTest {
@@ -492,6 +496,46 @@
}
@Test
+ fun javacReturnsUnprocessed() {
+ val processingStep = object : XProcessingStep {
+ override fun process(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ): Set<XElement> {
+ return elementsByAnnotation.values.flatten().toSet()
+ }
+ override fun annotations(): Set<String> {
+ return setOf(OtherAnnotation::class.qualifiedName!!)
+ }
+ }
+ val main = Source.java(
+ "foo.bar.Other",
+ """
+ package foo.bar;
+ import androidx.room.compiler.processing.testcode.*;
+ @OtherAnnotation("y")
+ class Other {
+ }
+ """.trimIndent()
+ )
+ assertAbout(
+ JavaSourcesSubjectFactory.javaSources()
+ ).that(
+ listOf(main.toJFO())
+ ).processedWith(
+ object : JavacBasicAnnotationProcessor() {
+ override fun processingSteps() = listOf(processingStep)
+ }
+ ).failsToCompile()
+ // processor name is 'null' because it is a local anonymous class
+ .withErrorContaining(
+ "null was unable to process 'foo.bar.Other' because not all of its dependencies " +
+ "could be resolved. Check for compilation errors or a circular dependency " +
+ "with generated code."
+ )
+ }
+
+ @Test
fun kspReturnsUnprocessed() {
CompilationTestCapabilities.assumeKspIsEnabled()
var returned: Set<XElement>? = null
@@ -528,14 +572,13 @@
""".trimIndent()
)
- compile(
+ val result = compile(
workingDir = temporaryFolder.root,
arguments = TestCompilationArguments(
sources = listOf(main),
symbolProcessorProviders = listOf(processorProvider)
)
)
-
assertThat(returned).apply {
isNotNull()
isNotEmpty()
@@ -544,6 +587,15 @@
returned!!.map { (it as KspElement).declaration }.first() as KSClassDeclaration
assertThat(element.classKind).isEqualTo(ClassKind.CLASS)
assertThat(element.qualifiedName!!.asString()).isEqualTo("foo.bar.Other")
+ assertThat(result.success).isFalse()
+ // processor name is 'null' because it is a local anonymous class
+ assertThat(
+ result.diagnostics[Diagnostic.Kind.ERROR]?.map { it.msg } ?: emptyList<String>()
+ ).containsExactly(
+ "null was unable to process 'foo.bar.Other' because not all of its dependencies " +
+ "could be resolved. Check for compilation errors or a circular dependency with " +
+ "generated code."
+ )
}
@Test
@@ -629,6 +681,7 @@
""".trimIndent()
)
val stepsProcessed = mutableListOf<XProcessingStep>()
+ var invokedProcessOver = 0
val mainStep = object : XProcessingStep {
var round = 0
override fun annotations() = setOf(MainAnnotation::class.qualifiedName!!)
@@ -652,8 +705,16 @@
}
return deferredElements
}
+
+ override fun processOver(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ) {
+ invokedProcessOver++
+ }
}
var invokedProcessingSteps = 0
+ val invokedPostRound = mutableListOf<Boolean>()
assertAbout(
JavaSourcesSubjectFactory.javaSources()
).that(
@@ -664,6 +725,10 @@
invokedProcessingSteps++
return listOf(mainStep)
}
+
+ override fun postRound(env: XProcessingEnv, round: XRoundEnv) {
+ invokedPostRound.add(round.isProcessingOver)
+ }
}
).compilesWithoutError()
@@ -672,6 +737,87 @@
// Assert processingSteps() was only called once
assertThat(invokedProcessingSteps).isEqualTo(1)
+
+ // Assert processOver() was only called once
+ assertThat(invokedProcessOver).isEqualTo(1)
+
+ // Assert postRound() is invoked exactly 3 times, and the last round env reported
+ // that processing was over.
+ assertThat(invokedPostRound).containsExactly(false, false, true)
+ }
+
+ @Test
+ fun javacDeferredViaException() {
+ val main = JavaFileObjects.forSourceString(
+ "foo.bar.Main",
+ """
+ package foo.bar;
+ import androidx.room.compiler.processing.testcode.*;
+ @MainAnnotation(
+ typeList = {},
+ singleType = AnotherSource.class,
+ intMethod = 3,
+ singleOtherAnnotation = @OtherAnnotation("y")
+ )
+ class Main {}
+ """.trimIndent()
+ )
+ val anotherSource = JavaFileObjects.forSourceString(
+ "foo.bar.AnotherSource",
+ """
+ package foo.bar;
+ import androidx.room.compiler.processing.testcode.*;
+ @SingleTypeValueAnnotation(GeneratedType.class)
+ class AnotherSource { }
+ """.trimIndent()
+ )
+ var round = 0
+ val genClassName = ClassName.get("foo.bar", "GeneratedType")
+ val mainStep = object : XProcessingStep {
+ override fun annotations() = setOf(MainAnnotation::class.qualifiedName!!)
+ override fun process(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ): Set<XElement> {
+ if (round++ == 0) {
+ // Generate the interface, should not be resolvable in 1st round
+ val spec = TypeSpec.interfaceBuilder(genClassName).build()
+ JavaFile.builder(genClassName.packageName(), spec)
+ .build()
+ .writeTo(env.filer)
+ }
+ val mainElement =
+ elementsByAnnotation[MainAnnotation::class.qualifiedName!!]!!.single()
+ try {
+ val otherElement = env.requireTypeElement(
+ mainElement.requireAnnotation(MainAnnotation::class.className())
+ .getAsType("singleType")
+ .typeName
+ )
+ val generatedType =
+ otherElement.requireAnnotation(SingleTypeValueAnnotation::class.className())
+ .getAsType("value")
+ assertThat(generatedType.typeName).isEqualTo(genClassName)
+ return emptySet()
+ } catch (ex: TypeNotPresentException) {
+ return setOf(mainElement)
+ }
+ }
+ }
+ assertAbout(
+ JavaSourcesSubjectFactory.javaSources()
+ ).that(
+ listOf(main, anotherSource)
+ ).processedWith(
+ object : JavacBasicAnnotationProcessor() {
+ override fun processingSteps(): List<XProcessingStep> {
+ return listOf(mainStep)
+ }
+ }
+ ).compilesWithoutError()
+
+ // Expect two rounds due to implicit deferring caused by missing type.
+ assertThat(round).isEqualTo(2)
}
@Test
@@ -805,6 +951,7 @@
""".trimIndent()
)
val stepsProcessed = mutableListOf<XProcessingStep>()
+ var invokedProcessOver = 0
val mainStep = object : XProcessingStep {
var round = 0
override fun annotations() = setOf(MainAnnotation::class.qualifiedName!!)
@@ -828,8 +975,16 @@
}
return deferredElements
}
+
+ override fun processOver(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ) {
+ invokedProcessOver++
+ }
}
var invokedProcessingSteps = 0
+ val invokedPostRound = mutableListOf<Boolean>()
val processorProvider = object : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
return object : KspBasicAnnotationProcessor(environment) {
@@ -837,6 +992,10 @@
invokedProcessingSteps++
return listOf(mainStep)
}
+
+ override fun postRound(env: XProcessingEnv, round: XRoundEnv) {
+ invokedPostRound.add(round.isProcessingOver)
+ }
}
}
}
@@ -852,6 +1011,13 @@
// Assert processingSteps() was only called once
assertThat(invokedProcessingSteps).isEqualTo(1)
+
+ // Assert processOver() was only called once
+ assertThat(invokedProcessOver).isEqualTo(1)
+
+ // Assert postRound() is invoked exactly 3 times, and the last round env reported
+ // that processing was over.
+ assertThat(invokedPostRound).containsExactly(false, false, true)
}
@Test
@@ -908,4 +1074,182 @@
)
assertThat(stepsProcessed).containsExactly(mainStep)
}
+
+ @Test
+ fun kspVariousDeferredElements() {
+ val main = Source.kotlin(
+ "Main.kt",
+ """
+ package foo.bar
+ import androidx.room.compiler.processing.testcode.*
+ class Main {
+ @AnywhereAnnotation fun mainMethod() {}
+ class InnerMain {
+ @AnywhereAnnotation fun innerMethod() {}
+ }
+ }
+ """.trimIndent()
+ )
+ val extra = Source.kotlin(
+ "Extra.kt",
+ """
+ package foo.bar
+ import androidx.room.compiler.processing.testcode.*
+ class Extra {
+ fun mainMethod(@AnywhereAnnotation param: String) {}
+ }
+ """.trimIndent()
+ )
+ val assertRound: (Int, List<XElement>) -> Unit = { roundIndex, roundReceivedElements ->
+ if (roundIndex == 1) {
+ // Verify the deferred elements
+ roundReceivedElements.let { elements ->
+ val methods = elements.filterIsInstance<XMethodElement>()
+ val params = elements.filterIsInstance<XExecutableParameterElement>()
+ assertThat(methods).hasSize(2)
+ assertThat(methods.firstOrNull { it.name == "mainMethod" }).isNotNull()
+ assertThat(methods.firstOrNull { it.name == "innerMethod" }).isNotNull()
+ assertThat(params).hasSize(1)
+ assertThat(params.firstOrNull { it.name == "param" }).isNotNull()
+ }
+ }
+ }
+ val roundReceivedElementsHashes = mutableListOf<Set<Int>>()
+ val mainStep = object : XProcessingStep {
+ var round = 0
+ override fun annotations() = setOf(AnywhereAnnotation::class.qualifiedName!!)
+ override fun process(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ): Set<XElement> {
+ elementsByAnnotation.values.flatten().let {
+ assertRound(round, it)
+ roundReceivedElementsHashes.add(it.map { it.hashCode() }.toSet())
+ }
+ return if (round++ == 0) {
+ // Generate a random class to trigger another processing round
+ val className = ClassName.get("foo.bar", "Main_Impl")
+ val spec = TypeSpec.classBuilder(className).build()
+ JavaFile.builder(className.packageName(), spec)
+ .build()
+ .writeTo(env.filer)
+ elementsByAnnotation.values.flatten().toSet()
+ } else {
+ emptySet()
+ }
+ }
+ }
+ val processorProvider = SymbolProcessorProvider { environment ->
+ object : KspBasicAnnotationProcessor(environment) {
+ override fun processingSteps() = listOf(mainStep)
+ }
+ }
+ val compileResult = compile(
+ workingDir = temporaryFolder.root,
+ arguments = TestCompilationArguments(
+ sources = listOf(main, extra),
+ symbolProcessorProviders = listOf(processorProvider)
+ )
+ )
+ assertThat(compileResult.success).isTrue()
+
+ // Expect 2 rounds of processing
+ assertThat(roundReceivedElementsHashes).hasSize(2)
+ // Expect 3 annotated elements at around 0
+ assertThat(roundReceivedElementsHashes[0]).hasSize(3)
+ // Expect 3 annotated elements at around 1 (they were deferred)
+ assertThat(roundReceivedElementsHashes[1]).hasSize(3)
+ // Verify none of the deferred elements match in equality of previous rounds, i.e. they
+ // are not being cached.
+ assertThat(
+ roundReceivedElementsHashes[0].none { roundReceivedElementsHashes[1].contains(it) }
+ ).isTrue()
+ }
+
+ @Test
+ fun javacVariousDeferredElements() {
+ val main = Source.java(
+ "foo.bar.Main",
+ """
+ package foo.bar;
+ import androidx.room.compiler.processing.testcode.*;
+ public class Main {
+ @AnywhereAnnotation void mainMethod() {}
+ static class InnerMain {
+ @AnywhereAnnotation void innerMethod() {}
+ }
+ }
+ """.trimIndent()
+ ).toJFO()
+ val extra = Source.java(
+ "foo.bar.Extra",
+ """
+ package foo.bar;
+ import androidx.room.compiler.processing.testcode.*;
+ public class Extra {
+ void mainMethod(@AnywhereAnnotation String param) {}
+ }
+ """.trimIndent()
+ ).toJFO()
+ val assertRound: (Int, List<XElement>) -> Unit = { roundIndex, roundReceivedElements ->
+ if (roundIndex == 1) {
+ // Verify the deferred elements
+ roundReceivedElements.let { elements ->
+ val methods = elements.filterIsInstance<XMethodElement>()
+ val params = elements.filterIsInstance<XExecutableParameterElement>()
+ assertThat(methods).hasSize(2)
+ assertThat(methods.firstOrNull { it.name == "mainMethod" }).isNotNull()
+ assertThat(methods.firstOrNull { it.name == "innerMethod" }).isNotNull()
+ assertThat(params).hasSize(1)
+ assertThat(params.firstOrNull { it.name == "param" }).isNotNull()
+ }
+ }
+ }
+ val roundReceivedElementsHashes = mutableListOf<Set<Int>>()
+ val mainStep = object : XProcessingStep {
+ var round = 0
+ override fun annotations() = setOf(AnywhereAnnotation::class.qualifiedName!!)
+ override fun process(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ): Set<XElement> {
+ elementsByAnnotation.values.flatten().let {
+ assertRound(round, it)
+ roundReceivedElementsHashes.add(it.map { it.hashCode() }.toSet())
+ }
+ return if (round++ == 0) {
+ // Generate a random class to trigger another processing round
+ val className = ClassName.get("foo.bar", "Main_Impl")
+ val spec = TypeSpec.classBuilder(className).build()
+ JavaFile.builder(className.packageName(), spec)
+ .build()
+ .writeTo(env.filer)
+ elementsByAnnotation.values.flatten().toSet()
+ } else {
+ emptySet()
+ }
+ }
+ }
+ assertAbout(
+ JavaSourcesSubjectFactory.javaSources()
+ ).that(
+ listOf(main, extra)
+ ).processedWith(
+ object : JavacBasicAnnotationProcessor() {
+ override fun processingSteps() = listOf(mainStep)
+ }
+ ).compilesWithoutError()
+
+ // Expect 2 rounds of processing
+ assertThat(roundReceivedElementsHashes).hasSize(2)
+ // Expect 3 annotated elements at around 0
+ assertThat(roundReceivedElementsHashes[0]).hasSize(3)
+ // Expect 3 annotated elements at around 1 (they were deferred)
+ assertThat(roundReceivedElementsHashes[1]).hasSize(3)
+ // Verify none of the deferred elements match in equality of previous rounds, i.e. they
+ // are not being cached.
+ assertThat(
+ roundReceivedElementsHashes[0].none { roundReceivedElementsHashes[1].contains(it) }
+ ).isTrue()
+ }
}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt
index 5e76aa8b..14bc4c7 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt
@@ -265,6 +265,78 @@
}
}
+ @Test
+ fun getAnnotatedParamElements() {
+ runProcessorTest(
+ listOf(
+ Source.kotlin(
+ "Baz.kt",
+ """
+ import androidx.room.compiler.processing.XRoundEnvTest.TopLevelAnnotation
+ class Baz constructor(
+ @param:TopLevelAnnotation val ctorProperty: String,
+ @TopLevelAnnotation ctorParam: String
+ ) {
+ @setparam:TopLevelAnnotation
+ var property: String = ""
+ fun method(@TopLevelAnnotation methodParam: String) {}
+ }
+ """.trimIndent()
+ )
+ )
+ ) { testInvocation ->
+ val typeElement = testInvocation.processingEnv.requireTypeElement("Baz")
+ val annotatedElements =
+ testInvocation.roundEnv.getElementsAnnotatedWith(TopLevelAnnotation::class)
+ val annotatedParams = annotatedElements.filterIsInstance<XExecutableParameterElement>()
+ if (!testInvocation.isKsp) {
+ // TODO: https://github.com/google/ksp/issues/636
+ // KSP can't find ctor param annotated elements from property
+ val ctorProperty = annotatedParams.first { it.name == "ctorProperty" }
+ assertThat(ctorProperty.enclosingMethodElement).isEqualTo(
+ typeElement.findPrimaryConstructor()
+ )
+ }
+ val ctorParam = annotatedParams.first { it.name == "ctorParam" }
+ assertThat(ctorParam.enclosingMethodElement).isEqualTo(
+ typeElement.findPrimaryConstructor()
+ )
+ if (!testInvocation.isKsp) {
+ // TODO: https://github.com/google/ksp/issues/636
+ // KSP can't find setter param annotated elements
+ val setterParam = annotatedParams.first { it.name == "p0" }
+ assertThat(setterParam.enclosingMethodElement).isEqualTo(
+ typeElement.getDeclaredMethod("setProperty")
+ )
+ }
+ val methodParam = annotatedParams.first { it.name == "methodParam" }
+ assertThat(methodParam.enclosingMethodElement).isEqualTo(
+ typeElement.getDeclaredMethod("method")
+ )
+ }
+ }
+
+ @Test
+ fun getElementsAnnotatedWithMissingTypeAnnotation() {
+ runProcessorTest(
+ listOf(
+ Source.kotlin(
+ "Baz.kt",
+ """
+ class Foo {}
+ """.trimIndent()
+ )
+ )
+ ) { testInvocation ->
+ // Expect zero elements to be returned from the round for an annotation whose type is
+ // missing. This is allowed since there are processors whose capabilities might be
+ // dynamic based on user classpath.
+ val annotatedElements =
+ testInvocation.roundEnv.getElementsAnnotatedWith("MissingTypeAnnotation")
+ assertThat(annotatedElements).hasSize(0)
+ }
+ }
+
annotation class TopLevelAnnotation
@Suppress("unused") // used in tests
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
index 46f1dd3..1b35fe9 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
@@ -782,6 +782,66 @@
}
@Test
+ fun overrideMethodWithCovariantReturnType() {
+ val src = Source.kotlin(
+ "ParentWithExplicitOverride.kt",
+ """
+ interface ParentWithExplicitOverride: ChildInterface, Child {
+ override fun child(): Child
+ }
+
+ interface ParentWithoutExplicitOverride: ChildInterface, Child
+
+ interface Child: ChildInterface {
+ override fun child(): Child
+ }
+
+ interface ChildInterface {
+ fun child(): ChildInterface
+ }
+ """.trimIndent()
+ )
+
+ runProcessorTest(sources = listOf(src)) { invocation ->
+ val objectMethodNames = invocation.processingEnv.requireTypeElement(Any::class)
+ .getAllMethods().names()
+ fun XMethodElement.signature(
+ owner: XType
+ ): String {
+ val methodType = this.asMemberOf(owner)
+ val params = methodType.parameterTypes.joinToString(",") {
+ it.typeName.toString()
+ }
+ return "$name($params):${returnType.typeName}"
+ }
+
+ fun XTypeElement.allMethodSignatures(): List<String> = getAllMethods().filterNot {
+ it.name in objectMethodNames
+ }.map { it.signature(this.type) }.toList()
+
+ invocation.processingEnv.requireTypeElement(
+ "ParentWithExplicitOverride"
+ ).let { parent ->
+ assertWithMessage(parent.qualifiedName).that(
+ parent.allMethodSignatures()
+ ).containsExactly(
+ "child():Child"
+ )
+ }
+
+ invocation.processingEnv.requireTypeElement(
+ "ParentWithoutExplicitOverride"
+ ).let { parent ->
+ assertWithMessage(parent.qualifiedName).that(
+ parent.allMethodSignatures()
+ ).containsExactly(
+ "child():Child"
+ )
+ }
+ }
+ }
+
+ @Test
fun allMethods() {
val src = Source.kotlin(
"Foo.kt",
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/AnywhereAnnotation.java
similarity index 73%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/AnywhereAnnotation.java
index 2ab52fb..107d21d 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/AnywhereAnnotation.java
@@ -14,7 +14,11 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.room.compiler.processing.testcode;
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+@Retention(RetentionPolicy.CLASS)
+public @interface AnywhereAnnotation {
+}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/SingleTypeValueAnnotation.java
similarity index 68%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/SingleTypeValueAnnotation.java
index 2ab52fb..678ded0 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/testcode/SingleTypeValueAnnotation.java
@@ -14,7 +14,15 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.room.compiler.processing.testcode;
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * used in compilation tests
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface SingleTypeValueAnnotation {
+ Class<?> value();
+}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt b/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
index 9165934..e33227f 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
@@ -20,9 +20,9 @@
import androidx.room.compiler.processing.XProcessingEnv
import androidx.room.compiler.processing.XProcessingStep
import androidx.room.compiler.processing.XTypeElement
+import androidx.room.log.RLog
import androidx.room.processor.Context
import androidx.room.processor.DatabaseProcessor
-import androidx.room.processor.MissingTypeException
import androidx.room.processor.ProcessorErrors
import androidx.room.util.SchemaFileResolver
import androidx.room.vo.DaoMethod
@@ -38,25 +38,62 @@
env: XProcessingEnv,
elementsByAnnotation: Map<String, Set<XElement>>
): Set<XTypeElement> {
+ return process(env, elementsByAnnotation, false)
+ }
+
+ override fun processOver(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>
+ ) {
+ process(env, elementsByAnnotation, true)
+ }
+
+ override fun annotations(): Set<String> {
+ return mutableSetOf(Database::class.qualifiedName!!)
+ }
+
+ private fun process(
+ env: XProcessingEnv,
+ elementsByAnnotation: Map<String, Set<XElement>>,
+ isProcessingOver: Boolean
+ ): Set<XTypeElement> {
val context = Context(env)
+
val rejectedElements = mutableSetOf<XTypeElement>()
val databases = elementsByAnnotation[Database::class.qualifiedName]
?.filterIsInstance<XTypeElement>()
- ?.mapNotNull {
- try {
+ ?.mapNotNull { annotatedElement ->
+ if (isProcessingOver && !annotatedElement.validate()) {
+ context.reportMissingTypeReference(annotatedElement.qualifiedName)
+ return@mapNotNull null
+ }
+ val (database, logs) = context.collectLogs { subContext ->
DatabaseProcessor(
- context,
- it
+ subContext,
+ annotatedElement
).process()
- } catch (ex: MissingTypeException) {
- // Abandon processing this database class since it needed a type element
- // that is missing. It is possible that the type will be generated by a
- // further annotation processing round, so we will try again by adding
- // this class element to a deferred set.
- rejectedElements.add(it)
- null
+ }
+ if (logs.hasMissingTypeErrors()) {
+ if (isProcessingOver) {
+ // Processing is done yet there are still missing type errors, only report
+ // those and don't generate code for the database class since compilation
+ // will fail anyway.
+ logs.writeTo(context, RLog.MissingTypeErrorFilter)
+ return@mapNotNull null
+ } else {
+ // Abandon processing this database class since it needed a type element
+ // that is missing. It is possible that the type will be generated by a
+ // further annotation processing round, so we will try again by adding
+ // this class element to a deferred set.
+ rejectedElements.add(annotatedElement)
+ return@mapNotNull null
+ }
+ } else {
+ logs.writeTo(context)
+ return@mapNotNull database
}
}
+
val daoMethodsMap = databases?.flatMap { db -> db.daoMethods.map { it to db } }?.toMap()
daoMethodsMap?.let {
prepareDaosForWriting(databases, it.keys.toList())
@@ -103,11 +140,8 @@
AutoMigrationWriter(db.element, autoMigration).write(context.processingEnv)
}
}
- return rejectedElements
- }
- override fun annotations(): Set<String> {
- return mutableSetOf(Database::class.qualifiedName!!)
+ return rejectedElements
}
/**
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/log/RLog.kt b/room/room-compiler/src/main/kotlin/androidx/room/log/RLog.kt
index be79b25..cb6f8f9 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/log/RLog.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/log/RLog.kt
@@ -90,33 +90,44 @@
annotation: XAnnotation?,
annotationValue: XAnnotationValue?
) {
- messages.getOrPut(
- kind,
- {
- arrayListOf()
- }
- ).add(DiagnosticMessage(msg, element, annotation, annotationValue))
+ messages.getOrPut(kind) { arrayListOf() }
+ .add(DiagnosticMessage(msg, element, annotation, annotationValue))
}
fun hasErrors() = messages.containsKey(ERROR)
- fun writeTo(context: Context) {
- messages.forEach { pair ->
- pair.value.forEach { diagnosticMessage ->
- printToMessager(
- context.logger.messager,
- pair.key,
- diagnosticMessage.msg,
- diagnosticMessage.element,
- diagnosticMessage.annotation,
- diagnosticMessage.annotationValue
- )
- }
+ fun hasMissingTypeErrors() = messages.getOrElse(ERROR) { emptyList() }
+ .any { it.msg.startsWith(MISSING_TYPE_PREFIX) }
+
+ fun writeTo(
+ context: Context,
+ filterPredicate: (Diagnostic.Kind, String) -> Boolean = { _, _ -> true }
+ ) {
+ messages.forEach { (kind, diagnosticMessages) ->
+ diagnosticMessages
+ .filter { filterPredicate(kind, it.msg) }
+ .forEach { diagnosticMessage ->
+ printToMessager(
+ context.logger.messager,
+ kind,
+ diagnosticMessage.msg,
+ diagnosticMessage.element,
+ diagnosticMessage.annotation,
+ diagnosticMessage.annotationValue
+ )
+ }
}
}
}
companion object {
+
+ const val MISSING_TYPE_PREFIX = "[MissingType]"
+
+ val MissingTypeErrorFilter: (Diagnostic.Kind, String) -> Boolean = { kind, msg ->
+ kind == ERROR && msg.startsWith(MISSING_TYPE_PREFIX)
+ }
+
private fun printToMessager(
messager: XMessager,
kind: Diagnostic.Kind,
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt b/room/room-compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
index 9d9cc85..5241975 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/parser/SqlParser.kt
@@ -271,8 +271,10 @@
/**
* produce acceptable variations of the given type names.
- * If it is primitive, we'll add boxed version
- * If environment is KSP, we'll add a nullable version as well.
+ * For JAVAC:
+ * - If it is primitive, we'll add boxed version
+ * For KSP:
+ * - We'll add a nullable version
*/
private fun withBoxedAndNullableTypes(
env: XProcessingEnv,
@@ -282,11 +284,10 @@
sequence {
val type = env.requireType(typeName)
yield(type)
- if (typeName.isPrimitive) {
- yield(type.boxed())
- }
if (env.backend == XProcessingEnv.Backend.KSP) {
yield(type.makeNullable())
+ } else if (typeName.isPrimitive) {
+ yield(type.boxed())
}
}
}.toList()
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/Context.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/Context.kt
index 10b6ce8..537ceff 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/Context.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/Context.kt
@@ -190,6 +190,17 @@
}
}
+ fun reportMissingType(typeName: String) {
+ logger.e("${RLog.MISSING_TYPE_PREFIX}: Type '$typeName' is not present")
+ }
+
+ fun reportMissingTypeReference(containerName: String) {
+ logger.e(
+ "${RLog.MISSING_TYPE_PREFIX}: Element '$containerName' references a type that is " +
+ "not present"
+ )
+ }
+
enum class ProcessorOptions(val argName: String) {
OPTION_SCHEMA_FOLDER("room.schemaLocation")
}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
index 499657e..c1a858d 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/CustomConverterProcessor.kt
@@ -46,37 +46,40 @@
isError() || isVoid() || isNone()
fun findConverters(context: Context, element: XElement): ProcessResult {
- val annotation = element.getAnnotation(TypeConverters::class)
- return annotation?.let {
- val classes = it.getAsTypeList("value")
- .mapTo(LinkedHashSet()) { it }
- val converters = classes.flatMap {
- val typeElement = it.typeElement
- if (typeElement == null) {
- context.logger.e(
- element,
- ProcessorErrors.typeConverterMustBeDeclared(it.typeName)
- )
- emptyList()
- } else {
- CustomConverterProcessor(context, typeElement).process()
- }
+ if (!element.hasAnnotation(TypeConverters::class)) {
+ return ProcessResult.EMPTY
+ }
+ if (!element.validate()) {
+ context.reportMissingTypeReference(element.toString())
+ return ProcessResult.EMPTY
+ }
+ val annotation = element.requireAnnotation(TypeConverters::class)
+ val classes = annotation.getAsTypeList("value").mapTo(LinkedHashSet()) { it }
+ val converters = classes.flatMap {
+ val typeElement = it.typeElement
+ if (typeElement == null) {
+ context.logger.e(
+ element,
+ ProcessorErrors.typeConverterMustBeDeclared(it.typeName)
+ )
+ emptyList()
+ } else {
+ CustomConverterProcessor(context, typeElement).process()
}
- reportDuplicates(context, converters)
- val builtInStates = it
- .getAsAnnotationBox<BuiltInTypeConverters>("builtInTypeConverters")
- .let {
- BuiltInConverterFlags(
- enums = it.value.enums,
- uuid = it.value.uuid
- )
- }
- ProcessResult(
- classes = classes,
- converters = converters.map(::CustomTypeConverterWrapper),
- builtInConverterFlags = builtInStates
- )
- } ?: ProcessResult.EMPTY
+ }
+ reportDuplicates(context, converters)
+ val builtInStates =
+ annotation.getAsAnnotationBox<BuiltInTypeConverters>("builtInTypeConverters").let {
+ BuiltInConverterFlags(
+ enums = it.value.enums,
+ uuid = it.value.uuid
+ )
+ }
+ return ProcessResult(
+ classes = classes,
+ converters = converters.map(::CustomTypeConverterWrapper),
+ builtInConverterFlags = builtInStates
+ )
}
private fun reportDuplicates(context: Context, converters: List<CustomTypeConverter>) {
@@ -102,6 +105,9 @@
}
fun process(): List<CustomTypeConverter> {
+ if (!element.validate()) {
+ context.reportMissingTypeReference(element.qualifiedName)
+ }
val methods = element.getAllMethods()
val converterMethods = methods.filter {
it.hasAnnotation(TypeConverter::class)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
index 5c300d8..018ffde 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/DaoProcessor.kt
@@ -48,6 +48,22 @@
}
fun process(): Dao {
+ if (!element.validate()) {
+ context.reportMissingTypeReference(element.qualifiedName)
+ return Dao(
+ element = element,
+ type = element.type,
+ queryMethods = emptyList(),
+ rawQueryMethods = emptyList(),
+ insertionMethods = emptyList(),
+ deletionMethods = emptyList(),
+ updateMethods = emptyList(),
+ transactionMethods = emptyList(),
+ delegatingMethods = emptyList(),
+ kotlinDefaultMethodDelegates = emptyList(),
+ constructorParamType = null
+ )
+ }
context.checker.hasAnnotation(
element, androidx.room.Dao::class,
ProcessorErrors.DAO_MUST_BE_ANNOTATED_WITH_DAO
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/MissingTypeException.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/MissingTypeException.kt
deleted file mode 100644
index 215ed7f..0000000
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/MissingTypeException.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * Copyright 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package androidx.room.processor
-
-/**
- * Exception thrown when a type element is not found due to it being possibly generated at a later
- * annotation processing round.
- *
- * This exception should be thrown to abandon processing a class since it requires types that are
- * not present. This case is specially handled by deferring processing the class to a later round.
- */
-class MissingTypeException(val typeName: String) : RuntimeException("Type $typeName is not present")
\ No newline at end of file
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
index ab540c1..336062f 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/PojoProcessor.kt
@@ -80,11 +80,16 @@
): PojoProcessor {
val (pojoElement, delegate) = if (element.hasAnnotation(AutoValue::class)) {
val processingEnv = context.processingEnv
- val autoValueGeneratedElement = element.let {
- val typeName = AutoValuePojoProcessorDelegate.getGeneratedClassName(it)
- processingEnv.findTypeElement(typeName) ?: throw MissingTypeException(typeName)
+ val autoValueGeneratedTypeName =
+ AutoValuePojoProcessorDelegate.getGeneratedClassName(element)
+ val autoValueGeneratedElement =
+ processingEnv.findTypeElement(autoValueGeneratedTypeName)
+ if (autoValueGeneratedElement != null) {
+ autoValueGeneratedElement to AutoValuePojoProcessorDelegate(context, element)
+ } else {
+ context.reportMissingType(autoValueGeneratedTypeName)
+ element to EmptyDelegate
}
- autoValueGeneratedElement to AutoValuePojoProcessorDelegate(context, element)
} else {
element to DefaultDelegate(context)
}
@@ -112,6 +117,17 @@
}
private fun doProcess(): Pojo {
+ if (!element.validate()) {
+ context.reportMissingTypeReference(element.qualifiedName)
+ return delegate.createPojo(
+ element = element,
+ declaredType = element.type,
+ fields = emptyList(),
+ embeddedFields = emptyList(),
+ relations = emptyList(),
+ constructor = null
+ )
+ }
delegate.onPreProcess(element)
val declaredType = element.type
@@ -429,7 +445,7 @@
private fun processRelationField(
myFields: List<Field>,
- container: XType?,
+ container: XType,
relationElement: XFieldElement
): androidx.room.vo.Relation? {
val annotation = relationElement.getAnnotation(Relation::class)!!
@@ -449,11 +465,7 @@
return null
}
// parse it as an entity.
- val asMember = relationElement.asMemberOf(container!!)
- if (asMember.isError()) {
- context.logger.e(relationElement, ProcessorErrors.CANNOT_FIND_TYPE)
- return null
- }
+ val asMember = relationElement.asMemberOf(container)
val asType = if (asMember.isCollection()) {
asMember.typeArguments.first().extendsBoundOrSelf()
} else {
@@ -467,10 +479,6 @@
)
return null
}
- if (asType.isError()) {
- context.logger.e(typeElement, ProcessorErrors.CANNOT_FIND_TYPE)
- return null
- }
val entityClassInput = annotation.getAsType("entity")
@@ -974,6 +982,30 @@
}
}
+ private object EmptyDelegate : Delegate {
+ override fun onPreProcess(element: XTypeElement) {}
+
+ override fun findConstructors(element: XTypeElement): List<XExecutableElement> = emptyList()
+
+ override fun createPojo(
+ element: XTypeElement,
+ declaredType: XType,
+ fields: List<Field>,
+ embeddedFields: List<EmbeddedField>,
+ relations: List<androidx.room.vo.Relation>,
+ constructor: Constructor?
+ ): Pojo {
+ return Pojo(
+ element = element,
+ type = declaredType,
+ fields = emptyList(),
+ embeddedFields = emptyList(),
+ relations = emptyList(),
+ constructor = null
+ )
+ }
+ }
+
private data class FailedConstructor(
val method: XExecutableElement,
val params: List<String>,
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
index d884c99..9da7794 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/ProcessorErrors.kt
@@ -452,8 +452,6 @@
val RELATION_IN_ENTITY = "Entities cannot have relations."
- val CANNOT_FIND_TYPE = "Cannot find type."
-
fun relationAffinityMismatch(
parentColumn: String,
childColumn: String,
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt b/room/room-compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt
index 234af6d..867bca9 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/util/SchemaDiffer.kt
@@ -44,7 +44,7 @@
* Contains the changes detected between the two schema versions provided.
*/
data class SchemaDiffResult(
- val addedColumns: LinkedHashMap<String, AutoMigration.AddedColumn>,
+ val addedColumns: List<AutoMigration.AddedColumn>,
val deletedColumns: List<AutoMigration.DeletedColumn>,
val addedTables: Set<AutoMigration.AddedTable>,
val renamedTables: Map<String, String>,
@@ -93,9 +93,9 @@
mutableMapOf<String, AutoMigration.ComplexChangedTable>()
private val deletedTables = deleteTableEntries.map { it.deletedTableName }.toSet()
- // Map of columns that have been added in the database, keyed by the column name, note that
- // the table these columns have been added to will not contain any complex schema changes.
- private val addedColumns = linkedMapOf<String, AutoMigration.AddedColumn>()
+ // Map of columns that have been added in the database, note that the table these columns
+ // have been added to will not contain any complex schema changes.
+ private val addedColumns = mutableListOf<AutoMigration.AddedColumn>()
private val deletedColumns = deleteColumnEntries
/**
@@ -375,8 +375,8 @@
return true
}
// Check if the to table or the from table is an FTS table while the other is not.
- if (fromTable is FtsEntityBundle && !(toTable is FtsEntityBundle) ||
- toTable is FtsEntityBundle && !(fromTable is FtsEntityBundle)
+ if (fromTable is FtsEntityBundle && toTable !is FtsEntityBundle ||
+ toTable is FtsEntityBundle && fromTable !is FtsEntityBundle
) {
return true
}
@@ -557,11 +557,12 @@
// need to account for it as the table will be recreated already with the new
// table.
if (!complexChangedTables.containsKey(fromTable.tableName)) {
- addedColumns[toColumn.columnName] =
+ addedColumns.add(
AutoMigration.AddedColumn(
toTable.tableName,
toColumn
)
+ )
}
}
}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/verifier/ColumnInfo.kt b/room/room-compiler/src/main/kotlin/androidx/room/verifier/ColumnInfo.kt
index 788beaf..b7f937b 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/verifier/ColumnInfo.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/verifier/ColumnInfo.kt
@@ -21,4 +21,8 @@
/**
* Represents a column in a query response
*/
-data class ColumnInfo(val name: String, val type: SQLTypeAffinity)
+data class ColumnInfo(
+ val name: String,
+ val type: SQLTypeAffinity,
+ val originTable: String?,
+)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/verifier/jdbc_ext.kt b/room/room-compiler/src/main/kotlin/androidx/room/verifier/jdbc_ext.kt
index a5da941..bd3b351 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/verifier/jdbc_ext.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/verifier/jdbc_ext.kt
@@ -61,5 +61,11 @@
internal fun PreparedStatement.columnInfo(): List<ColumnInfo> {
// see: http://sqlite.1065341.n5.nabble.com/Column-order-in-resultset-td23127.html
- return map { index, data -> ColumnInfo(data.getColumnName(index), tryGetAffinity(index)) }
+ return map { index, data ->
+ ColumnInfo(
+ name = data.getColumnName(index),
+ type = tryGetAffinity(index),
+ originTable = data.getTableName(index)?.ifEmpty { null }
+ )
+ }
}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
index f30bcb2..290606e 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
@@ -427,11 +427,11 @@
addedColumns.forEach {
val addNewColumnSql = buildString {
append(
- "ALTER TABLE `${it.value.tableName}` ADD COLUMN `${it.key}` " +
- "${it.value.fieldBundle.affinity} "
+ "ALTER TABLE `${it.tableName}` ADD COLUMN `${it.fieldBundle.columnName}` " +
+ "${it.fieldBundle.affinity} "
)
- if (it.value.fieldBundle.isNonNull) {
- append("NOT NULL DEFAULT ${it.value.fieldBundle.defaultValue}")
+ if (it.fieldBundle.isNonNull) {
+ append("NOT NULL DEFAULT ${it.fieldBundle.defaultValue}")
} else {
append("DEFAULT NULL")
}
diff --git a/room/room-compiler/src/main/resources/NOTICE.txt b/room/room-compiler/src/main/resources/NOTICE.txt
index fd8adbc..9f49260 100644
--- a/room/room-compiler/src/main/resources/NOTICE.txt
+++ b/room/room-compiler/src/main/resources/NOTICE.txt
@@ -1369,234 +1369,234 @@
* sqlite-jdbc.jar (org.xerial:sqlite-jdbc:3.16.1)
****** LICENSE:
-
- Apache License
- Version 2.0, January 2004
- http://www.apache.org/licenses/
-
- TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
- 1. Definitions.
-
- "License" shall mean the terms and conditions for use, reproduction,
- and distribution as defined by Sections 1 through 9 of this document.
-
- "Licensor" shall mean the copyright owner or entity authorized by
- the copyright owner that is granting the License.
-
- "Legal Entity" shall mean the union of the acting entity and all
- other entities that control, are controlled by, or are under common
- control with that entity. For the purposes of this definition,
- "control" means (i) the power, direct or indirect, to cause the
- direction or management of such entity, whether by contract or
- otherwise, or (ii) ownership of fifty percent (50%) or more of the
- outstanding shares, or (iii) beneficial ownership of such entity.
-
- "You" (or "Your") shall mean an individual or Legal Entity
- exercising permissions granted by this License.
-
- "Source" form shall mean the preferred form for making modifications,
- including but not limited to software source code, documentation
- source, and configuration files.
-
- "Object" form shall mean any form resulting from mechanical
- transformation or translation of a Source form, including but
- not limited to compiled object code, generated documentation,
- and conversions to other media types.
-
- "Work" shall mean the work of authorship, whether in Source or
- Object form, made available under the License, as indicated by a
- copyright notice that is included in or attached to the work
- (an example is provided in the Appendix below).
-
- "Derivative Works" shall mean any work, whether in Source or Object
- form, that is based on (or derived from) the Work and for which the
- editorial revisions, annotations, elaborations, or other modifications
- represent, as a whole, an original work of authorship. For the purposes
- of this License, Derivative Works shall not include works that remain
- separable from, or merely link (or bind by name) to the interfaces of,
- the Work and Derivative Works thereof.
-
- "Contribution" shall mean any work of authorship, including
- the original version of the Work and any modifications or additions
- to that Work or Derivative Works thereof, that is intentionally
- submitted to Licensor for inclusion in the Work by the copyright owner
- or by an individual or Legal Entity authorized to submit on behalf of
- the copyright owner. For the purposes of this definition, "submitted"
- means any form of electronic, verbal, or written communication sent
- to the Licensor or its representatives, including but not limited to
- communication on electronic mailing lists, source code control systems,
- and issue tracking systems that are managed by, or on behalf of, the
- Licensor for the purpose of discussing and improving the Work, but
- excluding communication that is conspicuously marked or otherwise
- designated in writing by the copyright owner as "Not a Contribution."
-
- "Contributor" shall mean Licensor and any individual or Legal Entity
- on behalf of whom a Contribution has been received by Licensor and
- subsequently incorporated within the Work.
-
- 2. Grant of Copyright License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- copyright license to reproduce, prepare Derivative Works of,
- publicly display, publicly perform, sublicense, and distribute the
- Work and such Derivative Works in Source or Object form.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this License, each Contributor hereby grants to You a perpetual,
- worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- (except as stated in this section) patent license to make, have made,
- use, offer to sell, sell, import, and otherwise transfer the Work,
- where such license applies only to those patent claims licensable
- by such Contributor that are necessarily infringed by their
- Contribution(s) alone or by combination of their Contribution(s)
- with the Work to which such Contribution(s) was submitted. If You
- institute patent litigation against any entity (including a
- cross-claim or counterclaim in a lawsuit) alleging that the Work
- or a Contribution incorporated within the Work constitutes direct
- or contributory patent infringement, then any patent licenses
- granted to You under this License for that Work shall terminate
- as of the date such litigation is filed.
-
- 4. Redistribution. You may reproduce and distribute copies of the
- Work or Derivative Works thereof in any medium, with or without
- modifications, and in Source or Object form, provided that You
- meet the following conditions:
-
- (a) You must give any other recipients of the Work or
- Derivative Works a copy of this License; and
-
- (b) You must cause any modified files to carry prominent notices
- stating that You changed the files; and
-
- (c) You must retain, in the Source form of any Derivative Works
- that You distribute, all copyright, patent, trademark, and
- attribution notices from the Source form of the Work,
- excluding those notices that do not pertain to any part of
- the Derivative Works; and
-
- (d) If the Work includes a "NOTICE" text file as part of its
- distribution, then any Derivative Works that You distribute must
- include a readable copy of the attribution notices contained
- within such NOTICE file, excluding those notices that do not
- pertain to any part of the Derivative Works, in at least one
- of the following places: within a NOTICE text file distributed
- as part of the Derivative Works; within the Source form or
- documentation, if provided along with the Derivative Works; or,
- within a display generated by the Derivative Works, if and
- wherever such third-party notices normally appear. The contents
- of the NOTICE file are for informational purposes only and
- do not modify the License. You may add Your own attribution
- notices within Derivative Works that You distribute, alongside
- or as an addendum to the NOTICE text from the Work, provided
- that such additional attribution notices cannot be construed
- as modifying the License.
-
- You may add Your own copyright statement to Your modifications and
- may provide additional or different license terms and conditions
- for use, reproduction, or distribution of Your modifications, or
- for any such Derivative Works as a whole, provided Your use,
- reproduction, and distribution of the Work otherwise complies with
- the conditions stated in this License.
-
- 5. Submission of Contributions. Unless You explicitly state otherwise,
- any Contribution intentionally submitted for inclusion in the Work
- by You to the Licensor shall be under the terms and conditions of
- this License, without any additional terms or conditions.
- Notwithstanding the above, nothing herein shall supersede or modify
- the terms of any separate license agreement you may have executed
- with Licensor regarding such Contributions.
-
- 6. Trademarks. This License does not grant permission to use the trade
- names, trademarks, service marks, or product names of the Licensor,
- except as required for reasonable and customary use in describing the
- origin of the Work and reproducing the content of the NOTICE file.
-
- 7. Disclaimer of Warranty. Unless required by applicable law or
- agreed to in writing, Licensor provides the Work (and each
- Contributor provides its Contributions) on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- implied, including, without limitation, any warranties or conditions
- of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- PARTICULAR PURPOSE. You are solely responsible for determining the
- appropriateness of using or redistributing the Work and assume any
- risks associated with Your exercise of permissions under this License.
-
- 8. Limitation of Liability. In no event and under no legal theory,
- whether in tort (including negligence), contract, or otherwise,
- unless required by applicable law (such as deliberate and grossly
- negligent acts) or agreed to in writing, shall any Contributor be
- liable to You for damages, including any direct, indirect, special,
- incidental, or consequential damages of any character arising as a
- result of this License or out of the use or inability to use the
- Work (including but not limited to damages for loss of goodwill,
- work stoppage, computer failure or malfunction, or any and all
- other commercial damages or losses), even if such Contributor
- has been advised of the possibility of such damages.
-
- 9. Accepting Warranty or Additional Liability. While redistributing
- the Work or Derivative Works thereof, You may choose to offer,
- and charge a fee for, acceptance of support, warranty, indemnity,
- or other liability obligations and/or rights consistent with this
- License. However, in accepting such obligations, You may act only
- on Your own behalf and on Your sole responsibility, not on behalf
- of any other Contributor, and only if You agree to indemnify,
- defend, and hold each Contributor harmless for any liability
- incurred by, or claims asserted against, such Contributor by reason
- of your accepting any such warranty or additional liability.
-
- END OF TERMS AND CONDITIONS
-
- APPENDIX: How to apply the Apache License to your work.
-
- To apply the Apache License to your work, attach the following
- boilerplate notice, with the fields enclosed by brackets "[]"
- replaced with your own identifying information. (Don't include
- the brackets!) The text should be enclosed in the appropriate
- comment syntax for the file format. We also recommend that a
- file or class name and description of purpose be included on the
- same "printed page" as the copyright notice for easier
- identification within third-party archives.
-
- Copyright [yyyy] [name of copyright owner]
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
****** LICENSE:
-Copyright (c) 2006, David Crawshaw. All rights reserved.
-
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
-
-1. Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-2. Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
-
-THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
-ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
-FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGE.
-
+Copyright (c) 2006, David Crawshaw. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
diff --git a/room/room-compiler/src/test/data/daoWriter/output/ComplexDao.java b/room/room-compiler/src/test/data/daoWriter/output/ComplexDao.java
index 75fefae..efbd70c 100644
--- a/room/room-compiler/src/test/data/daoWriter/output/ComplexDao.java
+++ b/room/room-compiler/src/test/data/daoWriter/output/ComplexDao.java
@@ -309,6 +309,62 @@
}
@Override
+ public List<Integer> getAllAgesAsList(final List<Integer> ids1, final int[] ids2,
+ final int... ids3) {
+ StringBuilder _stringBuilder = StringUtil.newStringBuilder();
+ _stringBuilder.append("SELECT ageColumn FROM user where uid IN(");
+ final int _inputSize = ids1.size();
+ StringUtil.appendPlaceholders(_stringBuilder, _inputSize);
+ _stringBuilder.append(") OR uid IN (");
+ final int _inputSize_1 = ids2.length;
+ StringUtil.appendPlaceholders(_stringBuilder, _inputSize_1);
+ _stringBuilder.append(") OR uid IN (");
+ final int _inputSize_2 = ids3.length;
+ StringUtil.appendPlaceholders(_stringBuilder, _inputSize_2);
+ _stringBuilder.append(")");
+ final String _sql = _stringBuilder.toString();
+ final int _argCount = 0 + _inputSize + _inputSize_1 + _inputSize_2;
+ final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, _argCount);
+ int _argIndex = 1;
+ for (Integer _item : ids1) {
+ if (_item == null) {
+ _statement.bindNull(_argIndex);
+ } else {
+ _statement.bindLong(_argIndex, _item);
+ }
+ _argIndex ++;
+ }
+ _argIndex = 1 + _inputSize;
+ for (int _item_1 : ids2) {
+ _statement.bindLong(_argIndex, _item_1);
+ _argIndex ++;
+ }
+ _argIndex = 1 + _inputSize + _inputSize_1;
+ for (int _item_2 : ids3) {
+ _statement.bindLong(_argIndex, _item_2);
+ _argIndex ++;
+ }
+ __db.assertNotSuspendingTransaction();
+ final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
+ try {
+ final List<Integer> _result = new ArrayList<Integer>(_cursor.getCount());
+ while(_cursor.moveToNext()) {
+ final Integer _item_3;
+ if (_cursor.isNull(0)) {
+ _item_3 = null;
+ } else {
+ _item_3 = _cursor.getInt(0);
+ }
+ _result.add(_item_3);
+ }
+ return _result;
+ } finally {
+ _cursor.close();
+ _statement.release();
+ }
+ }
+
+ @Override
public LiveData<User> getByIdLive(final int id) {
final String _sql = "SELECT * FROM user where uid = ?";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 1);
@@ -414,62 +470,6 @@
}
@Override
- public List<Integer> getAllAgesAsList(final List<Integer> ids1, final int[] ids2,
- final int... ids3) {
- StringBuilder _stringBuilder = StringUtil.newStringBuilder();
- _stringBuilder.append("SELECT ageColumn FROM user where uid IN(");
- final int _inputSize = ids1.size();
- StringUtil.appendPlaceholders(_stringBuilder, _inputSize);
- _stringBuilder.append(") OR uid IN (");
- final int _inputSize_1 = ids2.length;
- StringUtil.appendPlaceholders(_stringBuilder, _inputSize_1);
- _stringBuilder.append(") OR uid IN (");
- final int _inputSize_2 = ids3.length;
- StringUtil.appendPlaceholders(_stringBuilder, _inputSize_2);
- _stringBuilder.append(")");
- final String _sql = _stringBuilder.toString();
- final int _argCount = 0 + _inputSize + _inputSize_1 + _inputSize_2;
- final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, _argCount);
- int _argIndex = 1;
- for (Integer _item : ids1) {
- if (_item == null) {
- _statement.bindNull(_argIndex);
- } else {
- _statement.bindLong(_argIndex, _item);
- }
- _argIndex ++;
- }
- _argIndex = 1 + _inputSize;
- for (int _item_1 : ids2) {
- _statement.bindLong(_argIndex, _item_1);
- _argIndex ++;
- }
- _argIndex = 1 + _inputSize + _inputSize_1;
- for (int _item_2 : ids3) {
- _statement.bindLong(_argIndex, _item_2);
- _argIndex ++;
- }
- __db.assertNotSuspendingTransaction();
- final Cursor _cursor = DBUtil.query(__db, _statement, false, null);
- try {
- final List<Integer> _result = new ArrayList<Integer>(_cursor.getCount());
- while(_cursor.moveToNext()) {
- final Integer _item_3;
- if (_cursor.isNull(0)) {
- _item_3 = null;
- } else {
- _item_3 = _cursor.getInt(0);
- }
- _result.add(_item_3);
- }
- return _result;
- } finally {
- _cursor.close();
- _statement.release();
- }
- }
-
- @Override
public List<Child1> getChild1List() {
final String _sql = "SELECT * FROM Child1";
final RoomSQLiteQuery _statement = RoomSQLiteQuery.acquire(_sql, 0);
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/parser/SQLTypeAffinityTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/parser/SQLTypeAffinityTest.kt
index b8a6e6e..fff0299 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/parser/SQLTypeAffinityTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/parser/SQLTypeAffinityTest.kt
@@ -71,27 +71,20 @@
),
SQLTypeAffinity.INTEGER to listOf(
"int!!",
- "java.lang.Integer!!",
"java.lang.Integer?",
"byte!!",
- "java.lang.Byte!!",
"java.lang.Byte?",
"char!!",
- "java.lang.Character!!",
"java.lang.Character?",
"long!!",
- "java.lang.Long!!",
"java.lang.Long?",
"short!!",
- "java.lang.Short!!",
"java.lang.Short?"
),
SQLTypeAffinity.REAL to listOf(
"double!!",
- "java.lang.Double!!",
"java.lang.Double?",
"float!!",
- "java.lang.Float!!",
"java.lang.Float?",
)
)
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
index 8e5d448..93870ff 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/DatabaseViewProcessorTest.kt
@@ -90,8 +90,8 @@
val resultInfo = view.query.resultInfo!!
assertThat(resultInfo.columns).hasSize(2)
assertThat(resultInfo.columns).containsAtLeast(
- ColumnInfo("id", SQLTypeAffinity.INTEGER),
- ColumnInfo("name", SQLTypeAffinity.TEXT)
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "Team"),
+ ColumnInfo("name", SQLTypeAffinity.TEXT, "Team")
)
assertThat(view.viewName).isEqualTo("MyView")
}
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
index 497d707..cb6658b 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/PojoProcessorTest.kt
@@ -24,7 +24,6 @@
import androidx.room.compiler.processing.util.runProcessorTest
import androidx.room.parser.SQLTypeAffinity
import androidx.room.processor.ProcessorErrors.CANNOT_FIND_GETTER_FOR_FIELD
-import androidx.room.processor.ProcessorErrors.CANNOT_FIND_TYPE
import androidx.room.processor.ProcessorErrors.MISSING_POJO_CONSTRUCTOR
import androidx.room.processor.ProcessorErrors.POJO_FIELD_HAS_DUPLICATE_COLUMN_NAME
import androidx.room.processor.ProcessorErrors.junctionColumnWithoutIndex
@@ -556,7 +555,9 @@
}
} else {
invocation.assertCompilationResult {
- hasErrorContaining(CANNOT_FIND_TYPE)
+ hasErrorContaining(
+ "Element 'foo.bar.MyPojo' references a type that is not present"
+ )
}
}
}
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
index 65180f4..5ab5113 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/TableEntityProcessorTest.kt
@@ -2083,16 +2083,17 @@
attributes = annotation, sources = listOf(COMMON.USER)
) { _, invocation ->
invocation.assertCompilationResult {
- // KSP runs processors even when java code is not valid hence we'll get the
- // error from room. For JavaP and Kapt, they don't run the processor when
- // the java code has an error
+ // TODO: https://github.com/google/ksp/issues/603
+ // KSP validator does not validate annotation types so we will get another error
+ // down the line.
if (invocation.isKsp) {
hasErrorContaining(
ProcessorErrors.foreignKeyNotAnEntity("<Error>")
).onLine(11)
} else {
- hasErrorContaining("cannot find symbol")
- .onLine(7)
+ hasErrorContaining(
+ "Element 'foo.bar.MyEntity' references a type that is not present"
+ )
}
}
}
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt
index b5be2a8..bd6a7a3 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/util/SchemaDifferTest.kt
@@ -86,7 +86,7 @@
renameTableEntries = listOf(),
deleteTableEntries = listOf()
).diffSchemas()
- assertThat(schemaDiffResult.addedColumns["artistId"]?.fieldBundle?.columnName)
+ assertThat(schemaDiffResult.addedColumns.single().fieldBundle.columnName)
.isEqualTo("artistId")
}
@@ -101,9 +101,10 @@
renameTableEntries = listOf(),
deleteTableEntries = listOf()
).diffSchemas()
- assertThat(schemaDiffResult.addedColumns["recordLabelId"]?.fieldBundle?.columnName)
+ assertThat(schemaDiffResult.addedColumns).hasSize(2)
+ assertThat(schemaDiffResult.addedColumns[0].fieldBundle.columnName)
.isEqualTo("recordLabelId")
- assertThat(schemaDiffResult.addedColumns["artistId"]?.fieldBundle?.columnName)
+ assertThat(schemaDiffResult.addedColumns[1].fieldBundle.columnName)
.isEqualTo("artistId")
}
@@ -143,6 +144,28 @@
}
@Test
+ fun testColumnsAddedWithSameName() {
+ val schemaDiffResult = SchemaDiffer(
+ fromSchemaBundle = from.database,
+ toSchemaBundle = toColumnsAddedWithSameName.database,
+ className = "MyAutoMigration",
+ renameColumnEntries = listOf(),
+ deleteColumnEntries = listOf(),
+ renameTableEntries = listOf(),
+ deleteTableEntries = listOf()
+ ).diffSchemas()
+ assertThat(schemaDiffResult.addedColumns).hasSize(2)
+ schemaDiffResult.addedColumns[0].let { addedColumn ->
+ assertThat(addedColumn.tableName).isEqualTo("Artist")
+ assertThat(addedColumn.fieldBundle.columnName).isEqualTo("newColumn")
+ }
+ schemaDiffResult.addedColumns[1].let { addedColumn ->
+ assertThat(addedColumn.tableName).isEqualTo("Song")
+ assertThat(addedColumn.fieldBundle.columnName).isEqualTo("newColumn")
+ }
+ }
+
+ @Test
fun testColumnRenamed() {
try {
SchemaDiffer(
@@ -222,7 +245,7 @@
}
}
- val from = SchemaBundle(
+ private val from = SchemaBundle(
1,
DatabaseBundle(
1,
@@ -302,8 +325,9 @@
)
)
- /** Valid "to" Schemas */
- val toTableRenamed = SchemaBundle(
+ //region Valid "to" Schemas
+
+ private val toTableRenamed = SchemaBundle(
2,
DatabaseBundle(
2,
@@ -383,7 +407,7 @@
)
)
- val toTableDeleted = SchemaBundle(
+ private val toTableDeleted = SchemaBundle(
2,
DatabaseBundle(
2,
@@ -429,7 +453,7 @@
)
)
- val toColumnAddedWithColumnInfoDefaultValue = SchemaBundle(
+ private val toColumnAddedWithColumnInfoDefaultValue = SchemaBundle(
2,
DatabaseBundle(
2,
@@ -517,182 +541,9 @@
)
)
- /** Invalid "to" Schemas (These are expected to throw an error.) */
-
- /**
- * The length column is removed from the first version. No other changes made.
- *
- */
- private val toColumnRemoved = SchemaBundle(
- 2,
- DatabaseBundle(
- 2,
- "",
- listOf(
- EntityBundle(
- "Song",
- "CREATE TABLE IF NOT EXISTS `Song` (`id` INTEGER NOT NULL, " +
- "`title` TEXT NOT NULL, PRIMARY KEY(`id`))",
- listOf(
- FieldBundle(
- "id",
- "id",
- "INTEGER",
- true,
- "1"
- ),
- FieldBundle(
- "title",
- "title",
- "TEXT",
- true,
- ""
- ),
- ),
- PrimaryKeyBundle(
- false,
- mutableListOf("id")
- ),
- emptyList(),
- emptyList()
- ),
- EntityBundle(
- "Artist",
- "CREATE TABLE IF NOT EXISTS `Artist` (`id` INTEGER NOT NULL, " +
- "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, PRIMARY KEY(`id`))",
- listOf(
- FieldBundle(
- "id",
- "id",
- "INTEGER",
- true,
- "1"
- ),
- FieldBundle(
- "title",
- "title",
- "TEXT",
- true,
- ""
- ),
- FieldBundle(
- "length",
- "length",
- "INTEGER",
- true,
- "1"
- )
- ),
- PrimaryKeyBundle(
- false,
- mutableListOf("id")
- ),
- mutableListOf(),
- mutableListOf()
- )
- ),
- mutableListOf(),
- mutableListOf()
- )
- )
-
- /**
- * If the user declared the default value in the SQL statement and not used a @ColumnInfo,
- * Room will put null for that default value in the exported schema. In this case we
- * can't migrate.
- */
- private val toColumnAddedWithNoDefaultValue = SchemaBundle(
- 2,
- DatabaseBundle(
- 2,
- "",
- listOf(
- EntityBundle(
- "Song",
- "CREATE TABLE IF NOT EXISTS `Song` (`id` INTEGER NOT NULL, " +
- "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, `artistId` " +
- "INTEGER NOT NULL, PRIMARY KEY(`id`))",
- listOf(
- FieldBundle(
- "id",
- "id",
- "INTEGER",
- true,
- "1"
- ),
- FieldBundle(
- "title",
- "title",
- "TEXT",
- true,
- ""
- ),
- FieldBundle(
- "length",
- "length",
- "INTEGER",
- true,
- "1"
- ),
- FieldBundle(
- "artistId",
- "artistId",
- "INTEGER",
- true,
- null
- )
- ),
- PrimaryKeyBundle(
- false,
- mutableListOf("id")
- ),
- emptyList(),
- emptyList()
- ),
- EntityBundle(
- "Artist",
- "CREATE TABLE IF NOT EXISTS `Artist` (`id` INTEGER NOT NULL, " +
- "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, PRIMARY KEY(`id`))",
- listOf(
- FieldBundle(
- "id",
- "id",
- "INTEGER",
- true,
- "1"
- ),
- FieldBundle(
- "title",
- "title",
- "TEXT",
- true,
- ""
- ),
- FieldBundle(
- "length",
- "length",
- "INTEGER",
- true,
- "1"
- )
- ),
- PrimaryKeyBundle(
- false,
- mutableListOf("id")
- ),
- mutableListOf(),
- mutableListOf()
- )
- ),
- mutableListOf(),
- mutableListOf()
- )
- )
-
/**
* Adding multiple columns, preserving the order in which they have been added.
*/
-
private val toColumnsAddedInOrder = SchemaBundle(
2,
DatabaseBundle(
@@ -773,7 +624,105 @@
"INTEGER",
true,
"1"
- )
+ ),
+ ),
+ PrimaryKeyBundle(
+ false,
+ mutableListOf("id")
+ ),
+ mutableListOf(),
+ mutableListOf()
+ )
+ ),
+ mutableListOf(),
+ mutableListOf()
+ )
+ )
+
+ /**
+ * Adding multiple columns, preserving the order in which they have been added.
+ */
+ private val toColumnsAddedWithSameName = SchemaBundle(
+ 2,
+ DatabaseBundle(
+ 2,
+ "",
+ listOf(
+ EntityBundle(
+ "Song",
+ "CREATE TABLE IF NOT EXISTS `Song` (`id` INTEGER NOT NULL, " +
+ "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, `artistId` " +
+ "INTEGER NOT NULL, PRIMARY KEY(`id`))",
+ listOf(
+ FieldBundle(
+ "id",
+ "id",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "title",
+ "title",
+ "TEXT",
+ true,
+ ""
+ ),
+ FieldBundle(
+ "length",
+ "length",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "newColumn",
+ "newColumn",
+ "INTEGER",
+ true,
+ "0"
+ ),
+ ),
+ PrimaryKeyBundle(
+ false,
+ mutableListOf("id")
+ ),
+ emptyList(),
+ emptyList()
+ ),
+ EntityBundle(
+ "Artist",
+ "CREATE TABLE IF NOT EXISTS `Artist` (`id` INTEGER NOT NULL, " +
+ "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, PRIMARY KEY(`id`))",
+ listOf(
+ FieldBundle(
+ "id",
+ "id",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "title",
+ "title",
+ "TEXT",
+ true,
+ ""
+ ),
+ FieldBundle(
+ "length",
+ "length",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "newColumn",
+ "newColumn",
+ "INTEGER",
+ true,
+ "0"
+ ),
),
PrimaryKeyBundle(
false,
@@ -791,8 +740,6 @@
/**
* Renaming the length column to duration.
*/
- // TODO: We currently do not support column renames as we can't detect rename or deletion
- // yet.
private val toColumnRenamed = SchemaBundle(
2,
DatabaseBundle(
@@ -1322,4 +1269,179 @@
mutableListOf()
)
)
+
+ //endregion
+
+ //region Invalid "to" Schemas (These are expected to throw an error.)
+
+ /**
+ * The length column is removed from the first version. No other changes made.
+ */
+ private val toColumnRemoved = SchemaBundle(
+ 2,
+ DatabaseBundle(
+ 2,
+ "",
+ listOf(
+ EntityBundle(
+ "Song",
+ "CREATE TABLE IF NOT EXISTS `Song` (`id` INTEGER NOT NULL, " +
+ "`title` TEXT NOT NULL, PRIMARY KEY(`id`))",
+ listOf(
+ FieldBundle(
+ "id",
+ "id",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "title",
+ "title",
+ "TEXT",
+ true,
+ ""
+ ),
+ ),
+ PrimaryKeyBundle(
+ false,
+ mutableListOf("id")
+ ),
+ emptyList(),
+ emptyList()
+ ),
+ EntityBundle(
+ "Artist",
+ "CREATE TABLE IF NOT EXISTS `Artist` (`id` INTEGER NOT NULL, " +
+ "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, PRIMARY KEY(`id`))",
+ listOf(
+ FieldBundle(
+ "id",
+ "id",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "title",
+ "title",
+ "TEXT",
+ true,
+ ""
+ ),
+ FieldBundle(
+ "length",
+ "length",
+ "INTEGER",
+ true,
+ "1"
+ )
+ ),
+ PrimaryKeyBundle(
+ false,
+ mutableListOf("id")
+ ),
+ mutableListOf(),
+ mutableListOf()
+ )
+ ),
+ mutableListOf(),
+ mutableListOf()
+ )
+ )
+
+ /**
+ * If the user declared the default value in the SQL statement and not used a @ColumnInfo,
+ * Room will put null for that default value in the exported schema. In this case we
+ * can't migrate.
+ */
+ private val toColumnAddedWithNoDefaultValue = SchemaBundle(
+ 2,
+ DatabaseBundle(
+ 2,
+ "",
+ listOf(
+ EntityBundle(
+ "Song",
+ "CREATE TABLE IF NOT EXISTS `Song` (`id` INTEGER NOT NULL, " +
+ "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, `artistId` " +
+ "INTEGER NOT NULL, PRIMARY KEY(`id`))",
+ listOf(
+ FieldBundle(
+ "id",
+ "id",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "title",
+ "title",
+ "TEXT",
+ true,
+ ""
+ ),
+ FieldBundle(
+ "length",
+ "length",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "artistId",
+ "artistId",
+ "INTEGER",
+ true,
+ null
+ )
+ ),
+ PrimaryKeyBundle(
+ false,
+ mutableListOf("id")
+ ),
+ emptyList(),
+ emptyList()
+ ),
+ EntityBundle(
+ "Artist",
+ "CREATE TABLE IF NOT EXISTS `Artist` (`id` INTEGER NOT NULL, " +
+ "`title` TEXT NOT NULL, `length` INTEGER NOT NULL, PRIMARY KEY(`id`))",
+ listOf(
+ FieldBundle(
+ "id",
+ "id",
+ "INTEGER",
+ true,
+ "1"
+ ),
+ FieldBundle(
+ "title",
+ "title",
+ "TEXT",
+ true,
+ ""
+ ),
+ FieldBundle(
+ "length",
+ "length",
+ "INTEGER",
+ true,
+ "1"
+ )
+ ),
+ PrimaryKeyBundle(
+ false,
+ mutableListOf("id")
+ ),
+ mutableListOf(),
+ mutableListOf()
+ )
+ ),
+ mutableListOf(),
+ mutableListOf()
+ )
+ )
+
+ //endregion
}
\ No newline at end of file
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
index 51c6f6a..0b66837 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/verifier/DatabaseVerifierTest.kt
@@ -85,10 +85,10 @@
`is`(
QueryResultInfo(
listOf(
- ColumnInfo("id", SQLTypeAffinity.INTEGER),
- ColumnInfo("name", SQLTypeAffinity.TEXT),
- ColumnInfo("lastName", SQLTypeAffinity.TEXT),
- ColumnInfo("ratio", SQLTypeAffinity.REAL)
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "User"),
+ ColumnInfo("name", SQLTypeAffinity.TEXT, "User"),
+ ColumnInfo("lastName", SQLTypeAffinity.TEXT, "User"),
+ ColumnInfo("ratio", SQLTypeAffinity.REAL, "User")
)
)
)
@@ -104,8 +104,48 @@
`is`(
QueryResultInfo(
listOf(
- ColumnInfo("id", SQLTypeAffinity.INTEGER),
- ColumnInfo("lastName", SQLTypeAffinity.TEXT)
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "User"),
+ ColumnInfo("lastName", SQLTypeAffinity.TEXT, "User")
+ )
+ )
+ )
+ )
+ }
+ }
+
+ @Test
+ fun testFlattenQuery() {
+ validQueryTest("SELECT id, lastName FROM (select * from User)") {
+ assertThat(
+ it,
+ `is`(
+ QueryResultInfo(
+ listOf(
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "User"),
+ ColumnInfo("lastName", SQLTypeAffinity.TEXT, "User"),
+ )
+ )
+ )
+ )
+ }
+ }
+
+ @Test
+ fun testColumnSubquery() {
+ validQueryTest("""
+ SELECT
+ lastName,
+ (SELECT COUNT(*) FROM user AS iu WHERE iu.lastName = u.lastName) = 1 AS isUnique
+ FROM user AS u
+ GROUP BY lastName
+ """.trimIndent()) {
+ assertThat(
+ it,
+ `is`(
+ QueryResultInfo(
+ listOf(
+ ColumnInfo("lastName", SQLTypeAffinity.TEXT, "User"),
+ ColumnInfo("isUnique", SQLTypeAffinity.NULL, null),
)
)
)
@@ -121,8 +161,8 @@
`is`(
QueryResultInfo(
listOf(
- ColumnInfo("myId", SQLTypeAffinity.INTEGER),
- ColumnInfo("lastName", SQLTypeAffinity.TEXT)
+ ColumnInfo("myId", SQLTypeAffinity.INTEGER, "User"),
+ ColumnInfo("lastName", SQLTypeAffinity.TEXT, "User")
)
)
)
@@ -139,7 +179,7 @@
QueryResultInfo(
listOf(
// unfortunately, we don't get this information
- ColumnInfo("MAX(ratio)", SQLTypeAffinity.NULL)
+ ColumnInfo("MAX(ratio)", SQLTypeAffinity.NULL, null)
)
)
)
@@ -156,7 +196,7 @@
QueryResultInfo(
listOf(
// unfortunately, we don't get this information
- ColumnInfo("mergedName", SQLTypeAffinity.NULL)
+ ColumnInfo("mergedName", SQLTypeAffinity.NULL, null)
)
)
)
@@ -172,9 +212,9 @@
`is`(
QueryResultInfo(
listOf(
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "User"),
// unfortunately, we don't get this information
- ColumnInfo("id", SQLTypeAffinity.INTEGER),
- ColumnInfo("mergedName", SQLTypeAffinity.NULL)
+ ColumnInfo("mergedName", SQLTypeAffinity.NULL, null)
)
)
)
@@ -213,9 +253,8 @@
`is`(
QueryResultInfo(
listOf(
- // unfortunately, we don't get this information
- ColumnInfo("id", SQLTypeAffinity.INTEGER),
- ColumnInfo("name", SQLTypeAffinity.TEXT)
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "User"),
+ ColumnInfo("name", SQLTypeAffinity.TEXT, "User")
)
)
)
@@ -242,8 +281,8 @@
`is`(
QueryResultInfo(
listOf(
- ColumnInfo("id", SQLTypeAffinity.INTEGER),
- ColumnInfo("name", SQLTypeAffinity.TEXT)
+ ColumnInfo("id", SQLTypeAffinity.INTEGER, "User"),
+ ColumnInfo("name", SQLTypeAffinity.TEXT, "User")
)
)
)
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt
index 0d0afec..28407f2 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/AutoMigrationWriterTest.kt
@@ -57,18 +57,15 @@
from = 1,
to = 2,
schemaDiff = SchemaDiffResult(
- addedColumns = linkedMapOf(
- Pair(
- "artistId",
- AutoMigration.AddedColumn(
- "Song",
- FieldBundle(
- "artistId",
- "artistId",
- "INTEGER",
- false,
- ""
- )
+ addedColumns = listOf(
+ AutoMigration.AddedColumn(
+ "Song",
+ FieldBundle(
+ "artistId",
+ "artistId",
+ "INTEGER",
+ false,
+ ""
)
)
),
@@ -118,18 +115,15 @@
from = 1,
to = 2,
schemaDiff = SchemaDiffResult(
- addedColumns = linkedMapOf(
- Pair(
- "artistId",
- AutoMigration.AddedColumn(
- "Song",
- FieldBundle(
- "artistId",
- "artistId",
- "INTEGER",
- false,
- ""
- )
+ addedColumns = listOf(
+ AutoMigration.AddedColumn(
+ "Song",
+ FieldBundle(
+ "artistId",
+ "artistId",
+ "INTEGER",
+ false,
+ ""
)
)
),
diff --git a/room/room-runtime/build.gradle b/room/room-runtime/build.gradle
index 48cdb86..8bd2c15 100644
--- a/room/room-runtime/build.gradle
+++ b/room/room-runtime/build.gradle
@@ -34,8 +34,8 @@
dependencies {
api(project(":room:room-common"))
- api(project(":sqlite:sqlite-framework"))
- api(project(":sqlite:sqlite"))
+ api("androidx.sqlite:sqlite-framework:2.2.0-alpha02")
+ api("androidx.sqlite:sqlite:2.2.0-alpha02")
implementation("androidx.arch.core:core-runtime:2.0.1")
compileOnly("androidx.paging:paging-common:2.0.0")
compileOnly("androidx.lifecycle:lifecycle-livedata-core:2.0.0")
diff --git a/room/room-runtime/lint-baseline.xml b/room/room-runtime/lint-baseline.xml
index 652ae67..ba13df3 100644
--- a/room/room-runtime/lint-baseline.xml
+++ b/room/room-runtime/lint-baseline.xml
@@ -410,6 +410,28 @@
<issue
id="NewApi"
+ message="Call requires API level 16 (current min is 14): `WRITE_AHEAD_LOGGING`"
+ errorLine1=" .setJournalMode(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING).build();"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/test/java/androidx/room/BuilderTest.java"
+ line="411"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 16 (current min is 14): `WRITE_AHEAD_LOGGING`"
+ errorLine1=" assertThat(config.journalMode, is(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING));"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/test/java/androidx/room/BuilderTest.java"
+ line="414"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="NewApi"
message="Call requires API level 21 (current min is 14): `java.util.Locale#forLanguageTag`"
errorLine1=" Locale.setDefault(Locale.forLanguageTag("tr-TR"));"
errorLine2=" ~~~~~~~~~~~~~~">
diff --git a/room/room-testing/build.gradle b/room/room-testing/build.gradle
index 89bbeeb7..d64b045 100644
--- a/room/room-testing/build.gradle
+++ b/room/room-testing/build.gradle
@@ -25,8 +25,8 @@
dependencies {
api(project(":room:room-common"))
api(project(":room:room-runtime"))
- api("androidx.sqlite:sqlite:2.0.1")
- api("androidx.sqlite:sqlite-framework:2.0.1")
+ api("androidx.sqlite:sqlite:2.2.0-alpha02")
+ api("androidx.sqlite:sqlite-framework:2.2.0-alpha02")
api(project(":room:room-migration"))
implementation("androidx.arch.core:core-runtime:2.0.1")
api(libs.junit)
diff --git a/security/security-crypto/gradlew.bat b/security/security-crypto/gradlew.bat
index e95643d..f9553162 100644
--- a/security/security-crypto/gradlew.bat
+++ b/security/security-crypto/gradlew.bat
@@ -1,84 +1,84 @@
-@if "%DEBUG%" == "" @echo off
-@rem ##########################################################################
-@rem
-@rem Gradle startup script for Windows
-@rem
-@rem ##########################################################################
-
-@rem Set local scope for the variables with windows NT shell
-if "%OS%"=="Windows_NT" setlocal
-
-set DIRNAME=%~dp0
-if "%DIRNAME%" == "" set DIRNAME=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-set DEFAULT_JVM_OPTS=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-:execute
-@rem Setup the command line
-
-set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
-
-@rem Execute Gradle
-"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="0" goto mainEnd
-
-:fail
-rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
-rem the _cmd.exe /c_ return code!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
index 161833b..515e915 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -368,7 +368,7 @@
includeProject(":compose:runtime:runtime-saveable:runtime-saveable-samples", "compose/runtime/runtime-saveable/samples", [BuildType.COMPOSE])
includeProject(":compose:runtime:runtime:benchmark", "compose/runtime/runtime/compose-runtime-benchmark", [BuildType.COMPOSE])
includeProject(":compose:runtime:runtime:integration-tests", "compose/runtime/runtime/integration-tests", [BuildType.COMPOSE])
-includeProject(":compose:runtime:runtime:runtime-samples", "compose/runtime/runtime/samples", [BuildType.COMPOSE])
+includeProject(":compose:runtime:runtime:runtime-samples", "compose/runtime/runtime/samples", [BuildType.MAIN, BuildType.COMPOSE])
includeProject(":compose:test-utils", "compose/test-utils", [BuildType.COMPOSE])
includeProject(":compose:ui", "compose/ui", [BuildType.COMPOSE])
includeProject(":compose:ui:ui", "compose/ui/ui", [BuildType.COMPOSE])
@@ -464,6 +464,7 @@
includeProject(":glance:glance", "glance/glance", [BuildType.MAIN])
includeProject(":glance:glance-appwidget", "glance/glance-appwidget", [BuildType.MAIN])
includeProject(":glance:glance-appwidget:integration-tests:demos", "glance/glance-appwidget/integration-tests/demos", [BuildType.MAIN])
+includeProject(":glance:glance-appwidget:glance-layout-generator", "glance/glance-appwidget/glance-layout-generator", [BuildType.MAIN])
includeProject(":glance:glance-wear", "glance/glance-wear", [BuildType.MAIN])
includeProject(":gridlayout:gridlayout", "gridlayout/gridlayout", [BuildType.MAIN])
includeProject(":health:health-services-client", "health/health-services-client", [BuildType.MAIN])
@@ -492,8 +493,8 @@
includeProject(":lifecycle:integration-tests:incrementality", "lifecycle/integration-tests/incrementality", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:integration-tests:lifecycle-testapp", "lifecycle/integration-tests/testapp", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:integration-tests:lifecycle-testapp-kotlin", "lifecycle/integration-tests/kotlintestapp", [BuildType.MAIN, BuildType.FLAN])
-includeProject(":lifecycle:lifecycle-common", "lifecycle/lifecycle-common", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
-includeProject(":lifecycle:lifecycle-common-java8", "lifecycle/lifecycle-common-java8", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
+includeProject(":lifecycle:lifecycle-common", "lifecycle/lifecycle-common", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR, BuildType.COMPOSE])
+includeProject(":lifecycle:lifecycle-common-java8", "lifecycle/lifecycle-common-java8", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR, BuildType.COMPOSE])
includeProject(":lifecycle:lifecycle-compiler", "lifecycle/lifecycle-compiler", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:lifecycle-extensions", "lifecycle/lifecycle-extensions", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:lifecycle-livedata", "lifecycle/lifecycle-livedata", [BuildType.MAIN, BuildType.FLAN])
@@ -505,10 +506,10 @@
includeProject(":lifecycle:lifecycle-process", "lifecycle/lifecycle-process", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:lifecycle-reactivestreams", "lifecycle/lifecycle-reactivestreams", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:lifecycle-reactivestreams-ktx", "lifecycle/lifecycle-reactivestreams-ktx", [BuildType.MAIN, BuildType.FLAN])
-includeProject(":lifecycle:lifecycle-runtime", "lifecycle/lifecycle-runtime", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
-includeProject(":lifecycle:lifecycle-runtime-ktx", "lifecycle/lifecycle-runtime-ktx", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
-includeProject(":lifecycle:lifecycle-runtime-ktx-lint", "lifecycle/lifecycle-runtime-ktx-lint", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
-includeProject(":lifecycle:lifecycle-runtime-testing", "lifecycle/lifecycle-runtime-testing", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
+includeProject(":lifecycle:lifecycle-runtime", "lifecycle/lifecycle-runtime", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR, BuildType.COMPOSE])
+includeProject(":lifecycle:lifecycle-runtime-ktx", "lifecycle/lifecycle-runtime-ktx", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR, BuildType.COMPOSE])
+includeProject(":lifecycle:lifecycle-runtime-ktx-lint", "lifecycle/lifecycle-runtime-ktx-lint", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR, BuildType.COMPOSE])
+includeProject(":lifecycle:lifecycle-runtime-testing", "lifecycle/lifecycle-runtime-testing", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR, BuildType.COMPOSE])
includeProject(":lifecycle:lifecycle-service", "lifecycle/lifecycle-service", [BuildType.MAIN, BuildType.FLAN])
includeProject(":lifecycle:lifecycle-viewmodel", "lifecycle/lifecycle-viewmodel", [BuildType.MAIN, BuildType.FLAN, BuildType.WEAR])
includeProject(":lifecycle:lifecycle-viewmodel-compose", "lifecycle/lifecycle-viewmodel-compose", [BuildType.COMPOSE])
@@ -531,6 +532,9 @@
includeProject(":media:media", "media/media", [BuildType.MAIN, BuildType.MEDIA])
includeProject(":mediarouter:mediarouter", "mediarouter/mediarouter", [BuildType.MAIN, BuildType.MEDIA])
includeProject(":mediarouter:mediarouter-testing", "mediarouter/mediarouter-testing", [BuildType.MAIN, BuildType.MEDIA])
+includeProject(":metrics:metrics-performance", "metrics/metrics-performance", [BuildType.MAIN])
+includeProject(":metrics:metrics-integration-tests", "metrics/integration-tests", [BuildType.MAIN])
+includeProject(":metrics:metrics-integration-tests:janktest", "metrics/integration-tests/janktest", [BuildType.MAIN])
includeProject(":navigation:navigation-benchmark", "navigation/navigation-benchmark", [BuildType.MAIN, BuildType.FLAN])
includeProject(":navigation:navigation-common", "navigation/navigation-common", [BuildType.MAIN, BuildType.FLAN, BuildType.COMPOSE])
includeProject(":navigation:navigation-common-ktx", "navigation/navigation-common-ktx", [BuildType.MAIN, BuildType.FLAN, BuildType.COMPOSE])
@@ -554,17 +558,17 @@
includeProject(":navigation:navigation-ui-ktx", "navigation/navigation-ui-ktx", [BuildType.MAIN, BuildType.FLAN])
includeProject(":paging:integration-tests:testapp", "paging/integration-tests/testapp", [BuildType.MAIN])
includeProject(":paging:paging-common", "paging/paging-common", [BuildType.MAIN, BuildType.COMPOSE])
-includeProject(":paging:paging-common-ktx", "paging/paging-common-ktx", [BuildType.MAIN])
+includeProject(":paging:paging-common-ktx", "paging/paging-common-ktx", [BuildType.MAIN, BuildType.COMPOSE])
includeProject(":paging:paging-compose", "paging/paging-compose", [BuildType.COMPOSE])
includeProject(":paging:paging-compose:paging-compose-samples", "paging/paging-compose/samples", [BuildType.COMPOSE])
includeProject(":paging:paging-compose:integration-tests:paging-demos", "paging/paging-compose/integration-tests/paging-demos", [BuildType.COMPOSE])
-includeProject(":paging:paging-guava", "paging/paging-guava", [BuildType.MAIN])
-includeProject(":paging:paging-runtime", "paging/paging-runtime", [BuildType.MAIN])
+includeProject(":paging:paging-guava", "paging/paging-guava", [BuildType.MAIN, BuildType.COMPOSE])
+includeProject(":paging:paging-runtime", "paging/paging-runtime", [BuildType.MAIN, BuildType.COMPOSE])
includeProject(":paging:paging-runtime-ktx", "paging/paging-runtime-ktx", [BuildType.MAIN])
-includeProject(":paging:paging-rxjava2", "paging/paging-rxjava2", [BuildType.MAIN])
+includeProject(":paging:paging-rxjava2", "paging/paging-rxjava2", [BuildType.MAIN, BuildType.COMPOSE])
includeProject(":paging:paging-rxjava2-ktx", "paging/paging-rxjava2-ktx", [BuildType.MAIN])
includeProject(":paging:paging-rxjava3", "paging/paging-rxjava3", [BuildType.MAIN])
-includeProject(":paging:paging-samples", "paging/samples", [BuildType.MAIN])
+includeProject(":paging:paging-samples", "paging/samples", [BuildType.MAIN, BuildType.COMPOSE])
includeProject(":palette:palette", "palette/palette", [BuildType.MAIN])
includeProject(":palette:palette-ktx", "palette/palette-ktx", [BuildType.MAIN])
includeProject(":percentlayout:percentlayout", "percentlayout/percentlayout", [BuildType.MAIN])
@@ -676,6 +680,7 @@
includeProject(":wear:tiles:tiles-renderer", "wear/tiles/tiles-renderer", [BuildType.MAIN, BuildType.WEAR])
includeProject(":wear:tiles:tiles-testing", "wear/tiles/tiles-testing", [BuildType.MAIN, BuildType.WEAR])
includeProject(":wear:watchface:watchface", "wear/watchface/watchface", [BuildType.MAIN, BuildType.WEAR])
+includeProject(":wear:watchface:watchface-complications", "wear/watchface/watchface-complications", [BuildType.MAIN, BuildType.WEAR])
includeProject(":wear:watchface:watchface-complications-data", "wear/watchface/watchface-complications-data", [BuildType.MAIN, BuildType.WEAR])
includeProject(":wear:watchface:watchface-complications-data-source", "wear/watchface/watchface-complications-data-source", [BuildType.MAIN, BuildType.WEAR])
includeProject(":wear:watchface:watchface-complications-data-source-ktx", "wear/watchface/watchface-complications-data-source-ktx", [BuildType.MAIN, BuildType.WEAR])
@@ -701,7 +706,7 @@
includeProject(":window:window-java", "window/window-java", [BuildType.MAIN])
includeProject(":window:window-rxjava2", "window/window-rxjava2", [BuildType.MAIN])
includeProject(":window:window-rxjava3", "window/window-rxjava3", [BuildType.MAIN])
-includeProject(":window:window-samples", "window/window-samples", [BuildType.MAIN])
+includeProject(":window:window-samples", "window/window-samples", [BuildType.MAIN, BuildType.FLAN])
includeProject(":window:window-sidecar", "window/window-sidecar", [BuildType.MAIN, BuildType.FLAN])
includeProject(":window:window-testing", "window/window-testing", [BuildType.MAIN, BuildType.FLAN])
includeProject(":work:integration-tests:testapp", "work/integration-tests/testapp", [BuildType.MAIN])
diff --git a/textclassifier/textclassifier/lint-baseline.xml b/textclassifier/textclassifier/lint-baseline.xml
index f2d0cf5..c7c3eb1 100644
--- a/textclassifier/textclassifier/lint-baseline.xml
+++ b/textclassifier/textclassifier/lint-baseline.xml
@@ -46,6 +46,50 @@
</issue>
<issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 14): `FLOATING_TOOLBAR_TAG`"
+ errorLine1=" final Object tag = FloatingToolbar.FLOATING_TOOLBAR_TAG;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/textclassifier/widget/FloatingToolbarEspressoUtils.java"
+ line="45"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 14): `MAIN_PANEL_TAG`"
+ errorLine1=" final Object tag = FloatingToolbar.MAIN_PANEL_TAG;"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/textclassifier/widget/FloatingToolbarEspressoUtils.java"
+ line="61"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 14): `OVERFLOW_PANEL_TAG`"
+ errorLine1=" final Object tag = FloatingToolbar.OVERFLOW_PANEL_TAG;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/textclassifier/widget/FloatingToolbarEspressoUtils.java"
+ line="66"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="NewApi"
+ message="Call requires API level 23 (current min is 14): `FLOATING_TOOLBAR_TAG`"
+ errorLine1=" final Object tag = FloatingToolbar.FLOATING_TOOLBAR_TAG;"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/androidTest/java/androidx/textclassifier/widget/FloatingToolbarEspressoUtils.java"
+ line="71"
+ column="44"/>
+ </issue>
+
+ <issue
id="WrongConstant"
message="Must be one of: ConversationAction.TYPE_VIEW_CALENDAR, ConversationAction.TYPE_VIEW_MAP, ConversationAction.TYPE_TRACK_FLIGHT, ConversationAction.TYPE_OPEN_URL, ConversationAction.TYPE_SEND_SMS, ConversationAction.TYPE_CALL_PHONE, ConversationAction.TYPE_SEND_EMAIL, ConversationAction.TYPE_TEXT_REPLY, ConversationAction.TYPE_CREATE_REMINDER, ConversationAction.TYPE_SHARE_LOCATION, ConversationAction.TYPE_ADD_CONTACT, ConversationAction.TYPE_COPY, but could be ConversationAction.TYPE_VIEW_CALENDAR, ConversationAction.TYPE_VIEW_MAP, ConversationAction.TYPE_TRACK_FLIGHT, ConversationAction.TYPE_OPEN_URL, ConversationAction.TYPE_SEND_SMS, ConversationAction.TYPE_CALL_PHONE, ConversationAction.TYPE_SEND_EMAIL, ConversationAction.TYPE_TEXT_REPLY, ConversationAction.TYPE_CREATE_REMINDER, ConversationAction.TYPE_SHARE_LOCATION"
errorLine1=" return new ConversationAction.Builder(conversationAction.getType())"
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle b/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle
index 76ae77a..78ff9ef 100644
--- a/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/build.gradle
@@ -21,6 +21,10 @@
}
android {
+ defaultConfig {
+ minSdk 28
+ }
+
buildTypes {
release {
minifyEnabled true
@@ -36,4 +40,5 @@
implementation projectOrArtifact(":activity:activity-ktx")
implementation 'androidx.core:core-ktx'
implementation(libs.material)
+ implementation 'androidx.wear:wear:1.1.0'
}
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
index e662e8c..9c46bbb 100644
--- a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
@@ -38,15 +38,36 @@
android:name=".StartActivity"
android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <intent-filter>
<action
android:name=
"androidx.wear.benchmark.integration.macrobenchmark.target.STARTUP_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
+
+ <activity
+ android:name=".SwipeActivity"
+ android:exported="true">
+ <intent-filter>
+ <action android:name=
+ "androidx.wear.benchmark.integration.macrobenchmark.target.SWIPE_ACTIVITY" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name=".ScrollActivity"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name=
+ "androidx.wear.benchmark.integration.macrobenchmark.target.SCROLL_ACTIVITY" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
</application>
</manifest>
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/benchmark/integration/macrobenchmark/target/ScrollActivity.kt b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/benchmark/integration/macrobenchmark/target/ScrollActivity.kt
new file mode 100644
index 0000000..7878ee9
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/benchmark/integration/macrobenchmark/target/ScrollActivity.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.benchmark.integration.macrobenchmark.target
+
+import android.app.Activity
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.LinearLayoutManager
+import androidx.recyclerview.widget.RecyclerView
+
+class ScrollActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_scroll)
+ val recycler = findViewById<RecyclerView>(R.id.recycler)
+ val itemCount = 5000
+ val adapter = EntryAdapter(entries(itemCount))
+ recycler.layoutManager = LinearLayoutManager(this)
+ recycler.adapter = adapter
+ }
+
+ private fun entries(size: Int) = List(size) {
+ Entry("Item $it")
+ }
+}
+
+data class Entry(val contents: String)
+
+class EntryViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
+ val content: TextView = itemView.findViewById(R.id.content)
+}
+
+class EntryAdapter(private val entries: List<Entry>) : RecyclerView.Adapter<EntryViewHolder>() {
+ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): EntryViewHolder {
+ val inflater = LayoutInflater.from(parent.context)
+ val itemView = inflater.inflate(R.layout.recycler_row, parent, false)
+ return EntryViewHolder(itemView)
+ }
+
+ override fun onBindViewHolder(holder: EntryViewHolder, position: Int) {
+ val entry = entries[position]
+ holder.content.text = entry.contents
+ }
+
+ override fun getItemCount(): Int = entries.size
+}
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/benchmark/integration/macrobenchmark/target/SwipeActivity.kt
similarity index 65%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to wear/benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/benchmark/integration/macrobenchmark/target/SwipeActivity.kt
index 2ab52fb..5aa5b3d 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/benchmark/integration/macrobenchmark/target/SwipeActivity.kt
@@ -14,7 +14,14 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.wear.benchmark.integration.macrobenchmark.target
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import android.app.Activity
+import android.os.Bundle
+
+class SwipeActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_swipe)
+ }
+}
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/activity_scroll.xml b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/activity_scroll.xml
new file mode 100644
index 0000000..9e60056
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/activity_scroll.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <androidx.recyclerview.widget.RecyclerView
+ android:id="@+id/recycler"
+ android:contentDescription="List of items"
+ android:layout_width="0dp"
+ android:layout_height="0dp"
+ app:layout_constraintBottom_toBottomOf="parent"
+ app:layout_constraintEnd_toEndOf="parent"
+ app:layout_constraintStart_toStartOf="parent"
+ app:layout_constraintTop_toTopOf="parent" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/activity_swipe.xml b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/activity_swipe.xml
new file mode 100644
index 0000000..26cc18a
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/activity_swipe.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<androidx.wear.widget.BoxInsetLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:app="http://schemas.android.com/apk/res-auto"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:background="@color/light_gray"
+ android:padding="@dimen/box_inset_layout_padding"
+ tools:context=".SwipeActivity"
+ tools:deviceIds="wear">
+
+ <androidx.wear.widget.SwipeDismissFrameLayout
+ android:id="@+id/swipe_dismiss"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent">
+
+ <TextView
+ android:id="@+id/test_content"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:gravity="center"
+ android:text="Swipe to dismiss" />
+ </androidx.wear.widget.SwipeDismissFrameLayout>
+
+</androidx.wear.widget.BoxInsetLayout>
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/recycler_row.xml b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/recycler_row.xml
new file mode 100644
index 0000000..1b11c06
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/layout/recycler_row.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+<androidx.cardview.widget.CardView
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:tools="http://schemas.android.com/tools"
+ android:id="@+id/card"
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:layout_margin="8dp">
+ <androidx.appcompat.widget.LinearLayoutCompat
+ android:layout_width="match_parent"
+ android:layout_height="wrap_content"
+ android:orientation="horizontal">
+
+ <androidx.appcompat.widget.AppCompatTextView
+ android:id="@+id/content"
+ android:layout_width="wrap_content"
+ android:layout_height="wrap_content"
+ android:layout_margin="16dp"
+ tools:text="Sample text" />
+
+ </androidx.appcompat.widget.LinearLayoutCompat>
+</androidx.cardview.widget.CardView>
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/colors.xml b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/colors.xml
new file mode 100644
index 0000000..2ad9819
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/colors.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+ <!-- custom colors. -->
+ <color name="transparent">#00000000</color>
+ <color name="white">@android:color/white</color>
+ <color name="black">@android:color/black</color>
+ <color name="gray">#424242</color>
+ <color name="light_gray">#d3d3d3</color>
+ <color name="dark_gray">#211E1D</color>
+ <color name="gray_white">#EEEEEE</color>
+</resources>
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/dimens.xml b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/dimens.xml
new file mode 100644
index 0000000..7759c27
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark-target/src/main/res/values/dimens.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?><!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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>
+ <!--
+ Because the window insets on round devices are larger than 15dp, this padding only applies
+ to square screens.
+ -->
+ <dimen name="box_inset_layout_padding">0dp</dimen>
+
+ <!--
+ This padding applies to both square and round screens. The total padding between the buttons
+ and the window insets is box_inset_layout_padding (above variable) on square screens and
+ inner_frame_layout_padding (below variable) on round screens.
+ -->
+ <dimen name="inner_frame_layout_padding">5dp</dimen>
+</resources>
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/benchmark/integration/macrobenchmark/ScrollBenchmark.kt b/wear/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/benchmark/integration/macrobenchmark/ScrollBenchmark.kt
new file mode 100644
index 0000000..dad771c
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/benchmark/integration/macrobenchmark/ScrollBenchmark.kt
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.benchmark.integration.macrobenchmark
+
+import android.content.Intent
+import android.graphics.Point
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.FrameTimingGfxInfoMetric
+import androidx.benchmark.macro.FrameTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import androidx.testutils.createCompilationParams
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ScrollBenchmark(
+ private val compilationMode: CompilationMode
+) {
+ @get:Rule
+ val benchmarkRule = MacrobenchmarkRule()
+
+ private lateinit var device: UiDevice
+
+ @Before
+ fun setUp() {
+ val instrumentation = InstrumentationRegistry.getInstrumentation()
+ device = UiDevice.getInstance(instrumentation)
+ }
+
+ @Test
+ fun start() {
+ benchmarkRule.measureRepeated(
+ packageName = PACKAGE_NAME,
+ metrics = listOf(FrameTimingMetric(), FrameTimingGfxInfoMetric()),
+ compilationMode = compilationMode,
+ iterations = 10,
+ setupBlock = {
+ val intent = Intent()
+ intent.action = ACTION
+ startActivityAndWait(intent)
+ }
+ ) {
+ val list = device.findObject(By.res(PACKAGE_NAME, RESOURCE_ID))
+ // Setting a gesture margin is important otherwise gesture nav is triggered.
+ list.setGestureMargin(device.displayWidth / 5)
+ repeat(5) {
+ list.drag(Point(list.visibleCenter.x, list.visibleCenter.y / 3))
+ device.waitForIdle()
+ }
+ }
+ }
+
+ companion object {
+ private const val PACKAGE_NAME = "androidx.wear.benchmark.integration.macrobenchmark.target"
+ private const val ACTION =
+ "androidx.wear.benchmark.integration.macrobenchmark.target.SCROLL_ACTIVITY"
+ private const val RESOURCE_ID = "recycler"
+
+ @Parameterized.Parameters(name = "compilation={0}")
+ @JvmStatic
+ fun parameters() = createCompilationParams()
+ }
+}
\ No newline at end of file
diff --git a/wear/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/benchmark/integration/macrobenchmark/SwipeBenchmark.kt b/wear/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/benchmark/integration/macrobenchmark/SwipeBenchmark.kt
new file mode 100644
index 0000000..ac2b1eb
--- /dev/null
+++ b/wear/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/benchmark/integration/macrobenchmark/SwipeBenchmark.kt
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.benchmark.integration.macrobenchmark
+
+import android.content.Intent
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.FrameTimingGfxInfoMetric
+import androidx.benchmark.macro.FrameTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.Direction
+import androidx.test.uiautomator.UiDevice
+import androidx.testutils.createCompilationParams
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SwipeBenchmark(
+ private val compilationMode: CompilationMode
+) {
+ @get:Rule
+ val benchmarkRule = MacrobenchmarkRule()
+
+ private lateinit var device: UiDevice
+
+ @Before
+ fun setUp() {
+ val instrumentation = InstrumentationRegistry.getInstrumentation()
+ device = UiDevice.getInstance(instrumentation)
+ }
+
+ @Test
+ fun start() {
+ benchmarkRule.measureRepeated(
+ packageName = PACKAGE_NAME,
+ metrics = listOf(FrameTimingMetric(), FrameTimingGfxInfoMetric()),
+ compilationMode = compilationMode,
+ iterations = 10,
+ setupBlock = {
+ val intent = Intent()
+ intent.action = ACTION
+ startActivityAndWait(intent)
+ }
+ ) {
+ val swipeToDismissBox = device.findObject(By.res(PACKAGE_NAME, RESOURCE_ID))
+ swipeToDismissBox.setGestureMargin(device.displayWidth / 5)
+ repeat(10) {
+ swipeToDismissBox.swipe(Direction.RIGHT, 0.75f)
+ device.waitForIdle()
+ }
+ }
+ }
+
+ companion object {
+ private const val PACKAGE_NAME = "androidx.wear.benchmark.integration.macrobenchmark.target"
+ private const val ACTION =
+ "androidx.wear.benchmark.integration.macrobenchmark.target.SWIPE_ACTIVITY"
+ private const val RESOURCE_ID = "swipe_dismiss"
+
+ @Parameterized.Parameters(name = "compilation={0}")
+ @JvmStatic
+ fun parameters() = createCompilationParams()
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/compose-foundation/build.gradle b/wear/compose/compose-foundation/build.gradle
index 7ac1f15..e2f55f9 100644
--- a/wear/compose/compose-foundation/build.gradle
+++ b/wear/compose/compose-foundation/build.gradle
@@ -47,6 +47,8 @@
androidTestImplementation project(path: ':compose:ui:ui-test-junit4')
androidTestImplementation project(path: ':compose:test-utils')
androidTestImplementation(libs.testRunner)
+
+ samples(project(":wear:compose:compose-foundation-samples"))
}
}
diff --git a/wear/compose/compose-material/api/current.txt b/wear/compose/compose-material/api/current.txt
index a92dace..1378cba 100644
--- a/wear/compose/compose-material/api/current.txt
+++ b/wear/compose/compose-material/api/current.txt
@@ -40,9 +40,9 @@
}
public final class CardKt {
- method @androidx.compose.runtime.Composable public static void AppCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> appName, kotlin.jvm.functions.Function0<kotlin.Unit> time, kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit> body, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? appImage, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long appColor, optional long timeColor, optional long titleColor, optional long bodyColor);
+ method @androidx.compose.runtime.Composable public static void AppCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> appName, kotlin.jvm.functions.Function0<kotlin.Unit> time, kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? appImage, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long appColor, optional long timeColor, optional long titleColor, optional long contentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long contentColor, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
- method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit> body, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long titleColor, optional long timeColor, optional long bodyColor);
+ method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long titleColor, optional long timeColor, optional long contentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
}
@androidx.compose.runtime.Stable public interface ChipColors {
diff --git a/wear/compose/compose-material/api/public_plus_experimental_current.txt b/wear/compose/compose-material/api/public_plus_experimental_current.txt
index 4acf37b..9637446 100644
--- a/wear/compose/compose-material/api/public_plus_experimental_current.txt
+++ b/wear/compose/compose-material/api/public_plus_experimental_current.txt
@@ -40,9 +40,9 @@
}
public final class CardKt {
- method @androidx.compose.runtime.Composable public static void AppCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> appName, kotlin.jvm.functions.Function0<kotlin.Unit> time, kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit> body, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? appImage, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long appColor, optional long timeColor, optional long titleColor, optional long bodyColor);
+ method @androidx.compose.runtime.Composable public static void AppCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> appName, kotlin.jvm.functions.Function0<kotlin.Unit> time, kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? appImage, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long appColor, optional long timeColor, optional long titleColor, optional long contentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long contentColor, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
- method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit> body, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long titleColor, optional long timeColor, optional long bodyColor);
+ method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long titleColor, optional long timeColor, optional long contentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
}
@androidx.compose.runtime.Stable public interface ChipColors {
diff --git a/wear/compose/compose-material/api/restricted_current.txt b/wear/compose/compose-material/api/restricted_current.txt
index a92dace..1378cba 100644
--- a/wear/compose/compose-material/api/restricted_current.txt
+++ b/wear/compose/compose-material/api/restricted_current.txt
@@ -40,9 +40,9 @@
}
public final class CardKt {
- method @androidx.compose.runtime.Composable public static void AppCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> appName, kotlin.jvm.functions.Function0<kotlin.Unit> time, kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit> body, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? appImage, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long appColor, optional long timeColor, optional long titleColor, optional long bodyColor);
+ method @androidx.compose.runtime.Composable public static void AppCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> appName, kotlin.jvm.functions.Function0<kotlin.Unit> time, kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? appImage, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long appColor, optional long timeColor, optional long titleColor, optional long contentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
method @androidx.compose.runtime.Composable public static void Card(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long contentColor, optional boolean enabled, optional androidx.compose.foundation.layout.PaddingValues contentPadding, optional androidx.compose.ui.graphics.Shape shape, optional androidx.compose.foundation.interaction.MutableInteractionSource interactionSource, optional androidx.compose.ui.semantics.Role? role, kotlin.jvm.functions.Function0<kotlin.Unit> content);
- method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> title, kotlin.jvm.functions.Function0<kotlin.Unit> body, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long titleColor, optional long timeColor, optional long bodyColor);
+ method @androidx.compose.runtime.Composable public static void TitleCard(kotlin.jvm.functions.Function0<kotlin.Unit> onClick, kotlin.jvm.functions.Function0<kotlin.Unit> title, optional androidx.compose.ui.Modifier modifier, optional kotlin.jvm.functions.Function0<kotlin.Unit>? time, optional androidx.compose.ui.graphics.painter.Painter backgroundPainter, optional long titleColor, optional long timeColor, optional long contentColor, kotlin.jvm.functions.Function0<kotlin.Unit> content);
}
@androidx.compose.runtime.Stable public interface ChipColors {
diff --git a/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/CardBenchmark.kt b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/CardBenchmark.kt
new file mode 100644
index 0000000..d785e90
--- /dev/null
+++ b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/CardBenchmark.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.benchmark
+
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.TitleCard
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Benchmark for Wear Compose Card.
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class CardChipBenchmark {
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val cardCaseFactory = { CardTestCase() }
+
+ @Test
+ fun first_compose() {
+ benchmarkRule.benchmarkFirstCompose(cardCaseFactory)
+ }
+
+ @Test
+ fun first_measure() {
+ benchmarkRule.benchmarkFirstMeasure(cardCaseFactory)
+ }
+
+ @Test
+ fun first_layout() {
+ benchmarkRule.benchmarkFirstLayout(cardCaseFactory)
+ }
+
+ @Test
+ fun first_draw() {
+ benchmarkRule.benchmarkFirstDraw(cardCaseFactory)
+ }
+
+ @Test
+ fun layout() {
+ benchmarkRule.benchmarkLayoutPerf(cardCaseFactory)
+ }
+
+ @Test
+ fun draw() {
+ benchmarkRule.benchmarkDrawPerf(cardCaseFactory)
+ }
+}
+
+internal class CardTestCase : LayeredComposeTestCase() {
+
+ @Composable
+ override fun MeasuredContent() {
+ TitleCard(
+ onClick = {},
+ time = {
+ Text("now")
+ },
+ title = {
+ Text("TitleCard")
+ },
+ ) {
+ Text("body")
+ }
+ }
+
+ @Composable
+ override fun ContentWrappers(content: @Composable () -> Unit) {
+ MaterialTheme {
+ content()
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ChipBenchmark.kt b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ChipBenchmark.kt
new file mode 100644
index 0000000..048c9de
--- /dev/null
+++ b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ChipBenchmark.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.benchmark
+
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.wear.compose.material.Chip
+import androidx.wear.compose.material.ChipDefaults
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Benchmark for Wear Compose Chip.
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class ChipBenchmark {
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val chipCaseFactory = { ChipTestCase() }
+
+ @Test
+ fun first_compose() {
+ benchmarkRule.benchmarkFirstCompose(chipCaseFactory)
+ }
+
+ @Test
+ fun first_measure() {
+ benchmarkRule.benchmarkFirstMeasure(chipCaseFactory)
+ }
+
+ @Test
+ fun first_layout() {
+ benchmarkRule.benchmarkFirstLayout(chipCaseFactory)
+ }
+
+ @Test
+ fun first_draw() {
+ benchmarkRule.benchmarkFirstDraw(chipCaseFactory)
+ }
+
+ @Test
+ fun layout() {
+ benchmarkRule.benchmarkLayoutPerf(chipCaseFactory)
+ }
+
+ @Test
+ fun draw() {
+ benchmarkRule.benchmarkDrawPerf(chipCaseFactory)
+ }
+}
+
+internal class ChipTestCase : LayeredComposeTestCase() {
+
+ @Composable
+ override fun MeasuredContent() {
+ Chip(
+ onClick = {},
+ colors = ChipDefaults.secondaryChipColors(),
+ label = {
+ Text("Primary label")
+ },
+ secondaryLabel = {
+ Text("Secondary label")
+ },
+ enabled = true,
+ )
+ }
+
+ @Composable
+ override fun ContentWrappers(content: @Composable () -> Unit) {
+ MaterialTheme {
+ content()
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ScalingLazyColumnBenchmark.kt b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ScalingLazyColumnBenchmark.kt
new file mode 100644
index 0000000..214ca1c
--- /dev/null
+++ b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ScalingLazyColumnBenchmark.kt
@@ -0,0 +1,114 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.benchmark
+
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.wear.compose.material.ExperimentalWearMaterialApi
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.ScalingLazyColumn
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.rememberScalingLazyListState
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Benchmark for Wear Compose ScalingLazyColumn.
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class ScalingLazyColumnBenchmark {
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val scalingLazyColumnCaseFactory = { ScalingLazyColumnTestCase() }
+
+ @Test
+ fun first_compose() {
+ benchmarkRule.benchmarkFirstCompose(scalingLazyColumnCaseFactory)
+ }
+
+ @Test
+ fun first_measure() {
+ benchmarkRule.benchmarkFirstMeasure(scalingLazyColumnCaseFactory)
+ }
+
+ @Test
+ fun first_layout() {
+ benchmarkRule.benchmarkFirstLayout(scalingLazyColumnCaseFactory)
+ }
+
+ @Test
+ fun first_draw() {
+ benchmarkRule.benchmarkFirstDraw(scalingLazyColumnCaseFactory)
+ }
+
+ @Test
+ fun layout() {
+ benchmarkRule.benchmarkLayoutPerf(scalingLazyColumnCaseFactory)
+ }
+
+ @Test
+ fun draw() {
+ benchmarkRule.benchmarkDrawPerf(scalingLazyColumnCaseFactory)
+ }
+}
+
+internal class ScalingLazyColumnTestCase : LayeredComposeTestCase() {
+ private var itemSizeDp: Dp = 10.dp
+ private var defaultItemSpacingDp: Dp = 4.dp
+
+ @OptIn(ExperimentalWearMaterialApi::class)
+ @Composable
+ override fun MeasuredContent() {
+ ScalingLazyColumn(
+ state = rememberScalingLazyListState(),
+ modifier = Modifier.requiredSize(
+ itemSizeDp * 3.5f + defaultItemSpacingDp * 2.5f
+ ),
+ ) {
+ items(10) { it ->
+ Box(Modifier.requiredSize(itemSizeDp)) {
+ Text(text = "Item $it")
+ }
+ }
+ }
+ }
+
+ @Composable
+ override fun ContentWrappers(content: @Composable () -> Unit) {
+ MaterialTheme {
+ content()
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/TimeTextBenchmark.kt b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/TimeTextBenchmark.kt
new file mode 100644
index 0000000..8f9a295
--- /dev/null
+++ b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/TimeTextBenchmark.kt
@@ -0,0 +1,126 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.benchmark
+
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.wear.compose.foundation.BasicCurvedText
+import androidx.wear.compose.material.ExperimentalWearMaterialApi
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.TimeText
+import androidx.wear.compose.material.TimeTextDefaults
+import androidx.wear.compose.material.TimeTextDefaults.CurvedTextSeparator
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Benchmark for Wear Compose TimeText.
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class TimeTextBenchmark {
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val timeTextCaseFactory = { TimeTextTestCase() }
+
+ @Test
+ fun first_compose() {
+ benchmarkRule.benchmarkFirstCompose(timeTextCaseFactory)
+ }
+
+ @Test
+ fun first_measure() {
+ benchmarkRule.benchmarkFirstMeasure(timeTextCaseFactory)
+ }
+
+ @Test
+ fun first_layout() {
+ benchmarkRule.benchmarkFirstLayout(timeTextCaseFactory)
+ }
+
+ @Test
+ fun first_draw() {
+ benchmarkRule.benchmarkFirstDraw(timeTextCaseFactory)
+ }
+
+ @Test
+ fun layout() {
+ benchmarkRule.benchmarkLayoutPerf(timeTextCaseFactory)
+ }
+
+ @Test
+ fun draw() {
+ benchmarkRule.benchmarkDrawPerf(timeTextCaseFactory)
+ }
+}
+
+internal class TimeTextTestCase : LayeredComposeTestCase() {
+ @OptIn(ExperimentalWearMaterialApi::class)
+ @Composable
+ override fun MeasuredContent() {
+ TimeText(
+ leadingLinearContent = {
+ Text(
+ text = "Leading content",
+ )
+ },
+ textLinearSeparator = {
+ TimeTextDefaults.TextSeparator()
+ },
+ trailingLinearContent = {
+ Text(
+ text = "Trailing content",
+ )
+ },
+ leadingCurvedContent = {
+ BasicCurvedText(
+ text = "Leading content",
+ style = TimeTextDefaults.timeCurvedTextStyle()
+ )
+ },
+ textCurvedSeparator = {
+ CurvedTextSeparator()
+ },
+ trailingCurvedContent = {
+ BasicCurvedText(
+ text = "Trailing content",
+ style = TimeTextDefaults.timeCurvedTextStyle()
+ )
+ },
+ )
+ }
+
+ @Composable
+ override fun ContentWrappers(content: @Composable () -> Unit) {
+ MaterialTheme {
+ content()
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ToggleChipBenchmark.kt b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ToggleChipBenchmark.kt
new file mode 100644
index 0000000..d7c5e86
--- /dev/null
+++ b/wear/compose/compose-material/benchmark/src/androidTest/java/androidx/wear/compose/material/benchmark/ToggleChipBenchmark.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.benchmark
+
+import androidx.compose.runtime.Composable
+import androidx.compose.testutils.LayeredComposeTestCase
+import androidx.compose.testutils.benchmark.ComposeBenchmarkRule
+import androidx.compose.testutils.benchmark.benchmarkDrawPerf
+import androidx.compose.testutils.benchmark.benchmarkFirstCompose
+import androidx.compose.testutils.benchmark.benchmarkFirstDraw
+import androidx.compose.testutils.benchmark.benchmarkFirstLayout
+import androidx.compose.testutils.benchmark.benchmarkFirstMeasure
+import androidx.compose.testutils.benchmark.benchmarkLayoutPerf
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.LargeTest
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.SplitToggleChip
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.ToggleChipDefaults
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+
+/**
+ * Benchmark for Wear Compose ToggleChip.
+ */
+@LargeTest
+@RunWith(AndroidJUnit4::class)
+class ToggleChipBenchmark {
+
+ @get:Rule
+ val benchmarkRule = ComposeBenchmarkRule()
+
+ private val toggleChipCaseFactory = { ToggleChipTestCase() }
+
+ @Test
+ fun first_compose() {
+ benchmarkRule.benchmarkFirstCompose(toggleChipCaseFactory)
+ }
+
+ @Test
+ fun first_measure() {
+ benchmarkRule.benchmarkFirstMeasure(toggleChipCaseFactory)
+ }
+
+ @Test
+ fun first_layout() {
+ benchmarkRule.benchmarkFirstLayout(toggleChipCaseFactory)
+ }
+
+ @Test
+ fun first_draw() {
+ benchmarkRule.benchmarkFirstDraw(toggleChipCaseFactory)
+ }
+
+ @Test
+ fun layout() {
+ benchmarkRule.benchmarkLayoutPerf(toggleChipCaseFactory)
+ }
+
+ @Test
+ fun draw() {
+ benchmarkRule.benchmarkDrawPerf(toggleChipCaseFactory)
+ }
+}
+
+internal class ToggleChipTestCase : LayeredComposeTestCase() {
+
+ @Composable
+ override fun MeasuredContent() {
+ SplitToggleChip(
+ checked = true,
+ onCheckedChange = {},
+ enabled = false,
+ label = { Text("Label") },
+ toggleIcon = { ToggleChipDefaults.CheckboxIcon(checked = true) },
+ onClick = {},
+ )
+ }
+
+ @Composable
+ override fun ContentWrappers(content: @Composable () -> Unit) {
+ MaterialTheme {
+ content()
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/compose-material/build.gradle b/wear/compose/compose-material/build.gradle
index 2c6e2ba..c8eda41 100644
--- a/wear/compose/compose-material/build.gradle
+++ b/wear/compose/compose-material/build.gradle
@@ -48,6 +48,8 @@
androidTestImplementation project(":test:screenshot:screenshot")
androidTestImplementation(libs.testRunner)
androidTestImplementation(libs.truth)
+
+ samples(project(":wear:compose:compose-material-samples"))
}
}
diff --git a/wear/compose/compose-material/lint-baseline.xml b/wear/compose/compose-material/lint-baseline.xml
index 25fd2c5..534e58b 100644
--- a/wear/compose/compose-material/lint-baseline.xml
+++ b/wear/compose/compose-material/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
<issue
id="NewApi"
@@ -74,7 +74,7 @@
errorLine2=" ~~~~~~~~~~~~~~">
<location
file="src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt"
- line="528"
+ line="564"
column="14"/>
</issue>
@@ -85,7 +85,7 @@
errorLine2=" ~~~~~~~~~~~~~~">
<location
file="src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt"
- line="549"
+ line="585"
column="14"/>
</issue>
@@ -96,7 +96,7 @@
errorLine2=" ~~~~~~~~~~~~~~">
<location
file="src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt"
- line="724"
+ line="757"
column="14"/>
</issue>
@@ -107,7 +107,7 @@
errorLine2=" ~~~~~~~~~~~~~~">
<location
file="src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt"
- line="799"
+ line="832"
column="14"/>
</issue>
@@ -118,7 +118,7 @@
errorLine2=" ~~~~~~~~~~~~~~">
<location
file="src/androidAndroidTest/kotlin/androidx/wear/compose/material/ChipTest.kt"
- line="888"
+ line="983"
column="10"/>
</issue>
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt
new file mode 100644
index 0000000..727a20c
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ButtonSample.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Button
+import androidx.wear.compose.material.ButtonDefaults
+import androidx.wear.compose.material.CompactButton
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.Text
+
+@Sampled
+@Composable
+fun ButtonWithIcon() {
+ Button(
+ onClick = { /* Do something */ },
+ enabled = true,
+ ) {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ }
+}
+
+@Sampled
+@Composable
+fun ButtonWithText() {
+ Button(
+ onClick = { /* Do something */ },
+ enabled = true,
+ modifier = Modifier.size(ButtonDefaults.LargeButtonSize)
+ ) {
+ Text("Big")
+ }
+}
+
+@Sampled
+@Composable
+fun CompactButtonWithIcon() {
+ CompactButton(
+ onClick = { /* Do something */ },
+ enabled = true,
+ ) {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ }
+}
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/CardSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/CardSample.kt
new file mode 100644
index 0000000..96b4312
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/CardSample.kt
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.AppCard
+import androidx.wear.compose.material.CardDefaults
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.TitleCard
+
+@Sampled
+@Composable
+fun AppCardWithIcon() {
+ AppCard(
+ onClick = {},
+ appName = { Text("AppName") },
+ appImage = {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ },
+ title = { Text("AppCard") },
+ time = { Text("now") },
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Some body content")
+ Text("and some more body content")
+ }
+ }
+}
+
+@Sampled
+@Composable
+fun TitleCardStandard() {
+ TitleCard(
+ onClick = {},
+ title = { Text("TitleCard") },
+ time = { Text("now") },
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Some body content")
+ Text("and some more body content")
+ }
+ }
+}
+
+@Sampled
+@Composable
+fun TitleCardWithImage() {
+ TitleCard(
+ onClick = { /* Do something */ },
+ title = { Text("TitleCard With an ImageBackground") },
+ backgroundPainter = CardDefaults.imageWithScrimBackgroundPainter(
+ backgroundImagePainter = painterResource(id = R.drawable.backgroundimage)
+ ),
+ contentColor = MaterialTheme.colors.onSurface,
+ titleColor = MaterialTheme.colors.onSurface,
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Text coloured to stand out on the image")
+ }
+ }
+}
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt
new file mode 100644
index 0000000..38fb2ee
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ChipSample.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Chip
+import androidx.wear.compose.material.CompactChip
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.Text
+
+@Sampled
+@Composable
+fun ChipWithIconAndLabels() {
+ Chip(
+ onClick = { /* Do something */ },
+ enabled = true,
+ label = { Text(text = "Main label") },
+ secondaryLabel = { Text(text = "secondary label") },
+ icon = {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ }
+ )
+}
+
+@Sampled
+@Composable
+fun CompactChipWithIconAndLabel() {
+ CompactChip(
+ onClick = { /* Do something */ },
+ enabled = true,
+ label = {
+ Text("Single line label", maxLines = 1, overflow = TextOverflow.Ellipsis)
+ },
+ icon = {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ },
+ )
+}
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ScalingLazyColumnSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ScalingLazyColumnSample.kt
index b7ff550..ac363d7 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ScalingLazyColumnSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ScalingLazyColumnSample.kt
@@ -56,6 +56,7 @@
}
}
+@Sampled
@Composable
fun ScalingLazyColumnWithHeaders() {
ScalingLazyColumn {
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/TimeTextSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/TimeTextSample.kt
index 0f02b23..601ce2e 100644
--- a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/TimeTextSample.kt
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/TimeTextSample.kt
@@ -76,7 +76,6 @@
}
@OptIn(ExperimentalWearMaterialApi::class)
-@Sampled
@Composable
fun TimeTextWithFullDateAndTimeFormat() {
TimeText(timeSource = TimeTextDefaults.timeSource("yyyy-MM-dd hh:mm"))
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ToggleButtonSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ToggleButtonSample.kt
new file mode 100644
index 0000000..1be38e2
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ToggleButtonSample.kt
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.ToggleButton
+
+@Sampled
+@Composable
+fun ToggleButtonWithIcon() {
+ var checked by remember { mutableStateOf(true) }
+ ToggleButton(
+ checked = checked,
+ onCheckedChange = { checked = it },
+ enabled = true,
+ ) {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ }
+}
diff --git a/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ToggleChipSample.kt b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ToggleChipSample.kt
new file mode 100644
index 0000000..6007bf6
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/java/androidx/wear/compose/material/samples/ToggleChipSample.kt
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.material.samples
+
+import androidx.annotation.Sampled
+import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.getValue
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.runtime.setValue
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextOverflow
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Icon
+import androidx.wear.compose.material.SplitToggleChip
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.ToggleChip
+import androidx.wear.compose.material.ToggleChipDefaults
+
+@Sampled
+@Composable
+fun ToggleChipWithIcon() {
+ var checked by remember { mutableStateOf(true) }
+ ToggleChip(
+ label = {
+ Text("SwitchIcon", maxLines = 1, overflow = TextOverflow.Ellipsis)
+ },
+ secondaryLabel = {
+ Text("With secondary label", maxLines = 1, overflow = TextOverflow.Ellipsis)
+ },
+ checked = checked,
+ toggleIcon = {
+ ToggleChipDefaults.SwitchIcon(checked = checked)
+ },
+ onCheckedChange = { checked = it },
+ appIcon = {
+ Icon(
+ painter = painterResource(id = R.drawable.ic_airplanemode_active_24px),
+ contentDescription = "airplane",
+ modifier = Modifier.size(24.dp).wrapContentSize(align = Alignment.Center),
+ )
+ },
+ enabled = true,
+ )
+}
+
+@Sampled
+@Composable
+fun SplitToggleChipWithCheckbox() {
+ var checked by remember { mutableStateOf(true) }
+ SplitToggleChip(
+ label = { Text("Split with CheckboxIcon") },
+ checked = checked,
+ toggleIcon = {
+ ToggleChipDefaults.CheckboxIcon(checked = checked)
+ },
+ onCheckedChange = { checked = it },
+ onClick = {
+ /* Do something */
+ },
+ enabled = true,
+ )
+}
diff --git a/wear/compose/compose-material/samples/src/main/res/drawable/backgroundimage.png b/wear/compose/compose-material/samples/src/main/res/drawable/backgroundimage.png
new file mode 100644
index 0000000..ea5a397
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/res/drawable/backgroundimage.png
Binary files differ
diff --git a/wear/compose/compose-material/samples/src/main/res/drawable/ic_airplanemode_active_24px.xml b/wear/compose/compose-material/samples/src/main/res/drawable/ic_airplanemode_active_24px.xml
new file mode 100644
index 0000000..7b7f3ea
--- /dev/null
+++ b/wear/compose/compose-material/samples/src/main/res/drawable/ic_airplanemode_active_24px.xml
@@ -0,0 +1,25 @@
+<!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ -->
+
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+ android:width="19dp"
+ android:height="20dp"
+ android:viewportWidth="19"
+ android:viewportHeight="20">
+ <path
+ android:pathData="M19,14V12L11,7V1.5C11,0.67 10.33,0 9.5,0C8.67,0 8,0.67 8,1.5V7L0,12V14L8,11.5V17L6,18.5V20L9.5,19L13,20V18.5L11,17V11.5L19,14Z"
+ android:fillColor="#ffffff"/>
+</vector>
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/CardTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/CardTest.kt
index 6f28ec5..e043377 100644
--- a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/CardTest.kt
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/CardTest.kt
@@ -230,8 +230,8 @@
var expectedAppColor = Color.Transparent
var expectedTimeColor = Color.Transparent
var expectedTitleColor = Color.Transparent
- var expectedBodyColor = Color.Transparent
- var actualBodyColor = Color.Transparent
+ var expectedContentColor = Color.Transparent
+ var actualContentColor = Color.Transparent
var actualTitleColor = Color.Transparent
var actualTimeColor = Color.Transparent
var actualAppColor = Color.Transparent
@@ -241,7 +241,7 @@
expectedAppColor = MaterialTheme.colors.onSurfaceVariant
expectedTimeColor = MaterialTheme.colors.onSurfaceVariant
expectedTitleColor = MaterialTheme.colors.onSurface
- expectedBodyColor = MaterialTheme.colors.onSurfaceVariant2
+ expectedContentColor = MaterialTheme.colors.onSurfaceVariant2
Box(
modifier = Modifier
.fillMaxSize()
@@ -251,25 +251,26 @@
onClick = {},
appName = { actualAppColor = LocalContentColor.current },
time = { actualTimeColor = LocalContentColor.current },
- body = { actualBodyColor = LocalContentColor.current },
title = { actualTitleColor = LocalContentColor.current },
modifier = Modifier.testTag(TEST_TAG)
- )
+ ) {
+ actualContentColor = LocalContentColor.current
+ }
}
}
assertEquals(expectedAppColor, actualAppColor)
assertEquals(expectedTimeColor, actualTimeColor)
assertEquals(expectedTitleColor, actualTitleColor)
- assertEquals(expectedBodyColor, actualBodyColor)
+ assertEquals(expectedContentColor, actualContentColor)
}
@Test
public fun title_card_gives_default_colors() {
var expectedTimeColor = Color.Transparent
var expectedTitleColor = Color.Transparent
- var expectedBodyColor = Color.Transparent
- var actualBodyColor = Color.Transparent
+ var expectedContentColor = Color.Transparent
+ var actualContentColor = Color.Transparent
var actualTitleColor = Color.Transparent
var actualTimeColor = Color.Transparent
val testBackground = Color.White
@@ -277,7 +278,7 @@
rule.setContentWithTheme {
expectedTimeColor = MaterialTheme.colors.onSurfaceVariant
expectedTitleColor = MaterialTheme.colors.onSurface
- expectedBodyColor = MaterialTheme.colors.onSurfaceVariant2
+ expectedContentColor = MaterialTheme.colors.onSurfaceVariant2
Box(
modifier = Modifier
.fillMaxSize()
@@ -286,16 +287,17 @@
TitleCard(
onClick = {},
time = { actualTimeColor = LocalContentColor.current },
- body = { actualBodyColor = LocalContentColor.current },
title = { actualTitleColor = LocalContentColor.current },
modifier = Modifier.testTag(TEST_TAG)
- )
+ ) {
+ actualContentColor = LocalContentColor.current
+ }
}
}
assertEquals(expectedTimeColor, actualTimeColor)
assertEquals(expectedTitleColor, actualTitleColor)
- assertEquals(expectedBodyColor, actualBodyColor)
+ assertEquals(expectedContentColor, actualContentColor)
}
private fun verifyColors(
@@ -353,17 +355,17 @@
var actualAppTextStyle = TextStyle.Default
var actualTimeTextStyle = TextStyle.Default
var actualTitleTextStyle = TextStyle.Default
- var actualBodyTextStyle = TextStyle.Default
+ var actuaContentTextStyle = TextStyle.Default
var expectedAppTextStyle = TextStyle.Default
var expectedTimeTextStyle = TextStyle.Default
var expectedTitleTextStyle = TextStyle.Default
- var expectedBodyTextStyle = TextStyle.Default
+ var expectedContentTextStyle = TextStyle.Default
rule.setContentWithTheme {
expectedAppTextStyle = MaterialTheme.typography.caption1
expectedTimeTextStyle = MaterialTheme.typography.caption1
expectedTitleTextStyle = MaterialTheme.typography.title3
- expectedBodyTextStyle = MaterialTheme.typography.body1
+ expectedContentTextStyle = MaterialTheme.typography.body1
AppCard(
onClick = {},
@@ -376,31 +378,30 @@
title = {
actualTitleTextStyle = LocalTextStyle.current
},
- body = {
- actualBodyTextStyle = LocalTextStyle.current
- },
modifier = Modifier.testTag(TEST_TAG)
- )
+ ) {
+ actuaContentTextStyle = LocalTextStyle.current
+ }
}
assertEquals(expectedAppTextStyle, actualAppTextStyle)
assertEquals(expectedTimeTextStyle, actualTimeTextStyle)
assertEquals(expectedTitleTextStyle, actualTitleTextStyle)
- assertEquals(expectedBodyTextStyle, actualBodyTextStyle)
+ assertEquals(expectedContentTextStyle, actuaContentTextStyle)
}
@Test
public fun title_card_gives_correct_text_style_base() {
var actualTimeTextStyle = TextStyle.Default
var actualTitleTextStyle = TextStyle.Default
- var actualBodyTextStyle = TextStyle.Default
+ var actuaContentTextStyle = TextStyle.Default
var expectedTimeTextStyle = TextStyle.Default
var expectedTitleTextStyle = TextStyle.Default
- var expectedBodyTextStyle = TextStyle.Default
+ var expectedContentTextStyle = TextStyle.Default
rule.setContentWithTheme {
expectedTimeTextStyle = MaterialTheme.typography.caption1
expectedTitleTextStyle = MaterialTheme.typography.title3
- expectedBodyTextStyle = MaterialTheme.typography.body1
+ expectedContentTextStyle = MaterialTheme.typography.body1
TitleCard(
onClick = {},
@@ -410,15 +411,14 @@
title = {
actualTitleTextStyle = LocalTextStyle.current
},
- body = {
- actualBodyTextStyle = LocalTextStyle.current
- },
modifier = Modifier.testTag(TEST_TAG)
- )
+ ) {
+ actuaContentTextStyle = LocalTextStyle.current
+ }
}
assertEquals(expectedTimeTextStyle, actualTimeTextStyle)
assertEquals(expectedTitleTextStyle, actualTitleTextStyle)
- assertEquals(expectedBodyTextStyle, actualBodyTextStyle)
+ assertEquals(expectedContentTextStyle, actuaContentTextStyle)
}
}
diff --git a/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeableTest.kt b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeableTest.kt
new file mode 100644
index 0000000..05b8c1a
--- /dev/null
+++ b/wear/compose/compose-material/src/androidAndroidTest/kotlin/androidx/wear/compose/material/SwipeableTest.kt
@@ -0,0 +1,232 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.compose.foundation.gestures.Orientation
+import androidx.compose.foundation.gestures.Orientation.Horizontal
+import androidx.compose.foundation.gestures.Orientation.Vertical
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.requiredSize
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.remember
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.geometry.Size
+import androidx.compose.ui.platform.LocalDensity
+import androidx.compose.ui.platform.LocalViewConfiguration
+import androidx.compose.ui.platform.ViewConfiguration
+import androidx.compose.ui.platform.testTag
+import androidx.compose.ui.semantics.SemanticsProperties.HorizontalScrollAxisRange
+import androidx.compose.ui.semantics.SemanticsProperties.VerticalScrollAxisRange
+import androidx.compose.ui.semantics.getOrNull
+import androidx.compose.ui.test.SemanticsMatcher
+import androidx.compose.ui.test.SemanticsMatcher.Companion.keyNotDefined
+import androidx.compose.ui.test.assert
+import androidx.compose.ui.test.junit4.createComposeRule
+import androidx.compose.ui.test.onNodeWithTag
+import androidx.compose.ui.test.performTouchInput
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.ExperimentalWearMaterialApi
+import androidx.wear.compose.material.SwipeableState
+import androidx.wear.compose.material.swipeable
+import org.junit.Rule
+import org.junit.Test
+import kotlin.math.absoluteValue
+
+// TODO(b/201009199) Some of these tests may need specific values adjusted when swipeable
+// supports property nested scrolling, but the tests should all still be valid.
+@OptIn(ExperimentalWearMaterialApi::class)
+class SwipeableTest {
+ @get:Rule
+ val rule = createComposeRule()
+
+ @Test
+ fun hasHorizontalScrollSemantics_atMaxValue_whenUnswiped() {
+ rule.setContent {
+ SimpleSwipeableBox { size ->
+ Modifier.swipeable(
+ state = SwipeableState(false),
+ anchors = mapOf(0f to false, size.width to true),
+ orientation = Horizontal,
+ )
+ }
+ }
+
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(hasScrollRangeCloseTo(Horizontal, value = 1f, maxValue = 1f))
+ .assert(keyNotDefined(VerticalScrollAxisRange))
+ }
+
+ @Test
+ fun hasVerticalScrollSemantics_atMaxValue_whenUnswiped() {
+ rule.setContent {
+ SimpleSwipeableBox { size ->
+ Modifier.swipeable(
+ state = SwipeableState(false),
+ anchors = mapOf(0f to false, size.height to true),
+ orientation = Vertical,
+ )
+ }
+ }
+
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(hasScrollRangeCloseTo(Vertical, value = 1f, maxValue = 1f))
+ .assert(keyNotDefined(HorizontalScrollAxisRange))
+ }
+
+ @Test
+ fun hasScrollSemantics_whenSwiped() {
+ rule.setContent {
+ SimpleSwipeableBox { size ->
+ Modifier.swipeable(
+ state = SwipeableState(false),
+ anchors = mapOf(0f to false, size.width to true),
+ orientation = Horizontal,
+ )
+ }
+ }
+
+ rule.onNodeWithTag(TEST_TAG)
+ .performTouchInput {
+ down(centerLeft)
+ moveTo(centerLeft + percentOffset(.25f, 0f))
+ }
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(hasScrollRangeCloseTo(Horizontal, value = 0.75f, maxValue = 1f))
+
+ rule.onNodeWithTag(TEST_TAG)
+ .performTouchInput {
+ moveTo(center)
+ }
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(hasScrollRangeCloseTo(Horizontal, value = 0.5f, maxValue = 1f))
+ }
+
+ @Test
+ fun hasScrollSemantics_whenSwipedWithReverseDirection() {
+ rule.setContent {
+ SimpleSwipeableBox { size ->
+ Modifier.swipeable(
+ state = SwipeableState(false),
+ anchors = mapOf(0f to false, size.width to true),
+ orientation = Horizontal,
+ reverseDirection = true
+ )
+ }
+ }
+
+ rule.onNodeWithTag(TEST_TAG)
+ .performTouchInput {
+ down(centerRight)
+ moveTo(centerRight - percentOffset(.25f, 0f))
+ }
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(
+ hasScrollRangeCloseTo(
+ orientation = Horizontal,
+ value = 0.75f,
+ maxValue = 1f,
+ reverseScrolling = true
+ )
+ )
+
+ rule.onNodeWithTag(TEST_TAG)
+ .performTouchInput {
+ moveTo(center)
+ }
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(
+ hasScrollRangeCloseTo(
+ orientation = Horizontal,
+ value = 0.5f,
+ maxValue = 1f,
+ reverseScrolling = true
+ )
+ )
+ }
+
+ @Test
+ fun hasNoScrollSemantics_whenDisabled() {
+ rule.setContent {
+ SimpleSwipeableBox { size ->
+ Modifier.swipeable(
+ state = SwipeableState(false),
+ anchors = mapOf(0f to false, size.width to true),
+ orientation = Horizontal,
+ enabled = false
+ )
+ }
+ }
+
+ rule.onNodeWithTag(TEST_TAG)
+ .assert(keyNotDefined(HorizontalScrollAxisRange))
+ .assert(keyNotDefined(VerticalScrollAxisRange))
+ }
+
+ /**
+ * A square [Box] has the [TEST_TAG] test tag. Touch slop is disabled to make swipe calculations
+ * more exact.
+ */
+ @Composable
+ private fun SimpleSwipeableBox(swipeableModifier: (Size) -> Modifier) {
+ val originalViewConfiguration = LocalViewConfiguration.current
+ val viewConfiguration = remember(originalViewConfiguration) {
+ object : ViewConfiguration by originalViewConfiguration {
+ override val touchSlop: Float = 0f
+ }
+ }
+
+ with(LocalDensity.current) {
+ val size = 100.dp
+ val sizePx = size.toPx()
+
+ CompositionLocalProvider(LocalViewConfiguration provides viewConfiguration) {
+ Box(
+ Modifier
+ .testTag(TEST_TAG)
+ .requiredSize(size)
+ .then(remember { swipeableModifier(Size(sizePx, sizePx)) })
+ )
+ }
+ }
+ }
+
+ /**
+ * Matches either a [HorizontalScrollAxisRange] or [VerticalScrollAxisRange] that has the given
+ * [maxValue] and [reverseScrolling], and a `value` that is within a small threshold of [value].
+ */
+ private fun hasScrollRangeCloseTo(
+ orientation: Orientation,
+ value: Float,
+ maxValue: Float,
+ reverseScrolling: Boolean = false
+ ): SemanticsMatcher = SemanticsMatcher(
+ "has $orientation scroll range [0,$maxValue] with " +
+ "value=$value" + if (reverseScrolling) " (reversed)" else ""
+ ) { node ->
+ val threshold = .1f
+ val property = when (orientation) {
+ Horizontal -> HorizontalScrollAxisRange
+ Vertical -> VerticalScrollAxisRange
+ }
+ node.config.getOrNull(property)?.let { range ->
+ (range.value() - value).absoluteValue <= threshold &&
+ range.maxValue() == maxValue &&
+ range.reverseScrolling == reverseScrolling
+ } ?: false
+ }
+}
+
+private const val TEST_TAG = "swipeable"
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt
index 36d4d51..fa16216 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Button.kt
@@ -54,6 +54,12 @@
*
* [Button]s can be enabled or disabled. A disabled button will not respond to click events.
*
+ * Example of a [Button] displaying an icon:
+ * @sample androidx.wear.compose.material.samples.ButtonWithIcon
+ *
+ * Example of a [Button] with text content and size modified to LargeButtonSize:
+ * @sample androidx.wear.compose.material.samples.ButtonWithText
+ *
* @param onClick Will be called when the user clicks the button.
* @param modifier Modifier to be applied to the button.
* @param enabled Controls the enabled state of the button. When `false`, this button will not
@@ -121,6 +127,9 @@
*
* [CompactButton]s can be enabled or disabled. A disabled button will not respond to click events.
*
+ * Example usage:
+ * @sample androidx.wear.compose.material.samples.CompactButtonWithIcon
+ *
* @param onClick Will be called when the user clicks the button.
* @param modifier Modifier to be applied to the button.
* @param enabled Controls the enabled state of the button. When `false`, this button will not
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Card.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Card.kt
index 62c0d49..5d6e91f 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Card.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Card.kt
@@ -157,17 +157,23 @@
*
* The second row shows a title, this is expected to be a single row of start aligned [Text].
*
- * The rest of the [Card] contains the body content which can be either [Text] or an [Image].
+ * The rest of the [Card] contains the content which can be either [Text] or an [Image].
+ * If the content is text it can be single or multiple line and is expected to be Top and Start
+ * aligned.
+ *
+ * If more than one composable is provided in the content slot it is the responsibility of the
+ * caller to determine how to layout the contents, e.g. provide either a row or a column.
+ *
+ * Example of an [AppCard] with icon, title, time and two lines of body text:
+ * @sample androidx.wear.compose.material.samples.AppCardWithIcon
*
* @param onClick Will be called when the user clicks the card
- * @param appName A slot for displaying the application name, expected to be a single line of text
- * of [Typography.title3]
+ * @param appName A slot for displaying the application name, expected to be a single line of start
+ * aligned text of [Typography.title3]
* @param time A slot for displaying the time relevant to the contents of the card, expected to be a
* short piece of end aligned text.
- * @param title A slot for displaying the title of the card, expected to be one or two lines of text
- * of [Typography.button]
- * @param body A slot for displaying the details of the [Card], expected to be either [Text]
- * (single or multiple-line) or an [Image]
+ * @param title A slot for displaying the title of the card, expected to be one or two lines of
+ * start aligned text of [Typography.button]
* @param modifier Modifier to be applied to the card
* @param appImage A slot for a small ([CardDefaults.AppImageSize]x[CardDefaults.AppImageSize] )
* [Image] associated with the application.
@@ -178,7 +184,7 @@
* set.
* @param timeColor The default color to use for time() slot unless explicitly set.
* @param titleColor The default color to use for title() slot unless explicitly set.
- * @param bodyColor The default color to use for body() slot unless explicitly set.
+ * @param contentColor The default color to use for content() slot unless explicitly set.
*/
@Composable
public fun AppCard(
@@ -186,14 +192,14 @@
appName: @Composable () -> Unit,
time: @Composable () -> Unit,
title: @Composable () -> Unit,
- body: @Composable () -> Unit,
modifier: Modifier = Modifier,
appImage: @Composable (() -> Unit)? = null,
backgroundPainter: Painter = CardDefaults.cardBackgroundPainter(),
appColor: Color = MaterialTheme.colors.onSurfaceVariant,
timeColor: Color = MaterialTheme.colors.onSurfaceVariant,
titleColor: Color = MaterialTheme.colors.onSurface,
- bodyColor: Color = MaterialTheme.colors.onSurfaceVariant2,
+ contentColor: Color = MaterialTheme.colors.onSurfaceVariant2,
+ content: @Composable () -> Unit,
) {
Card(
onClick = onClick,
@@ -234,9 +240,9 @@
content = title
)
CompositionLocalProvider(
- LocalContentColor provides bodyColor,
+ LocalContentColor provides contentColor,
LocalTextStyle provides MaterialTheme.typography.body1,
- content = body
+ content = content
)
}
}
@@ -253,17 +259,26 @@
* end of the row, expected to be an end aligned [Text] composable showing a time relevant to the
* contents of the [Card].
*
- * The rest of the [Card] contains the body content which is expected to be [Text] or a contained
+ * The rest of the [Card] contains the content which is expected to be [Text] or a contained
* [Image].
*
- * Overall the [title] and [body] text should be no more than 5 rows of text combined.
+ * If the content is text it can be single or multiple line and is expected to be Top and Start
+ * aligned and of type of [Typography.body1].
+ *
+ * Overall the [title] and [content] text should be no more than 5 rows of text combined.
+ *
+ * If more than one composable is provided in the content slot it is the responsibility of the
+ * caller to determine how to layout the contents, e.g. provide either a row or a column.
+ *
+ * Example of a [TitleCard] with two lines of body text:
+ * @sample androidx.wear.compose.material.samples.TitleCardStandard
+ *
+ * Example of a title card with a background image:
+ * @sample androidx.wear.compose.material.samples.TitleCardWithImage
*
* @param onClick Will be called when the user clicks the card
* @param title A slot for displaying the title of the card, expected to be one or two lines of text
* of [Typography.button]
- * @param body A slot for displaying the details of the [Card], expected to be either [Text]
- * (single or multiple-line) or an [Image]. If [Text] then it is expected to be a maximum of 4 lines
- * of text of [Typography.body1]
* @param modifier Modifier to be applied to the card
* @param time An optional slot for displaying the time relevant to the contents of the card,
* expected to be a short piece of end aligned text.
@@ -273,19 +288,19 @@
* appropriate painter
* @param titleColor The default color to use for title() slot unless explicitly set.
* @param timeColor The default color to use for time() slot unless explicitly set.
- * @param bodyColor The default color to use for body() slot unless explicitly set.
+ * @param contentColor The default color to use for content() slot unless explicitly set.
*/
@Composable
public fun TitleCard(
onClick: () -> Unit,
title: @Composable () -> Unit,
- body: @Composable () -> Unit,
modifier: Modifier = Modifier,
time: @Composable (() -> Unit)? = null,
backgroundPainter: Painter = CardDefaults.cardBackgroundPainter(),
titleColor: Color = MaterialTheme.colors.onSurface,
timeColor: Color = MaterialTheme.colors.onSurfaceVariant,
- bodyColor: Color = MaterialTheme.colors.onSurfaceVariant2,
+ contentColor: Color = MaterialTheme.colors.onSurfaceVariant2,
+ content: @Composable () -> Unit,
) {
Card(
onClick = onClick,
@@ -316,9 +331,9 @@
}
Spacer(modifier = Modifier.height(2.dp))
CompositionLocalProvider(
- LocalContentColor provides bodyColor,
+ LocalContentColor provides contentColor,
LocalTextStyle provides MaterialTheme.typography.body1,
- content = body
+ content = content
)
}
}
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
index 9160319..099cdc0 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Chip.kt
@@ -168,6 +168,9 @@
*
* Chips can be enabled or disabled. A disabled chip will not respond to click events.
*
+ * Example of a [Chip] with icon, label and secondary label:
+ * @sample androidx.wear.compose.material.samples.ChipWithIconAndLabels
+ *
* @param label A slot for providing the chip's main label. The contents are expected to be text
* which is "start" aligned if there is an icon preset and "start" or "center" aligned if not.
* @param onClick Will be called when the user clicks the chip
@@ -281,6 +284,9 @@
*
* Chips can be enabled or disabled. A disabled chip will not respond to click events.
*
+ * Example of a [CompactChip] with icon and single line of label text:
+ * @sample androidx.wear.compose.material.samples.CompactChipWithIconAndLabel
+ *
* @param onClick Will be called when the user clicks the chip
* @param modifier Modifier to be applied to the chip
* @param label A slot for providing the chip's main label. The contents are expected to be text
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt
index 200a3b4..fd0b9c3 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/SwipeToDismissBox.kt
@@ -51,10 +51,6 @@
* Wear Material [SwipeToDismissBox] that handles the swipe-to-dismiss gesture. Takes a single
* slot for the background (only displayed during the swipe gesture) and the foreground content.
*
- * [SwipeToDismissBox] has not yet been integrated with Android's
- * default handling for swipe to dismiss on Wear applications. Until that is completed,
- * applications using [SwipeToDismissBox] must disable android:windowSwipeToDismiss.
- *
* Example usage:
* @sample androidx.wear.compose.material.samples.SimpleSwipeToDismissBox
*
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Swipeable.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Swipeable.kt
index 8d9b273..7c55973 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Swipeable.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/Swipeable.kt
@@ -39,6 +39,10 @@
import androidx.compose.ui.composed
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.debugInspectorInfo
+import androidx.compose.ui.semantics.ScrollAxisRange
+import androidx.compose.ui.semantics.horizontalScrollAxisRange
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.semantics.verticalScrollAxisRange
import androidx.compose.ui.unit.Density
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
@@ -553,7 +557,39 @@
state.processNewAnchors(oldAnchors, anchors)
}
- Modifier.draggable(
+ // Swipeables publish scroll range semantics so they look like they can scroll between values
+ // of 0 and 1, inclusive, so that AndroidComposeView can report a value from its canScroll
+ // methods that correctly tells the system's ScrollDismissLayout whether it should intercept
+ // touch values (see b/199908428). This logic is *not* duplicated in the non-Wear swipeable
+ // because it's a bit of a hack to fix navigation in WearOS. Once swipeable implements proper
+ // nested scrolling, and the two swipeable implementations are merged, this fake scrolling stuff
+ // should be gone anyway. Also note that the regular Android swipe-to-go-back gesture works very
+ // differently than the wear gesture so we don't need this workaround to support it.
+ // TODO(b/201009199): Modifier.swipeable should coordinate with the nested scrolling system.
+ val semantics = if (!enabled) Modifier else Modifier.semantics {
+ // Set a fake scroll range axis so that the AndroidComposeView can correctly report whether
+ // scrolling is supported via canScroll{Horizontally,Vertically}.
+ val range = ScrollAxisRange(
+ value = value@{
+ // Avoid dividing by 0.
+ if (state.minBound == state.maxBound) return@value 0f
+ val clampedOffset = state.offset.value.coerceIn(state.minBound, state.maxBound)
+ // [0f, 1f] representing the fraction between the swipe bounds.
+ val swipeFraction =
+ (clampedOffset - state.minBound) / (state.maxBound - state.minBound)
+ // Invert the swipe fraction.
+ 1f - swipeFraction
+ },
+ maxValue = { 1f },
+ reverseScrolling = reverseDirection
+ )
+ when (orientation) {
+ Orientation.Horizontal -> horizontalScrollAxisRange = range
+ Orientation.Vertical -> verticalScrollAxisRange = range
+ }
+ }
+
+ Modifier.then(semantics).draggable(
orientation = orientation,
enabled = enabled,
reverseDirection = reverseDirection,
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleButton.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleButton.kt
index b9df8bf..51a6eb3 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleButton.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleButton.kt
@@ -56,6 +56,9 @@
* [ToggleButton]s can be enabled or disabled. A disabled toggle button will not respond to click
* events.
*
+ * Example of a [ToggleButton] with an icon:
+ * @sample androidx.wear.compose.material.samples.ToggleButtonWithIcon
+ *
* @param checked Boolean flag indicating whether this toggle button is currently checked.
* @param onCheckedChange Callback to be invoked when this toggle button is clicked.
* @param modifier Modifier to be applied to the toggle button.
diff --git a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleChip.kt b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleChip.kt
index fed45db..93672ee 100644
--- a/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleChip.kt
+++ b/wear/compose/compose-material/src/commonMain/kotlin/androidx/wear/compose/material/ToggleChip.kt
@@ -80,6 +80,9 @@
*
* Chips can be enabled or disabled. A disabled chip will not respond to click events.
*
+ * Example of a [ToggleChip] with an icon, label and secondary label (defaults to switch toggle):
+ * @sample androidx.wear.compose.material.samples.ToggleChipWithIcon
+ *
* @param checked Boolean flag indicating whether this button is currently checked.
* @param onCheckedChange Callback to be invoked when this buttons checked/selected status is
* @param label A slot for providing the chip's main label. The contents are expected to be text
@@ -244,6 +247,9 @@
*
* Chips can be enabled or disabled. A disabled chip will not respond to click events.
*
+ * Example of a [SplitToggleChip] with a label and the toggle icon changed to checkbox:
+ * @sample androidx.wear.compose.material.samples.SplitToggleChipWithCheckbox
+ *
* @param checked Boolean flag indicating whether this button is currently checked.
* @param onCheckedChange Callback to be invoked when this buttons checked/selected status is
* changed.
diff --git a/wear/compose/integration-tests/demos/src/main/AndroidManifest.xml b/wear/compose/integration-tests/demos/src/main/AndroidManifest.xml
index 9a2a047..5202ad2 100644
--- a/wear/compose/integration-tests/demos/src/main/AndroidManifest.xml
+++ b/wear/compose/integration-tests/demos/src/main/AndroidManifest.xml
@@ -26,7 +26,7 @@
android:theme="@android:style/Theme.DeviceDefault">
<activity
android:name=".DemoActivity"
- android:theme="@style/AppThemeNoSwipe"
+ android:theme="@android:style/Theme.DeviceDefault"
android:exported="true"
android:label="@string/app_name">
<intent-filter>
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt
index 6aec272..1b9c45a 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/CardDemo.kt
@@ -64,13 +64,12 @@
appName = { Text("AppName") },
title = { Text("AppCard") },
time = { Text("now") },
- body = {
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("Some body content")
- Text("and some more body content")
- }
- },
- )
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Some body content")
+ Text("and some more body content")
+ }
+ }
}
item {
AppCard(
@@ -79,65 +78,60 @@
appImage = { DemoImage(resourceId = R.drawable.ic_maps_icon) },
title = { Text("AppCard") },
time = { Text("now") },
- body = {
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("Some body content")
- Text("and some more body content")
- }
- },
- )
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Some body content")
+ Text("and some more body content")
+ }
+ }
}
item {
TitleCard(
onClick = {},
title = { Text("TitleCard") },
time = { Text("now") },
- body = {
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("Some body content")
- Text("and some more body content")
- }
- },
- )
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Some body content")
+ Text("and some more body content")
+ }
+ }
}
item {
TitleCard(
onClick = {},
title = { Text("TitleCard") },
- body = {
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("This title card doesn't show time")
- }
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("This title card doesn't show time")
}
- )
+ }
}
item {
TitleCard(
onClick = {},
title = { Text("Custom TitleCard") },
- body = {
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("This title card emphasises the title with custom color")
- }
- },
titleColor = Color.Yellow
- )
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("This title card emphasises the title with custom color")
+ }
+ }
}
item {
TitleCard(
onClick = {},
title = { Text("TitleCard With an ImageBackground") },
- body = {
- Column(modifier = Modifier.fillMaxWidth()) {
- Text("Text coloured to stand out on the image")
- }
- },
backgroundPainter = CardDefaults.imageWithScrimBackgroundPainter(
backgroundImagePainter = painterResource(id = R.drawable.backgroundimage1)
),
- bodyColor = MaterialTheme.colors.onSurface,
+ contentColor = MaterialTheme.colors.onSurface,
titleColor = MaterialTheme.colors.onSurface,
- )
+ ) {
+ Column(modifier = Modifier.fillMaxWidth()) {
+ Text("Text coloured to stand out on the image")
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoComponents.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoComponents.kt
index 73208568..94f4c71 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoComponents.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/DemoComponents.kt
@@ -19,7 +19,10 @@
import android.app.Activity
import androidx.activity.ComponentActivity
import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.requiredSize
import androidx.compose.foundation.layout.size
@@ -140,4 +143,15 @@
}
}
+@Composable
+fun Centralize(content: @Composable () -> Unit) {
+ Column(
+ modifier = Modifier.fillMaxSize(),
+ verticalArrangement = Arrangement.Center,
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
+ content()
+ }
+}
+
public val DemoListTag = "DemoListTag"
\ No newline at end of file
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/FoundationDemos.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/FoundationDemos.kt
index 54102a5..e7bf854 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/FoundationDemos.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/FoundationDemos.kt
@@ -27,5 +27,7 @@
ComposableDemo("Alignment") { CurvedRowAlignmentDemo() },
ComposableDemo("Curved Text") { BasicCurvedTextDemo() },
ComposableDemo("Curved and Normal Text") { CurvedAndNormalText() },
+ ComposableDemo("Scrollable Column") { ScrollableColumnDemo() },
+ ComposableDemo("Scrollable Row") { ScrollableRowDemo() },
),
)
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
index 8079ed5..83c7663 100644
--- a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/MaterialDemos.kt
@@ -19,6 +19,12 @@
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.wear.compose.material.ExperimentalWearMaterialApi
+import androidx.wear.compose.material.samples.AppCardWithIcon
+import androidx.wear.compose.material.samples.ButtonWithIcon
+import androidx.wear.compose.material.samples.ButtonWithText
+import androidx.wear.compose.material.samples.ChipWithIconAndLabels
+import androidx.wear.compose.material.samples.CompactButtonWithIcon
+import androidx.wear.compose.material.samples.CompactChipWithIconAndLabel
import androidx.wear.compose.material.samples.CurvedTextDemo
import androidx.wear.compose.material.samples.ScalingLazyColumnWithHeaders
import androidx.wear.compose.material.samples.ScalingLazyColumnWithHeadersReversed
@@ -26,8 +32,13 @@
import androidx.wear.compose.material.samples.SimpleScalingLazyColumn
import androidx.wear.compose.material.samples.SimpleScalingLazyColumnWithContentPadding
import androidx.wear.compose.material.samples.SimpleSwipeToDismissBox
+import androidx.wear.compose.material.samples.SplitToggleChipWithCheckbox
import androidx.wear.compose.material.samples.TimeTextWithCustomSeparator
import androidx.wear.compose.material.samples.TimeTextWithFullDateAndTimeFormat
+import androidx.wear.compose.material.samples.TitleCardStandard
+import androidx.wear.compose.material.samples.TitleCardWithImage
+import androidx.wear.compose.material.samples.ToggleButtonWithIcon
+import androidx.wear.compose.material.samples.ToggleChipWithIcon
// Declare the swipe to dismiss demos so that we can use this variable as the background composable
// for the SwipeToDismissDemo itself.
@@ -79,30 +90,94 @@
DemoCategory(
"Button",
listOf(
- ComposableDemo("Button Sizes") { ButtonSizes() },
- ComposableDemo("Button Styles") { ButtonStyles() },
+ DemoCategory(
+ "Samples",
+ listOf(
+ ComposableDemo("ButtonWithIcon") { Centralize({ ButtonWithIcon() }) },
+ ComposableDemo("ButtonWithText") { Centralize({ ButtonWithText() }) },
+ ComposableDemo("CompactButtonWithIcon") {
+ Centralize({ CompactButtonWithIcon() })
+ },
+ )
+ ),
+ DemoCategory(
+ "Demos",
+ listOf(
+ ComposableDemo("Button Sizes") { ButtonSizes() },
+ ComposableDemo("Button Styles") { ButtonStyles() },
+ )
+ )
)
),
- ComposableDemo("Toggle Button") { ToggleButtons() },
+ DemoCategory("ToggleButton",
+ listOf(
+ ComposableDemo("Sample") { Centralize({ ToggleButtonWithIcon() }) },
+ ComposableDemo("Demos") { ToggleButtons() },
+ )
+ ),
DemoCategory(
"Chips",
listOf(
- ComposableDemo("Chip") { StandardChips() },
- ComposableDemo("Compact chip") { SmallChips() },
- ComposableDemo("Avatar chip") { AvatarChips() },
- ComposableDemo("Rtl chips") { RtlChips() },
- ComposableDemo("Custom chips") { CustomChips() },
- ComposableDemo("Image background chips") { ImageBackgroundChips() },
+ DemoCategory(
+ "Samples",
+ listOf(
+ ComposableDemo("ChipWithIconAndLabels") {
+ Centralize({ ChipWithIconAndLabels() })
+ },
+ ComposableDemo("CompactChipWithIconAndLabel") {
+ Centralize({ CompactChipWithIconAndLabel() })
+ },
+ )
+ ),
+ DemoCategory(
+ "Demos",
+ listOf(
+ ComposableDemo("Chip") { StandardChips() },
+ ComposableDemo("Compact chip") { SmallChips() },
+ ComposableDemo("Avatar chip") { AvatarChips() },
+ ComposableDemo("Rtl chips") { RtlChips() },
+ ComposableDemo("Custom chips") { CustomChips() },
+ ComposableDemo("Image background chips") { ImageBackgroundChips() },
+ )
+ )
)
),
DemoCategory(
"Toggle Chip",
listOf(
- ComposableDemo("Toggle chip") { ToggleChips() },
- ComposableDemo("RTL Toggle chip") { RtlToggleChips() },
+ DemoCategory("Samples",
+ listOf(
+ ComposableDemo("ToggleChipWithIcon") {
+ Centralize({ ToggleChipWithIcon() })
+ },
+ ComposableDemo("SplitToggleChipWithCheckbox") {
+ Centralize({ SplitToggleChipWithCheckbox() })
+ }
+ )
+ ),
+ DemoCategory("Demos",
+ listOf(
+ ComposableDemo("Toggle chip") { ToggleChips() },
+ ComposableDemo("RTL Toggle chip") { RtlToggleChips() },
+ )
+ )
)
),
- ComposableDemo("Card") { CardDemo() },
+ DemoCategory("Card",
+ listOf(
+ DemoCategory(
+ "Samples",
+ listOf(
+ ComposableDemo("AppCard") { Centralize({ AppCardWithIcon() }) },
+ ComposableDemo("TitleCard") { Centralize({ TitleCardStandard() }) },
+ ComposableDemo("TitleCardWithImage") {
+ Centralize({ TitleCardWithImage() })
+ },
+ )
+ ),
+ ComposableDemo("Demos") { CardDemo() },
+ )
+ ),
SwipeToDismissDemos,
DemoCategory(
"List",
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScrollableColumnDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScrollableColumnDemo.kt
new file mode 100644
index 0000000..fdee274
--- /dev/null
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScrollableColumnDemo.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.integration.demos
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxHeight
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.layout.wrapContentWidth
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.text.style.TextAlign
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Text
+
+@Composable
+fun ScrollableColumnDemo() {
+ Row {
+ NotScrollableLabel(Modifier.weight(1f))
+ Column(
+ verticalArrangement = Arrangement.spacedBy(8.dp),
+ modifier = Modifier
+ .fillMaxHeight()
+ .wrapContentWidth()
+ .verticalScroll(rememberScrollState())
+ .background(Color.Green.copy(alpha = 0.1f))
+ .padding(horizontal = 24.dp)
+ ) {
+ for (i in 0 until 100) {
+ Text("$i")
+ }
+ }
+ NotScrollableLabel(Modifier.weight(1f))
+ }
+}
+
+@Composable
+private fun NotScrollableLabel(modifier: Modifier) {
+ Text(
+ "Not scrollable",
+ color = Color.Red,
+ textAlign = TextAlign.Center,
+ modifier = modifier
+ .fillMaxSize()
+ .background(Color.Red.copy(alpha = 0.1f))
+ .wrapContentSize()
+ )
+}
diff --git a/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScrollableRowDemo.kt b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScrollableRowDemo.kt
new file mode 100644
index 0000000..a63a72e
--- /dev/null
+++ b/wear/compose/integration-tests/demos/src/main/java/androidx/wear/compose/integration/demos/ScrollableRowDemo.kt
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.integration.demos
+
+import androidx.compose.foundation.background
+import androidx.compose.foundation.horizontalScroll
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.Row
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.fillMaxWidth
+import androidx.compose.foundation.layout.padding
+import androidx.compose.foundation.layout.wrapContentHeight
+import androidx.compose.foundation.layout.wrapContentSize
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalTextInputService
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.Text
+
+/**
+ * A screen that includes a partial-height row that is horizontally-scrollable, in order to
+ * demonstrate swipe-to-dismiss handling on a screen that contains both scrollable and
+ * non-scrollable sections.
+ */
+// TODO(b/200699800) Does not support swipe-to-dismiss on the row, we need explicit edge-swiping
+// support.
+@Composable
+fun ScrollableRowDemo() {
+ LocalTextInputService
+ Column {
+ NotScrollableLabel(Modifier.weight(1f))
+ Row(
+ horizontalArrangement = Arrangement.spacedBy(8.dp),
+ modifier = Modifier
+ .fillMaxWidth()
+ .wrapContentHeight()
+ .horizontalScroll(rememberScrollState())
+ .background(Color.Green.copy(alpha = 0.1f))
+ .padding(vertical = 24.dp)
+ ) {
+ for (i in 0 until 100) {
+ Text("$i")
+ }
+ }
+ NotScrollableLabel(Modifier.weight(1f))
+ }
+}
+
+@Composable
+private fun NotScrollableLabel(modifier: Modifier) {
+ Text(
+ "Not scrollable",
+ color = Color.Red,
+ modifier = modifier
+ .fillMaxSize()
+ .background(Color.Red.copy(alpha = 0.1f))
+ .wrapContentSize()
+ )
+}
diff --git a/wear/compose/integration-tests/demos/src/main/res/values/resources.xml b/wear/compose/integration-tests/demos/src/main/res/values/resources.xml
index 5abd265..8086034 100644
--- a/wear/compose/integration-tests/demos/src/main/res/values/resources.xml
+++ b/wear/compose/integration-tests/demos/src/main/res/values/resources.xml
@@ -1,6 +1,3 @@
<resources>
<string name="app_name">Wear Compose Integration Demos</string>
- <style name="AppThemeNoSwipe" parent="@android:style/Theme.DeviceDefault">
- <item name="android:windowSwipeToDismiss">false</item>
- </style>
</resources>
\ No newline at end of file
diff --git a/wear/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml b/wear/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
index 7f488b1..1047c79 100644
--- a/wear/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
+++ b/wear/compose/integration-tests/macrobenchmark-target/src/main/AndroidManifest.xml
@@ -38,10 +38,6 @@
android:name=".StartupActivity"
android:exported="true">
<intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- <intent-filter>
<action
android:name=
"androidx.wear.compose.integration.macrobenchmark.target.WEAR_STARTUP_ACTIVITY">
@@ -50,6 +46,32 @@
</intent-filter>
</activity>
+ <activity
+ android:name=".SwipeActivity"
+ android:theme="@style/AppThemeNoSwipe"
+ android:exported="true">
+ <intent-filter>
+ <action android:name=
+ "androidx.wear.compose.integration.macrobenchmark.target.SWIPE_ACTIVITY" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
+ <activity
+ android:name=".ScrollActivity"
+ android:theme="@style/AppThemeNoSwipe"
+ android:exported="true">
+ <intent-filter>
+ <action android:name="android.intent.action.MAIN" />
+ <category android:name="android.intent.category.LAUNCHER" />
+ </intent-filter>
+ <intent-filter>
+ <action android:name=
+ "androidx.wear.compose.integration.macrobenchmark.target.SCROLL_ACTIVITY" />
+ <category android:name="android.intent.category.DEFAULT" />
+ </intent-filter>
+ </activity>
+
</application>
<uses-permission android:name="android.permission.WAKE_LOCK" />
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/Common.kt
similarity index 78%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/Common.kt
index 2ab52fb..58c38b0 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/Common.kt
@@ -14,7 +14,6 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.wear.compose.integration.macrobenchmark.target
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+internal val CONTENT_DESCRIPTION = "find-me"
\ No newline at end of file
diff --git a/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/ScrollActivity.kt b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/ScrollActivity.kt
new file mode 100644
index 0000000..1842ab0
--- /dev/null
+++ b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/ScrollActivity.kt
@@ -0,0 +1,73 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.integration.macrobenchmark.target
+
+import androidx.activity.ComponentActivity
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Box
+import androidx.compose.foundation.layout.PaddingValues
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.foundation.layout.requiredHeight
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+import androidx.compose.ui.unit.Dp
+import androidx.compose.ui.unit.dp
+import androidx.wear.compose.material.ExperimentalWearMaterialApi
+import androidx.wear.compose.material.MaterialTheme
+import androidx.wear.compose.material.ScalingLazyColumn
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.rememberScalingLazyListState
+
+class ScrollActivity : ComponentActivity() {
+ private var itemHeightDp: Dp = 20.dp
+ private var defaultItemSpacingDp: Dp = 8.dp
+
+ @OptIn(ExperimentalWearMaterialApi::class)
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ MaterialTheme {
+ ScalingLazyColumn(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.spacedBy(
+ space = defaultItemSpacingDp,
+ alignment = Alignment.CenterVertically
+ ),
+ contentPadding = PaddingValues(horizontal = 8.dp, vertical = 30.dp),
+ state = rememberScalingLazyListState(),
+ modifier = Modifier.semantics { contentDescription = CONTENT_DESCRIPTION }
+ ) {
+ items(5000) { it ->
+ Box(Modifier
+ .requiredHeight(itemHeightDp)
+ .background(MaterialTheme.colors.surface)
+ .fillMaxSize()
+ ) {
+ Text(text = "Item $it", color = MaterialTheme.colors.onSurface)
+ }
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/SwipeActivity.kt b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/SwipeActivity.kt
new file mode 100644
index 0000000..85a6c4d
--- /dev/null
+++ b/wear/compose/integration-tests/macrobenchmark-target/src/main/java/androidx/wear/compose/integration/macrobenchmark/target/SwipeActivity.kt
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.integration.macrobenchmark.target
+
+import androidx.activity.ComponentActivity
+import android.os.Bundle
+import androidx.activity.compose.setContent
+import androidx.compose.foundation.background
+import androidx.compose.foundation.layout.Arrangement
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.fillMaxSize
+import androidx.compose.runtime.LaunchedEffect
+import androidx.compose.ui.Alignment
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.semantics.contentDescription
+import androidx.compose.ui.semantics.semantics
+import androidx.wear.compose.material.ExperimentalWearMaterialApi
+import androidx.wear.compose.material.SwipeDismissTarget
+import androidx.wear.compose.material.SwipeToDismissBox
+import androidx.wear.compose.material.Text
+import androidx.wear.compose.material.rememberSwipeToDismissBoxState
+
+class SwipeActivity : ComponentActivity() {
+
+ @OptIn(ExperimentalWearMaterialApi::class)
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+
+ setContent {
+ val swipeDismissState = rememberSwipeToDismissBoxState()
+
+ LaunchedEffect(swipeDismissState.currentValue) {
+ if (swipeDismissState.currentValue == SwipeDismissTarget.Dismissal) {
+ swipeDismissState.snapTo(SwipeDismissTarget.Original)
+ }
+ }
+
+ SwipeToDismissBox(
+ state = swipeDismissState,
+ modifier = Modifier.semantics { contentDescription = CONTENT_DESCRIPTION },
+ ) { isBackground ->
+ if (!isBackground) {
+ Column(
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ modifier = Modifier.background(Color.LightGray).fillMaxSize(),
+ ) {
+ Text("Swipe to dismiss", color = Color.Black)
+ }
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/integration-tests/macrobenchmark-target/src/main/res/values/resources.xml b/wear/compose/integration-tests/macrobenchmark-target/src/main/res/values/resources.xml
new file mode 100644
index 0000000..c4a6cfc
--- /dev/null
+++ b/wear/compose/integration-tests/macrobenchmark-target/src/main/res/values/resources.xml
@@ -0,0 +1,6 @@
+<resources>
+ <string name="app_name">Wear Compose Integration Macrobenchmark Target</string>
+ <style name="AppThemeNoSwipe" parent="@android:style/Theme.DeviceDefault">
+ <item name="android:windowSwipeToDismiss">false</item>
+ </style>
+</resources>
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/Common.kt
similarity index 64%
copy from compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
copy to wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/Common.kt
index 7d09b6d..f2d6b09 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
+++ b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/Common.kt
@@ -13,15 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-// GENERATED CODE - DO NOT MODIFY BY HAND
-package androidx.compose.material3.tokens
+package androidx.wear.compose.integration.macrobenchmark.test
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.unit.dp
+import androidx.benchmark.macro.CompilationMode
-internal object Shape {
- val Large = RoundedCornerShape(8.0.dp)
- val Medium = RoundedCornerShape(8.0.dp)
- val Small = RoundedCornerShape(4.0.dp)
-}
+internal val COMPOSE_COMPILATION_MODES = listOf(
+ CompilationMode.None,
+ CompilationMode.Interpreted,
+ CompilationMode.SpeedProfile(),
+ CompilationMode.BaselineProfile,
+)
+
+internal val CONTENT_DESCRIPTION = "find-me"
\ No newline at end of file
diff --git a/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/ScrollBenchmark.kt b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/ScrollBenchmark.kt
new file mode 100644
index 0000000..d547f80
--- /dev/null
+++ b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/ScrollBenchmark.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.integration.macrobenchmark.test
+
+import android.content.Intent
+import android.graphics.Point
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.FrameTimingGfxInfoMetric
+import androidx.benchmark.macro.FrameTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.UiDevice
+import androidx.testutils.createCompilationParams
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class ScrollBenchmark(
+ private val compilationMode: CompilationMode
+) {
+ @get:Rule
+ val benchmarkRule = MacrobenchmarkRule()
+
+ private lateinit var device: UiDevice
+
+ @Before
+ fun setUp() {
+ val instrumentation = InstrumentationRegistry.getInstrumentation()
+ device = UiDevice.getInstance(instrumentation)
+ }
+
+ @Test
+ fun start() {
+ benchmarkRule.measureRepeated(
+ packageName = PACKAGE_NAME,
+ metrics = listOf(FrameTimingMetric(), FrameTimingGfxInfoMetric()),
+ compilationMode = compilationMode,
+ iterations = 10,
+ setupBlock = {
+ val intent = Intent()
+ intent.action = ACTION
+ startActivityAndWait(intent)
+ }
+ ) {
+ val list = device.findObject(By.desc(CONTENT_DESCRIPTION))
+ // Setting a gesture margin is important otherwise gesture nav is triggered.
+ list.setGestureMargin(device.displayWidth / 5)
+ repeat(5) {
+ list.drag(Point(list.visibleCenter.x, list.visibleCenter.y / 3))
+ device.waitForIdle()
+ }
+ }
+ }
+
+ companion object {
+ private const val PACKAGE_NAME = "androidx.wear.compose.integration.macrobenchmark.target"
+ private const val ACTION =
+ "androidx.wear.compose.integration.macrobenchmark.target.SCROLL_ACTIVITY"
+
+ @Parameterized.Parameters(name = "compilation={0}")
+ @JvmStatic
+ fun parameters() = createCompilationParams(
+ compilationModes = COMPOSE_COMPILATION_MODES
+ )
+ }
+}
\ No newline at end of file
diff --git a/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/SwipeBenchmark.kt b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/SwipeBenchmark.kt
new file mode 100644
index 0000000..03738ed
--- /dev/null
+++ b/wear/compose/integration-tests/macrobenchmark/src/androidTest/java/androidx/wear/compose/integration/macrobenchmark/SwipeBenchmark.kt
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.compose.integration.macrobenchmark.test
+
+import android.content.Intent
+import androidx.benchmark.macro.CompilationMode
+import androidx.benchmark.macro.FrameTimingGfxInfoMetric
+import androidx.benchmark.macro.FrameTimingMetric
+import androidx.benchmark.macro.junit4.MacrobenchmarkRule
+import androidx.test.filters.LargeTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.uiautomator.By
+import androidx.test.uiautomator.Direction
+import androidx.test.uiautomator.UiDevice
+import androidx.testutils.createCompilationParams
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@LargeTest
+@RunWith(Parameterized::class)
+class SwipeBenchmark(
+ private val compilationMode: CompilationMode
+) {
+ @get:Rule
+ val benchmarkRule = MacrobenchmarkRule()
+
+ private lateinit var device: UiDevice
+
+ @Before
+ fun setUp() {
+ val instrumentation = InstrumentationRegistry.getInstrumentation()
+ device = UiDevice.getInstance(instrumentation)
+ }
+
+ @Test
+ fun start() {
+ benchmarkRule.measureRepeated(
+ packageName = PACKAGE_NAME,
+ metrics = listOf(FrameTimingMetric(), FrameTimingGfxInfoMetric()),
+ compilationMode = compilationMode,
+ iterations = 10,
+ setupBlock = {
+ val intent = Intent()
+ intent.action = ACTION
+ startActivityAndWait(intent)
+ }
+ ) {
+ val swipeToDismissBox = device.findObject(By.desc(CONTENT_DESCRIPTION))
+ // Setting a gesture margin is important otherwise gesture nav is triggered.
+ swipeToDismissBox.setGestureMargin(device.displayWidth / 5)
+ repeat(10) {
+ swipeToDismissBox.swipe(Direction.RIGHT, 0.75f)
+ device.waitForIdle()
+ }
+ }
+ }
+
+ companion object {
+ private const val PACKAGE_NAME = "androidx.wear.compose.integration.macrobenchmark.target"
+ private const val ACTION =
+ "androidx.wear.compose.integration.macrobenchmark.target.SWIPE_ACTIVITY"
+
+ @Parameterized.Parameters(name = "compilation={0}")
+ @JvmStatic
+ fun parameters() = createCompilationParams(
+ compilationModes = COMPOSE_COMPILATION_MODES
+ )
+ }
+}
\ No newline at end of file
diff --git a/wear/tiles/tiles/lint-baseline.xml b/wear/tiles/tiles/lint-baseline.xml
index 143fe06..164e0d9 100644
--- a/wear/tiles/tiles/lint-baseline.xml
+++ b/wear/tiles/tiles/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
<issue
id="NewApi"
diff --git a/wear/watchface/watchface-client-guava/lint-baseline.xml b/wear/watchface/watchface-client-guava/lint-baseline.xml
deleted file mode 100644
index 875be5e..0000000
--- a/wear/watchface/watchface-client-guava/lint-baseline.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
-
- <issue
- id="NewApi"
- message="Call requires API level 27 (current min is 26): `WatchFaceControlService`"
- errorLine1=" private val realService = object : WatchFaceControlService() {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt"
- line="46"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Extending WatchFaceControlService requires API level 27 (current min is 26): `WatchFaceControlService`"
- errorLine1=" private val realService = object : WatchFaceControlService() {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/client/guava/ListenableWatchFaceMetadataClientTest.kt"
- line="46"
- column="40"/>
- </issue>
-
-</issues>
diff --git a/wear/watchface/watchface-client/api/current.txt b/wear/watchface/watchface-client/api/current.txt
index e01cd86..ae220e2 100644
--- a/wear/watchface/watchface-client/api/current.txt
+++ b/wear/watchface/watchface-client/api/current.txt
@@ -102,7 +102,7 @@
public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
- method public void addWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
+ method public void addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
@@ -112,7 +112,7 @@
method @AnyThread public boolean isConnectionAlive();
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
- method public void removeWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
+ method public void removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void setWatchUiState(androidx.wear.watchface.client.WatchUiState watchUiState) throws android.os.RemoteException;
@@ -140,7 +140,7 @@
field public static final int TAP_TYPE_UP = 2; // 0x2
}
- public static fun interface InteractiveWatchFaceClient.WatchFaceReadyListener {
+ public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
method public void onWatchFaceReady();
}
diff --git a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
index 0a8c2bfa..63f8385 100644
--- a/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-client/api/public_plus_experimental_current.txt
@@ -122,7 +122,7 @@
public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
- method public void addWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
+ method public void addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
@@ -132,7 +132,7 @@
method @AnyThread public boolean isConnectionAlive();
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
- method public void removeWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
+ method public void removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void setWatchUiState(androidx.wear.watchface.client.WatchUiState watchUiState) throws android.os.RemoteException;
@@ -160,7 +160,7 @@
field public static final int TAP_TYPE_UP = 2; // 0x2
}
- public static fun interface InteractiveWatchFaceClient.WatchFaceReadyListener {
+ public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
method public void onWatchFaceReady();
}
diff --git a/wear/watchface/watchface-client/api/restricted_current.txt b/wear/watchface/watchface-client/api/restricted_current.txt
index 18d9d13..19c1c16 100644
--- a/wear/watchface/watchface-client/api/restricted_current.txt
+++ b/wear/watchface/watchface-client/api/restricted_current.txt
@@ -102,7 +102,7 @@
public interface InteractiveWatchFaceClient extends java.lang.AutoCloseable {
method @AnyThread public void addClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener, java.util.concurrent.Executor executor);
- method public void addWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
+ method public void addOnWatchFaceReadyListener(java.util.concurrent.Executor executor, androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public default Integer? getComplicationIdAt(@Px int x, @Px int y) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState> getComplicationSlotsState();
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public java.util.List<androidx.wear.watchface.ContentDescriptionLabel> getContentDescriptionLabels();
@@ -112,7 +112,7 @@
method @AnyThread public boolean isConnectionAlive();
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void performAmbientTick() throws android.os.RemoteException;
method @AnyThread public void removeClientDisconnectListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.ClientDisconnectListener listener);
- method public void removeWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.WatchFaceReadyListener listener);
+ method public void removeOnWatchFaceReadyListener(androidx.wear.watchface.client.InteractiveWatchFaceClient.OnWatchFaceReadyListener listener);
method @RequiresApi(27) @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public android.graphics.Bitmap renderWatchFaceToBitmap(androidx.wear.watchface.RenderParameters renderParameters, java.time.Instant instant, androidx.wear.watchface.style.UserStyle? userStyle, java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>? idAndComplicationData) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void sendTouchEvent(@Px int xPosition, @Px int yPosition, @androidx.wear.watchface.TapType int tapType) throws android.os.RemoteException;
method @kotlin.jvm.Throws(exceptionClasses=RemoteException::class) public void setWatchUiState(androidx.wear.watchface.client.WatchUiState watchUiState) throws android.os.RemoteException;
@@ -140,7 +140,7 @@
field public static final int TAP_TYPE_UP = 2; // 0x2
}
- public static fun interface InteractiveWatchFaceClient.WatchFaceReadyListener {
+ public static fun interface InteractiveWatchFaceClient.OnWatchFaceReadyListener {
method public void onWatchFaceReady();
}
diff --git a/wear/watchface/watchface-client/lint-baseline.xml b/wear/watchface/watchface-client/lint-baseline.xml
deleted file mode 100644
index 32ce6d3..0000000
--- a/wear/watchface/watchface-client/lint-baseline.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
-
- <issue
- id="NewApi"
- message="Call requires API level 30 (current min is 26): `WatchFaceId`"
- errorLine1=" WatchFaceId(watchFaceInstanceId ?: ""),"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/watchface/client/EditorState.kt"
- line="94"
- column="9"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 27 (current min is 26): `WatchFaceControlService`"
- errorLine1=" private val realService = object : WatchFaceControlService() {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt"
- line="43"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Extending WatchFaceControlService requires API level 27 (current min is 26): `WatchFaceControlService`"
- errorLine1=" private val realService = object : WatchFaceControlService() {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt"
- line="43"
- column="40"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 27 (current min is 26): `IWatchFaceInstanceServiceStub`"
- errorLine1=" object : IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper())) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt"
- line="45"
- column="13"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Extending IWatchFaceInstanceServiceStub requires API level 27 (current min is 26): `IWatchFaceInstanceServiceStub`"
- errorLine1=" object : IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper())) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlTestService.kt"
- line="45"
- column="22"/>
- </issue>
-
-</issues>
diff --git a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
index 63b01ea..144992a 100644
--- a/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
+++ b/wear/watchface/watchface-client/src/androidTest/java/androidx/wear/watchface/client/test/WatchFaceControlClientTest.kt
@@ -1130,7 +1130,7 @@
try {
val wfReady = CompletableDeferred<Unit>()
- interactiveInstance.addWatchFaceReadyListener(
+ interactiveInstance.addOnWatchFaceReadyListener(
{ runnable -> runnable.run() },
{ wfReady.complete(Unit) }
)
@@ -1183,12 +1183,12 @@
try {
var listenerCalled = false
val listener =
- InteractiveWatchFaceClient.WatchFaceReadyListener { listenerCalled = true }
- interactiveInstance.addWatchFaceReadyListener(
+ InteractiveWatchFaceClient.OnWatchFaceReadyListener { listenerCalled = true }
+ interactiveInstance.addOnWatchFaceReadyListener(
{ runnable -> runnable.run() },
listener
)
- interactiveInstance.removeWatchFaceReadyListener(listener)
+ interactiveInstance.removeOnWatchFaceReadyListener(listener)
assertThat(listenerCalled).isFalse()
initCompletableDeferred.complete(Unit)
@@ -1236,7 +1236,7 @@
try {
val wfReady = CompletableDeferred<Unit>()
- interactiveInstance.addWatchFaceReadyListener(
+ interactiveInstance.addOnWatchFaceReadyListener(
{ runnable -> runnable.run() },
{ wfReady.complete(Unit) }
)
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
index 2f74457..3f7b551 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/InteractiveWatchFaceClient.kt
@@ -214,11 +214,11 @@
public fun isConnectionAlive(): Boolean
/**
- * Interface passed to [addWatchFaceReadyListener] which calls
- * [WatchFaceReadyListener.onWatchFaceReady] when the watch face is ready to render. Use
- * [addWatchFaceReadyListener] to register a WatchFaceReadyListener.
+ * Interface passed to [addOnWatchFaceReadyListener] which calls
+ * [OnWatchFaceReadyListener.onWatchFaceReady] when the watch face is ready to render. Use
+ * [addOnWatchFaceReadyListener] to register a OnWatchFaceReadyListener.
*/
- public fun interface WatchFaceReadyListener {
+ public fun interface OnWatchFaceReadyListener {
/**
* Called when the watchface is ready to render.
*
@@ -229,21 +229,21 @@
}
/**
- * Registers a [WatchFaceReadyListener] which gets called when the watch face is ready to
+ * Registers a [OnWatchFaceReadyListener] which gets called when the watch face is ready to
* render.
*
* Note in the event of the watch face disconnecting (e.g. due to a crash) the listener will
* never get called. Use [ClientDisconnectListener] to observe disconnects.
*
- * @param executor The [Executor] on which to run [WatchFaceReadyListener].
- * @param listener The [WatchFaceReadyListener] to run when the watchface is ready to render.
+ * @param executor The [Executor] on which to run [OnWatchFaceReadyListener].
+ * @param listener The [OnWatchFaceReadyListener] to run when the watchface is ready to render.
*/
- public fun addWatchFaceReadyListener(executor: Executor, listener: WatchFaceReadyListener)
+ public fun addOnWatchFaceReadyListener(executor: Executor, listener: OnWatchFaceReadyListener)
/**
- * Stops listening for events registered by [addWatchFaceReadyListener].
+ * Stops listening for events registered by [addOnWatchFaceReadyListener].
*/
- public fun removeWatchFaceReadyListener(listener: WatchFaceReadyListener)
+ public fun removeOnWatchFaceReadyListener(listener: OnWatchFaceReadyListener)
}
/** Controls a stateful remote interactive watch face. */
@@ -255,7 +255,7 @@
private val disconnectListeners =
HashMap<InteractiveWatchFaceClient.ClientDisconnectListener, Executor>()
private val readyListeners =
- HashMap<InteractiveWatchFaceClient.WatchFaceReadyListener, Executor>()
+ HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>()
private var watchfaceReadyListenerRegistered = false
init {
@@ -438,7 +438,7 @@
}
internal fun onWatchFaceReady() {
- var listenerCopy: HashMap<InteractiveWatchFaceClient.WatchFaceReadyListener, Executor>
+ var listenerCopy: HashMap<InteractiveWatchFaceClient.OnWatchFaceReadyListener, Executor>
synchronized(lock) {
listenerCopy = HashMap(readyListeners)
@@ -451,9 +451,9 @@
}
}
- override fun addWatchFaceReadyListener(
+ override fun addOnWatchFaceReadyListener(
executor: Executor,
- listener: InteractiveWatchFaceClient.WatchFaceReadyListener
+ listener: InteractiveWatchFaceClient.OnWatchFaceReadyListener
) {
synchronized(lock) {
require(!readyListeners.contains(listener)) {
@@ -464,8 +464,8 @@
}
}
- override fun removeWatchFaceReadyListener(
- listener: InteractiveWatchFaceClient.WatchFaceReadyListener
+ override fun removeOnWatchFaceReadyListener(
+ listener: InteractiveWatchFaceClient.OnWatchFaceReadyListener
) {
synchronized(lock) {
readyListeners.remove(listener)
diff --git a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
index d5f53af..7bd8ca3 100644
--- a/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
+++ b/wear/watchface/watchface-client/src/main/java/androidx/wear/watchface/client/WatchFaceControlClient.kt
@@ -42,9 +42,9 @@
import androidx.wear.watchface.style.UserStyleData
import androidx.wear.watchface.style.data.UserStyleWireFormat
import kotlinx.coroutines.CompletableDeferred
+import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
import kotlin.coroutines.resumeWithException
-import kotlin.coroutines.suspendCoroutine
/**
* Connects to a watch face's WatchFaceControlService which allows the user to control the watch
@@ -279,7 +279,7 @@
"WatchFaceControlClientImpl" +
".getOrCreateWallpaperServiceBackedInteractiveWatchFaceClientAsync"
)
- return suspendCoroutine { continuation ->
+ return suspendCancellableCoroutine { continuation ->
// [IWatchFaceControlService.getOrCreateInteractiveWatchFaceWCS] has an asynchronous
// callback and it's possible the watch face might crash during start up so we register
// a death observer.
@@ -313,7 +313,7 @@
}
),
object : IPendingInteractiveWatchFace.Stub() {
- override fun getApiVersion() = IPendingInteractiveWatchFace.API_VERSION
+ override fun getApiVersion() = API_VERSION
override fun onInteractiveWatchFaceCreated(
iInteractiveWatchFace: IInteractiveWatchFace
diff --git a/wear/watchface/watchface-complications-data-source/build.gradle b/wear/watchface/watchface-complications-data-source/build.gradle
index c51b5c7..c7ef280 100644
--- a/wear/watchface/watchface-complications-data-source/build.gradle
+++ b/wear/watchface/watchface-complications-data-source/build.gradle
@@ -26,6 +26,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
+ api(project(":wear:watchface:watchface-complications"))
api(project(":wear:watchface:watchface-complications-data"))
implementation("androidx.core:core:1.1.0")
@@ -37,6 +38,8 @@
testImplementation(libs.mockitoCore)
testImplementation(libs.truth)
testImplementation("junit:junit:4.13")
+
+ samples(project(":wear:watchface:watchface-complications-data-source-samples"))
}
android {
diff --git a/wear/watchface/watchface-complications-data/api/current.txt b/wear/watchface/watchface-complications-data/api/current.txt
index d5b166a..34377b0 100644
--- a/wear/watchface/watchface-complications-data/api/current.txt
+++ b/wear/watchface/watchface-complications-data/api/current.txt
@@ -1,86 +1,4 @@
// Signature format: 4.0
-package androidx.wear.watchface.complications {
-
- public final class ComplicationDataSourceInfo {
- ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
- method public String getAppName();
- method public android.content.ComponentName? getComponentName();
- method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
- method public android.graphics.drawable.Icon getIcon();
- method public String getName();
- method public androidx.wear.watchface.complications.data.ComplicationType getType();
- property public final String appName;
- property public final android.content.ComponentName? componentName;
- property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
- property public final android.graphics.drawable.Icon icon;
- property public final String name;
- property public final androidx.wear.watchface.complications.data.ComplicationType type;
- }
-
- public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
- ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
- method public void close();
- method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
- method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
- }
-
- public static final class ComplicationDataSourceInfoRetriever.Result {
- method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
- method public int getSlotId();
- property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
- property public final int slotId;
- }
-
- public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
- ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
- }
-
- public final class ComplicationDataSourceInfoRetrieverKt {
- }
-
- public final class ComplicationSlotBounds {
- ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
- ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
- method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
- property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
- }
-
- public final class DefaultComplicationDataSourcePolicy {
- ctor public DefaultComplicationDataSourcePolicy();
- ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
- ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
- ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
- method public android.content.ComponentName? getPrimaryDataSource();
- method public android.content.ComponentName? getSecondaryDataSource();
- method public int getSystemDataSourceFallback();
- method public boolean isEmpty();
- property public final android.content.ComponentName? primaryDataSource;
- property public final android.content.ComponentName? secondaryDataSource;
- property public final int systemDataSourceFallback;
- }
-
- public final class SystemDataSources {
- field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
- field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
- field public static final int DATA_SOURCE_DATE = 2; // 0x2
- field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
- field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
- field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
- field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
- field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
- field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
- field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
- field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
- field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
- field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
- field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
- }
-
- public static final class SystemDataSources.Companion {
- }
-
-}
-
package androidx.wear.watchface.complications.data {
public abstract sealed class ComplicationData {
diff --git a/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt b/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
index d5b166a..34377b0 100644
--- a/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-complications-data/api/public_plus_experimental_current.txt
@@ -1,86 +1,4 @@
// Signature format: 4.0
-package androidx.wear.watchface.complications {
-
- public final class ComplicationDataSourceInfo {
- ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
- method public String getAppName();
- method public android.content.ComponentName? getComponentName();
- method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
- method public android.graphics.drawable.Icon getIcon();
- method public String getName();
- method public androidx.wear.watchface.complications.data.ComplicationType getType();
- property public final String appName;
- property public final android.content.ComponentName? componentName;
- property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
- property public final android.graphics.drawable.Icon icon;
- property public final String name;
- property public final androidx.wear.watchface.complications.data.ComplicationType type;
- }
-
- public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
- ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
- method public void close();
- method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
- method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
- }
-
- public static final class ComplicationDataSourceInfoRetriever.Result {
- method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
- method public int getSlotId();
- property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
- property public final int slotId;
- }
-
- public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
- ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
- }
-
- public final class ComplicationDataSourceInfoRetrieverKt {
- }
-
- public final class ComplicationSlotBounds {
- ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
- ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
- method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
- property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
- }
-
- public final class DefaultComplicationDataSourcePolicy {
- ctor public DefaultComplicationDataSourcePolicy();
- ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
- ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
- ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
- method public android.content.ComponentName? getPrimaryDataSource();
- method public android.content.ComponentName? getSecondaryDataSource();
- method public int getSystemDataSourceFallback();
- method public boolean isEmpty();
- property public final android.content.ComponentName? primaryDataSource;
- property public final android.content.ComponentName? secondaryDataSource;
- property public final int systemDataSourceFallback;
- }
-
- public final class SystemDataSources {
- field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
- field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
- field public static final int DATA_SOURCE_DATE = 2; // 0x2
- field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
- field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
- field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
- field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
- field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
- field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
- field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
- field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
- field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
- field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
- field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
- }
-
- public static final class SystemDataSources.Companion {
- }
-
-}
-
package androidx.wear.watchface.complications.data {
public abstract sealed class ComplicationData {
diff --git a/wear/watchface/watchface-complications-data/api/restricted_current.txt b/wear/watchface/watchface-complications-data/api/restricted_current.txt
index e892681..534b61d 100644
--- a/wear/watchface/watchface-complications-data/api/restricted_current.txt
+++ b/wear/watchface/watchface-complications-data/api/restricted_current.txt
@@ -1,86 +1,4 @@
// Signature format: 4.0
-package androidx.wear.watchface.complications {
-
- public final class ComplicationDataSourceInfo {
- ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
- method public String getAppName();
- method public android.content.ComponentName? getComponentName();
- method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
- method public android.graphics.drawable.Icon getIcon();
- method public String getName();
- method public androidx.wear.watchface.complications.data.ComplicationType getType();
- property public final String appName;
- property public final android.content.ComponentName? componentName;
- property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
- property public final android.graphics.drawable.Icon icon;
- property public final String name;
- property public final androidx.wear.watchface.complications.data.ComplicationType type;
- }
-
- public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
- ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
- method public void close();
- method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
- method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
- }
-
- public static final class ComplicationDataSourceInfoRetriever.Result {
- method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
- method public int getSlotId();
- property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
- property public final int slotId;
- }
-
- public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
- ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
- }
-
- public final class ComplicationDataSourceInfoRetrieverKt {
- }
-
- public final class ComplicationSlotBounds {
- ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
- ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
- method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
- property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
- }
-
- public final class DefaultComplicationDataSourcePolicy {
- ctor public DefaultComplicationDataSourcePolicy();
- ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
- ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
- ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
- method public android.content.ComponentName? getPrimaryDataSource();
- method public android.content.ComponentName? getSecondaryDataSource();
- method public int getSystemDataSourceFallback();
- method public boolean isEmpty();
- property public final android.content.ComponentName? primaryDataSource;
- property public final android.content.ComponentName? secondaryDataSource;
- property public final int systemDataSourceFallback;
- }
-
- public final class SystemDataSources {
- field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
- field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
- field public static final int DATA_SOURCE_DATE = 2; // 0x2
- field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
- field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
- field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
- field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
- field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
- field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
- field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
- field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
- field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
- field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
- field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
- }
-
- public static final class SystemDataSources.Companion {
- }
-
-}
-
package androidx.wear.watchface.complications.data {
public abstract sealed class ComplicationData {
diff --git a/wear/watchface/watchface-complications-data/build.gradle b/wear/watchface/watchface-complications-data/build.gradle
index 3072372..d2e255d 100644
--- a/wear/watchface/watchface-complications-data/build.gradle
+++ b/wear/watchface/watchface-complications-data/build.gradle
@@ -40,13 +40,6 @@
testImplementation(libs.mockitoCore)
testImplementation(libs.truth)
testImplementation("junit:junit:4.13")
- testImplementation(libs.kotlinReflect)
-
- androidTestImplementation(libs.testExtJunit)
- androidTestImplementation(libs.testCore)
- androidTestImplementation(libs.testRunner)
- androidTestImplementation(libs.testRules)
- androidTestImplementation(libs.truth)
}
android {
@@ -65,9 +58,9 @@
}
androidx {
- name = "Android Wear Complications"
+ name = "Android Wear Complications Data"
publish = Publish.SNAPSHOT_AND_RELEASE
mavenGroup = LibraryGroups.WEAR_WATCHFACE
inceptionYear = "2020"
- description = "Android Wear Complications"
+ description = "Android Wear Complications Data"
}
diff --git a/wear/watchface/watchface-complications-data/lint-baseline.xml b/wear/watchface/watchface-complications-data/lint-baseline.xml
index ea1f0bf..951f879 100644
--- a/wear/watchface/watchface-complications-data/lint-baseline.xml
+++ b/wear/watchface/watchface-complications-data/lint-baseline.xml
@@ -1,186 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
-
- <issue
- id="NewApi"
- message="Call requires API level 30 (current min is 25): `retrievePreviewComplicationData`"
- errorLine1=" providerInfoRetriever.retrievePreviewComplicationData(component, type)!!"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt"
- line="86"
- column="39"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 30 (current min is 25): `retrievePreviewComplicationData`"
- errorLine1=" assertThat(providerInfoRetriever.retrievePreviewComplicationData(component, type))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt"
- line="114"
- column="46"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 30 (current min is 25): `retrievePreviewComplicationData`"
- errorLine1=" assertThat(providerInfoRetriever.retrievePreviewComplicationData(component, type))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt"
- line="127"
- column="46"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 30 (current min is 25): `retrievePreviewComplicationData`"
- errorLine1=" assertThat(providerInfoRetriever.retrievePreviewComplicationData(component, type))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/ProviderInfoRetrieverTest.kt"
- line="147"
- column="46"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#parse`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="52"
- column="39"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#toEpochMilli`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="52"
- column="73"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#parse`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="81"
- column="39"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#toEpochMilli`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="81"
- column="73"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#parse`"
- errorLine1=" val startPointMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="145"
- column="40"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#toEpochMilli`"
- errorLine1=" val startPointMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="145"
- column="74"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#parse`"
- errorLine1=" val dateTimeMillis = Instant.parse("2020-12-30T10:15:20.00Z").toEpochMilli()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="171"
- column="38"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#toEpochMilli`"
- errorLine1=" val dateTimeMillis = Instant.parse("2020-12-30T10:15:20.00Z").toEpochMilli()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="171"
- column="71"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#parse`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="194"
- column="39"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#toEpochMilli`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="194"
- column="73"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#parse`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="207"
- column="39"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `java.time.Instant#toEpochMilli`"
- errorLine1=" val referenceMillis = Instant.parse("2020-12-30T10:15:30.001Z").toEpochMilli()"
- errorLine2=" ~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/complications/data/TextTest.kt"
- line="207"
- column="73"/>
- </issue>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
errorLine2=" ^">
<location
file="src/main/res/values-fr-rCA/complication_strings.xml"
@@ -191,7 +15,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
errorLine2=" ^">
<location
file="src/main/res/values-fr/complication_strings.xml"
@@ -202,7 +26,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
errorLine2=" ^">
<location
file="src/main/res/values-fr-rCA/complication_strings.xml"
@@ -213,7 +37,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
errorLine2=" ^">
<location
file="src/main/res/values-fr/complication_strings.xml"
@@ -224,7 +48,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
errorLine2=" ^">
<location
file="src/main/res/values-fr-rCA/complication_strings.xml"
@@ -235,7 +59,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
errorLine2=" ^">
<location
file="src/main/res/values-fr/complication_strings.xml"
@@ -246,7 +70,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
errorLine2=" ^">
<location
file="src/main/res/values-fr-rCA/complication_strings.xml"
@@ -257,7 +81,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
errorLine2=" ^">
<location
file="src/main/res/values-fr/complication_strings.xml"
@@ -268,7 +92,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
errorLine2=" ^">
<location
file="src/main/res/values-fr-rCA/complication_strings.xml"
@@ -279,7 +103,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
errorLine2=" ^">
<location
file="src/main/res/values-fr/complication_strings.xml"
@@ -290,7 +114,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
errorLine2=" ^">
<location
file="src/main/res/values-fr-rCA/complication_strings.xml"
@@ -301,7 +125,7 @@
<issue
id="MissingQuantity"
message="For locale "fr" (French) the following quantities should also be defined: `many`"
- errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
errorLine2=" ^">
<location
file="src/main/res/values-fr/complication_strings.xml"
diff --git a/wear/watchface/watchface-complications-data/src/main/AndroidManifest.xml b/wear/watchface/watchface-complications-data/src/main/AndroidManifest.xml
index bb1ea86..29fea9c 100644
--- a/wear/watchface/watchface-complications-data/src/main/AndroidManifest.xml
+++ b/wear/watchface/watchface-complications-data/src/main/AndroidManifest.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="androidx.wear.watchface.complications">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="androidx.wear.watchface.complications.data">
<application>
<uses-library android:name="com.google.android.wearable" android:required="false" />
</application>
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
index 75bf5a4..36b9098 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/ComplicationProviderInfo.java
@@ -26,13 +26,12 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever;
/**
* Holder of details of a complication provider, for use by watch faces (for example, to show the
* current provider in settings). A
- * {@link ComplicationDataSourceInfoRetriever} can be used to obtain
- * instances of this class for each of a watch face's complications.
+ * {@link androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever} can be used to
+ * obtain instances of this class for each of a watch face's complications.
*
* @hide
*/
diff --git a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
index d74a57c..dc7ea3d 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
+++ b/wear/watchface/watchface-complications-data/src/main/java/android/support/wearable/complications/TimeDifferenceText.java
@@ -23,7 +23,7 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
-import androidx.wear.watchface.complications.R;
+import androidx.wear.watchface.complications.data.R;
import java.util.Locale;
import java.util.concurrent.TimeUnit;
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt
index 2f99f96..d330c14 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt
+++ b/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/data/Text.kt
@@ -109,7 +109,7 @@
}
/** The styling used for showing a time different by [ComplicationText#TimeDifferenceBuilder]. */
-public enum class TimeDifferenceStyle(internal var wireStyle: Int) {
+public enum class TimeDifferenceStyle(internal val wireStyle: Int) {
/**
* Style for time differences shown in a numeric fashion like a timer.
@@ -316,7 +316,7 @@
}
/** The format in which the time should be displayed. */
-public enum class TimeFormatStyle(internal var wireStyle: Int) {
+public enum class TimeFormatStyle(internal val wireStyle: Int) {
DEFAULT(WireComplicationText.FORMAT_STYLE_DEFAULT),
UPPER_CASE(WireComplicationText.FORMAT_STYLE_UPPER_CASE),
LOWER_CASE(WireComplicationText.FORMAT_STYLE_LOWER_CASE);
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-af/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-af/complication_strings.xml
index 14d0077..cc26c2f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-af/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-af/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> u.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> u.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dae</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dag</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> uur</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> uur</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Nou"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Nou"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-am/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-am/complication_strings.xml
index 82d3e06..a579459 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-am/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-am/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ቀ</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ቀ</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ቀ</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ቀ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ሰ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ሰ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ደ</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ደ</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ደ</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ደ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g><xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g><xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ቀን</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ቀኖች</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ሰዓት</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ሰዓቶች</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ደቂቃ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ደቂቃዎች</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"አሁን"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"አሁን"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ar/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ar/complication_strings.xml
index bdad807..fe76e4ce 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ar/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ar/complication_strings.xml
@@ -1,23 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="zero"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
<item quantity="two"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> أيام</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> يوم</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="zero"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
- <item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> س</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="zero"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
+ <item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ساعة</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="zero"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> د</item>
<item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> د</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> د</item>
@@ -25,9 +25,9 @@
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> د</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> د</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="zero"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
<item quantity="two">يومان (<xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>)</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> أيام</item>
@@ -35,7 +35,7 @@
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> يوم</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> يوم</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="zero"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
<item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعات</item>
@@ -43,7 +43,7 @@
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعة</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ساعة</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="zero"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> دقيقة</item>
<item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> دقيقة</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> دقائق</item>
@@ -51,5 +51,5 @@
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> دقيقة</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> دقيقة</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"الآن"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"الآن"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-as/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-as/complication_strings.xml
index fb3e032..f9aeae5 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-as/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-as/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দি</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দি</item>
+ </plurals>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘ</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘ</item>
+ </plurals>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> মি</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> মি</item>
+ </plurals>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দিন</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দিন</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘণ্টা</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘণ্টা</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>মিনিট</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>মিনিট</item>
- </plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দিন</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দিন</item>
- </plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘণ্টা</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘণ্টা</item>
- </plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> মিনিট</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> মিনিট</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"এতিয়া"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"এতিয়া"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-az/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-az/complication_strings.xml
index b0a50ea..6058469 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-az/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-az/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> g</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> g</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> s</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> s</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> d</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g><xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g><xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> gün</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> gün</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> saat</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> saat</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> dəq</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> dəq</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"İndi"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"İndi"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-b+sr+Latn/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-b+sr+Latn/complication_strings.xml
index 69cc1f7..83609b8 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-b+sr+Latn/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-b+sr+Latn/complication_strings.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> s</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> s</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> s</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> č</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> č</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> č</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dan</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dana</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dana</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sat</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sata</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sati</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minut</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuta</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuta</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Sada"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Sada"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-be/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-be/complication_strings.xml
index 3926ced..a208859 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-be/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-be/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> сут</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> сут</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> сут</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> сут</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадз</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадз</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадз</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадз</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дзень</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дні</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дзён</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дня</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадзіна</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадзіны</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадзін</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> гадзіны</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Цяпер"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Цяпер"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-bg/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-bg/complication_strings.xml
index b3625acb..5d08200 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-bg/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-bg/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дни</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ден</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дни</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ден</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ч</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мин</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дни</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ден</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дни</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ден</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> часа</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> час</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> часа</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> час</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мин</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Сега"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Сега"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-bn/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-bn/complication_strings.xml
index 9426e35..13d4006 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-bn/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-bn/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>দিন</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>দিন</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ঘঃ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ঘঃ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>মিঃ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>মিঃ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দিন</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> দিন</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘণ্টা</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ঘণ্টা</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> মিনিট</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> মিনিট</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"এখন"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"এখন"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-bs/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-bs/complication_strings.xml
index e135055..f9e70d4 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-bs/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-bs/complication_strings.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dan</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dana</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dana</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sat</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sata</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sati</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Sada"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Sada"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml
index 44208c7..160e09e 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ca/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dies</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dia</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dies</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dia</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hores</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hores</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Ara"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Ara"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-cs/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-cs/complication_strings.xml
index 85aab8a..5049542 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-cs/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-cs/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dny</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dne</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dní</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> den</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodiny</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodiny</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodin</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hodina</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Teď"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Teď"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-da/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-da/complication_strings.xml
index 9d9e9c1..f57dbf1 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-da/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-da/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> t.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> t.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dag</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dage</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> time</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> timer</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minut</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutter</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Nu"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Nu"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-de/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-de/complication_strings.xml
index 28c064d..c83f5dc 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-de/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-de/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> T</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> T</item>
- </plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
- </plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
- </plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> Tage</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> Tag</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> Std.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> Std.</item>
+ </plurals>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> Min.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> Min.</item>
+ </plurals>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> Tage</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> Tag</item>
+ </plurals>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> Stunden</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> Stunde</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> Min.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> Min.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Jetzt"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Jetzt"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-el/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-el/complication_strings.xml
index a39ba9d..dadc44c 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-el/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-el/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> η.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> η.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ώ.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ώ.</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ώ.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ώ.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> λ.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> λ.</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>λ.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>λ.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ημέρες</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ημέρα</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ώρες</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ώρα</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> λ.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> λ.</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> λεπτά</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> λεπτό</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Τώρα"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Τώρα"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-en-rAU/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-en-rAU/complication_strings.xml
index 1068d97..8ff8660 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-en-rAU/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-en-rAU/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> day</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hour</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Now"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Now"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-en-rCA/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-en-rCA/complication_strings.xml
index 1068d97..8ff8660 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-en-rCA/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-en-rCA/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> day</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hour</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Now"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Now"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-en-rGB/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-en-rGB/complication_strings.xml
index 1068d97..8ff8660 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-en-rGB/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-en-rGB/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> day</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hour</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Now"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Now"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-en-rIN/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-en-rIN/complication_strings.xml
index 1068d97..8ff8660 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-en-rIN/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-en-rIN/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> day</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hour</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Now"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Now"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-en-rXC/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-en-rXC/complication_strings.xml
index 6cc1e17..009a3ef 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-en-rXC/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-en-rXC/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> day</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> days</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> day</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hour</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hours</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hour</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mins</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Now"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Now"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml
index ea3098b..cac9204 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-es-rUS/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Ahora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Ahora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml
index d17e73e..2d7ad7e 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-es/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> minuto</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Ahora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Ahora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-et/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-et/complication_strings.xml
index 6673fdb..704baaa 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-et/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-et/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> p</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> p</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> päeva</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> päev</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> tundi</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> tund</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Praegu"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Praegu"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-eu/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-eu/complication_strings.xml
index 105bc95..0e58388 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-eu/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-eu/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> egun</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> egun</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> e.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> e.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> egun</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> egun</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ordu</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ordu</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutu</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> minutu</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Orain"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Orain"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-fa/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-fa/complication_strings.xml
index 7a1d1b3..315c97c 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-fa/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-fa/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>روز</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>روز</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ر</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ر</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ساعت</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ساعت</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> س</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>دقیقه</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>دقیقه</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> د</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> د</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> روز</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> روز</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعت</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ساعت</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> دقیقه</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> دقیقه</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"اکنون"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"الآن"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-fi/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-fi/complication_strings.xml
index e0f6a78..f62d56a 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-fi/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-fi/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> p</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> p</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> pv</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> pv</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> t</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> t</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> päivää</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> päivä</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> tuntia</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> tunti</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Nyt"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Nyt"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-fr-rCA/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-fr-rCA/complication_strings.xml
index 7b514b3..b0aaa5f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-fr-rCA/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-fr-rCA/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> j</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> j</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> jour</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> jours</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> heure</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> heures</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Maint."</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Maint."</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-fr/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-fr/complication_strings.xml
index 391c42e..14472d7 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-fr/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-fr/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> j</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> j</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> jour</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> jours</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> heure</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> heures</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Maint."</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Maintenant"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-gl/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-gl/complication_strings.xml
index c0d5dd7..f065399 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-gl/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-gl/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_HOURS">%2$s</xliff:g> <xliff:g id="SHORT_DAYS">%1$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_MINUTES">%2$s</xliff:g> <xliff:g id="SHORT_HOURS">%1$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> días</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> día</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Agora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Agora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-gu/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-gu/complication_strings.xml
index 5c59f6f..fcc17ec 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-gu/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-gu/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> દિવસ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> દિવસ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> કલાક</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> કલાક</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> મિનિટ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> મિનિટ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> દિવસ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> દિવસ</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> કલાક</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> કલાક</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> મિનિટ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> મિનિટ</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"હમણાં"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"હમણાં"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-hi/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-hi/complication_strings.xml
index 3fe9a25..0159f46 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-hi/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-hi/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>दिन</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>दिन</item>
- </plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>घंटा</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>घंटे</item>
- </plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>मिनट</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>मिनट</item>
- </plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिन</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिन</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> घंटा</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> घंटे</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनट</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनट</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"अभी"</string>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिन</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिन</item>
+ </plurals>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> घंटा</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> घंटे</item>
+ </plurals>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनट</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनट</item>
+ </plurals>
+ <string name="time_difference_now" msgid="2068359133884605223">"अभी"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-hr/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-hr/complication_strings.xml
index 60d8fc0..254c911 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-hr/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-hr/complication_strings.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dan</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dana</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dana</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sat</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sata</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sati</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Sad"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Sad"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-hu/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-hu/complication_strings.xml
index f8d3c9f..2b6d878 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-hu/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-hu/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> n</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> n</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ó</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ó</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> p</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> p</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g>:<xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g>:<xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> nap</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> nap</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> óra</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> óra</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> perc</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> perc</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Most"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Most"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-hy/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-hy/complication_strings.xml
index 0c8869f..6ab8dc0 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-hy/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-hy/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> օր</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> օր</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ժ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ժ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ր</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ր</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> օր</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> օր</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ժամ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ժամ</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> րոպե</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> րոպե</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Հիմա"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Հիմա"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-in/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-in/complication_strings.xml
index feec1fa..f3f746b 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-in/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-in/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> j</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> j</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> hari</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> hari</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> jam</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> jam</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> menit</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> menit</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mnt</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> mnt</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Kini"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Kini"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-is/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-is/complication_strings.xml
index 0f70ba3..63f7dec 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-is/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-is/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>k</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>k</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dagur</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dagar</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> klst.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> klst.</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mín.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> mín.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Núna"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Núna"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml
index 90f4859..3e268a1 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-it/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> g</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> g</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> giorni</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> giorno</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ore</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ora</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Ora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Ora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-iw/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-iw/complication_strings.xml
index 324c874..fb5173f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-iw/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-iw/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="two"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ימים</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ימים</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ימים</item>
- <item quantity="one">יום <xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g></item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="two"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> י‘</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> י‘</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> י‘</item>
+ <item quantity="one">יום (<xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>)</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שע‘</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שע‘</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שע‘</item>
- <item quantity="one">שעה <xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g></item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ש‘</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ש‘</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ש‘</item>
+ <item quantity="one">שעה (<xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>)</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק׳</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק׳</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק׳</item>
- <item quantity="one">דקה <xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g></item>
+ <item quantity="one">דקה (<xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>)</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="two"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ימים</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="two">יומיים (<xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>)</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ימים</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ימים</item>
<item quantity="one">יום אחד (<xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>)</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שעות</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שעות</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> שעות</item>
- <item quantity="one">שעה (<xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>)</item>
+ <item quantity="one">שעה אחת (<xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>)</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק‘</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק‘</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דק‘</item>
- <item quantity="one">דקה (<xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>)</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דקות</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דקות</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> דקות</item>
+ <item quantity="one">דקה אחת (<xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>)</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"עכשיו"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"עכשיו"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ja/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ja/complication_strings.xml
index ac84c58..b557ed8 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ja/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ja/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>日</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>日</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 日</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 日</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>時間</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>時間</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 時間</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 時間</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>分</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>分</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g><xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>日</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>日</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 日</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 日</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>時間</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>時間</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 時間</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 時間</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>分</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>分</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"今"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"今"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ka/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ka/complication_strings.xml
index 6a2a4dd..f0fef63 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ka/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ka/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>დღ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>დღ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>სთ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>სთ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>წთ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>წთ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> დღე</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> დღე</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> სთ</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> სთ</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> საათი</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> საათი</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> წთ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> წთ</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ახლა"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ახლა"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-kk/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-kk/complication_strings.xml
index 4602b7c..ca0247ca 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-kk/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-kk/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>к</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>к</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> сағ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> сағ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мин</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> күн</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> күн</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> сағат</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> сағат</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мин</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Қазір"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Қазір"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-km/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-km/complication_strings.xml
index 7f17d88..862ddff 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-km/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-km/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ថ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>ថ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ម៉</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ម៉</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ន</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>ន</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ថ្ងៃ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ថ្ងៃ</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ម៉ោង</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ម៉ោង</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ន</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> ន</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ឥឡូវនេះ"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ឥឡូវ"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-kn/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-kn/complication_strings.xml
index 589c198..7f6099f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-kn/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-kn/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ದಿ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ದಿ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ಗಂ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ಗಂ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ನಿ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ನಿ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ದಿನಗಳು</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ದಿನಗಳು</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ಗಂಟೆಗಳು</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ಗಂಟೆಗಳು</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ನಿಮಿಷಗಳು</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ನಿಮಿಷಗಳು</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ಈಗ"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ಇದೀಗ"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ko/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ko/complication_strings.xml
index a954b950..c86ca17b 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ko/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ko/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>일</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>일</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>시간</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>시간</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>분</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>분</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>일</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>일</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>시간</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>시간</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>분</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>분</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"지금"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"지금"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ky/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ky/complication_strings.xml
index e5d023e..716652d 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ky/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ky/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> к.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> к.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> с.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> с.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мүн.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мүн.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> күн</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> күн</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> саат</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> саат</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мүн.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мүн.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Азыр"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Азыр"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-lo/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-lo/complication_strings.xml
index ca7739e..36c72bb 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-lo/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-lo/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ມ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>ມ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ຊມ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ຊມ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ນທ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>ນທ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ມື້</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ມື້</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ຊົ່ວໂມງ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ຊົ່ວໂມງ</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ນທ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> ນທ</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ຕອນນີ້"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ຕອນນີ້"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-lt/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-lt/complication_strings.xml
index 003f5a8..977aa57 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-lt/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-lt/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> val.</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Dabar"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Dabar"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-lv/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-lv/complication_strings.xml
index 9a7aba4..611c99d 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-lv/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-lv/complication_strings.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="zero"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="zero"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="zero"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="zero"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dienu</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> diena</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dienas</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="zero"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> stundu</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> stunda</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> stundas</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="zero"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Tagad"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Tagad"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-mk/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-mk/complication_strings.xml
index f22bf4f8..f6ba19d 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-mk/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-mk/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> д.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> д.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ден</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дена</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> час</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> часа</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Сега"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Сега"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ml/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ml/complication_strings.xml
index 303b98c..024e01d 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ml/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ml/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ദിവസം</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>ദിവസം</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ദി</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ദി</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>മ</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>മ</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> മ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>മി</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>മി</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> മി</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ദിവസം</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ദിവസം</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> മ</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> മ</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> മണിക്കൂർ</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> മണിക്കൂർ</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> മിനിറ്റ്</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> മിനിറ്റ്</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ഇപ്പോൾ"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ഇപ്പോൾ"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-mn/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-mn/complication_strings.xml
index 106c8d0..aca10cc 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-mn/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-mn/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ө</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>ө</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>цаг</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>цаг</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ц</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ц</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>мин</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>мин</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>м</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>м</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> өдөр</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> өдөр</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> цаг</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> цаг</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> мин</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Одоо"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Одоо"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-mr/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-mr/complication_strings.xml
index 8369e8f..3539536 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-mr/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-mr/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>दि.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>दि.</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>दि</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>दि</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ता.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ता.</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ता</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ता</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>मि.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>मि.</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>मि</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>मि</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिवस</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> दिवस</item>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दि</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> दि</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> तास</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> तास</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ता</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ता</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनिटे</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> मिनिट</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मि</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> मि</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"आता"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"आता"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ms/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ms/complication_strings.xml
index cfba148..e709171 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ms/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ms/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>j</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>j</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> hari</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> hari</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> jam</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> jam</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Sekarang"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Sekrng"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-my/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-my/complication_strings.xml
index 5441b3f..f11116f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-my/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-my/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ရက်</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>ရက်</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>နာရီ</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>နာရီ</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>မိနစ်</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>မိနစ်</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ရက်</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ရက်</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> နာရီ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> နာရီ</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> မိနစ်</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> မိနစ်</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ယခု"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ယခု"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-nb/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-nb/complication_strings.xml
index 2e1b3a5..3819bea 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-nb/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-nb/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> t</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> t</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> t</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> t</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dager</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dag</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> timer</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> time</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Nå"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Nå"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ne/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ne/complication_strings.xml
index e9ff269..009d7bc 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ne/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ne/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिन</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> दिन</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> घन्टा</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> घन्टा</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनेट</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> मिनेट</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> दिन</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> दिन</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> घन्टा</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> घन्टा</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> मिनेट</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> मिनेट</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"अहिले"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"अहिले"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-nl/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-nl/complication_strings.xml
index b471073..b777887 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-nl/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-nl/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>u</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>u</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> u</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> u</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dagen</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dag</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> uur</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> uur</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Nu"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Nu"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-or/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-or/complication_strings.xml
index 7952e48..c065429 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-or/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-or/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>ଦି</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>ଦି</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ଘ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ଘ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ମି</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>ମି</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ଦିନ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ଦିନ</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ଘଣ୍ଟା</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ଘଣ୍ଟା</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ମିନିଟ୍</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> ମିନିଟ୍</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ମିନିଟ</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> ମିନିଟ</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ଏବେ"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ଏବେ"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pa/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pa/complication_strings.xml
index 216abc6..cf6a4e2 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pa/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pa/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ਦਿਨ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ਦਿਨ</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ਘੰਟਾ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ਘੰਟੇ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ਮਿੰਟ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ਮਿੰਟ</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ਦਿਨ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ਦਿਨ</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ਘੰਟਾ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ਘੰਟੇ</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ਮਿੰਟ</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> ਮਿੰਟ</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ਹੁਣ"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ਹੁਣੇ"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pl/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pl/complication_strings.xml
index 4a69ebc..47dea54 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pl/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pl/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>g.</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>g.</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>g.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>g.</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>g</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>g</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>g</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>g</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>min</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dni</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dni</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dnia</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dzień</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> godziny</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> godzin</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> godziny</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> godzina</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuty</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minut</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuty</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> minuta</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Teraz"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Teraz"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml
index 65f4e09..826d6c6 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rBR/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dia</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hora</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuto</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Agora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Agora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml
index 03102f4..5e18f1f 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pt-rPT/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dia</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hora</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Agora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Agora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml
index 65f4e09..826d6c6 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-pt/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>min</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dia</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dias</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hora</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> horas</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minuto</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minutos</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Agora"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Agora"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ro/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ro/complication_strings.xml
index 177e860..86c4dfc 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ro/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ro/complication_strings.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> zile</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> de zile</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> zile</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> z</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> z</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> z</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ore</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> de ore</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> oră</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> de min.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min.</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> zile</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> de zile</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> zi</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ore</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> de ore</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> oră</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> minute</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> de minute</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> minut</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Acum"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Acum"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ru/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ru/complication_strings.xml
index 8c904f3..7275f26 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ru/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ru/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин.</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин.</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин.</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин.</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м.</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м.</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м.</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> день</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дня</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дней</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дня</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> час</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> часа</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> часов</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> часа</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минута</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минуты</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минут</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минуты</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Сейчас"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Сейчас"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-si/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-si/complication_strings.xml
index 6851c83..61d83b6 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-si/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-si/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one">දින <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
<item quantity="other">දින <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one">පැය <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
<item quantity="other">පැය <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one">මිනි <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
<item quantity="other">මිනි <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one">දින <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
<item quantity="other">දින <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one">පැය <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
<item quantity="other">පැය <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one">මිනි <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
<item quantity="other">මිනි <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"දැන්"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"දැන්"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-sk/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-sk/complication_strings.xml
index 1d2ff73..c6edc69 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-sk/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-sk/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
- </plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dni</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dňa</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dní</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> deň</item>
- </plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodiny</item>
- <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodiny</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodín</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hodina</item>
- </plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Teraz"</string>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dni</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dňa</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dní</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> deň</item>
+ </plurals>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodiny</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodiny</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> hodín</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> hodina</item>
+ </plurals>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
+ </plurals>
+ <string name="time_difference_now" msgid="2068359133884605223">"Teraz"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-sl/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-sl/complication_strings.xml
index 4a80e57..42922dc 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-sl/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-sl/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="two"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dan</item>
<item quantity="two"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dneva</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dni</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dni</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ura</item>
<item quantity="two"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> uri</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ure</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ur</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="two"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Zdaj"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Zdaj"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-sq/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-sq/complication_strings.xml
index 24a4e49..67e3885 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-sq/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-sq/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d.</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> d</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> orë</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> orë</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> o</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> o</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min.</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> m</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ditë</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ditë</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> orë</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> orë</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min.</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Tani"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Tani"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-sr/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-sr/complication_strings.xml
index 33df6bf..35d45e2 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-sr/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-sr/complication_strings.xml
@@ -1,37 +1,37 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> д</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> д</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> д</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> с</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> с</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> с</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ч</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> м</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дан</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дана</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дана</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> сат</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> сата</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> сати</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минут</item>
- <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минута</item>
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> минута</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
+ <item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> мин</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Садa"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Садa"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-sv/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-sv/complication_strings.xml
index 38cb8da..08eb3d2 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-sv/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-sv/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>t</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>t</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> dagar</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> dag</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> timmar</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> timme</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Nu"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Nu"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-sw/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-sw/complication_strings.xml
index 96d953e..1a0d080 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-sw/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-sw/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other">Siku <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
<item quantity="one">Siku <xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other">Saa <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
<item quantity="one">Saa <xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other">Dak <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
<item quantity="one">Dak <xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g></item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other">Siku <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
<item quantity="one">Siku <xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other">Saa <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
<item quantity="one">Saa <xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other">Dak <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
<item quantity="one">Dak <xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g></item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Sasa"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Sasa"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ta/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ta/complication_strings.xml
index bf2a79e..1c7c321 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ta/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ta/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>நா</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>நா</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ம</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ம</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>ம.நே.</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>ம.நே.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>நி</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>நி</item>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>நிமி</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>நிமி</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> நாட்கள்</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> நாள்</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ம.நே</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ம.நே</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> மணிநேரம்</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> மணிநேரம்</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> நிமி</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> நிமி</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"இப்போது"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"இப்போது"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-te/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-te/complication_strings.xml
index 7699b0a..8a5dc5e 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-te/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-te/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>రో</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>రో</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>గం</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>గం</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>ని</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>ని</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> రోజులు</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> రోజు</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> గంటలు</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> గంట</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> నిమిషాలు</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>నిమిషాలు</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> నిమిషం</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"నవ్"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"నవ్"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-th/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-th/complication_strings.xml
index cf12c57..f28917b 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-th/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-th/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> วัน</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> วัน</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ชม.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ชม.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> นาที</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> นาที</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> วัน</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> วัน</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ชม.</item>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> ชั่วโมง</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> ชม.</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> นาที</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> นาที</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ตอนนี้"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"ตอนนี้"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-tl/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-tl/complication_strings.xml
index 49c79b5..330f746 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-tl/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-tl/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>d</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>h</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>m</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> araw</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> na araw</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> oras</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> na oras</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> min</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> na min</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Ngayon"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Ngayon"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-tr/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-tr/complication_strings.xml
index 8c49350b..d0f2d22 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-tr/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-tr/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> gün</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> gün</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> sa.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> sa.</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> dk.</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> dk.</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> gün</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> gün</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> saat</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> saat</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> dk.</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> dk.</item>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> dakika</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> dakika</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Şimdi"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Şimdi"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-uk/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-uk/complication_strings.xml
index 3aa4c2c0..79850de 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-uk/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-uk/complication_strings.xml
@@ -1,43 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дн.</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> год</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> год</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> год</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> год</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хв</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> день</item>
<item quantity="few"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дні</item>
<item quantity="many"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> днів</item>
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> дня</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> година</item>
<item quantity="few"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> години</item>
<item quantity="many"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> годин</item>
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> години</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хвилина</item>
<item quantity="few"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хвилини</item>
<item quantity="many"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хвилин</item>
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> хвилини</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Зараз"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Зараз"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-ur/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-ur/complication_strings.xml
index 81a3cca..943e1a8 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-ur/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-ur/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> دن</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> دن</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> گھنٹے</item>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> گھنٹہ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> گھنٹہ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>منٹ</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>منٹ</item>
- </plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> دن</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> دن</item>
- </plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> گھنٹے</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> گھنٹہ</item>
- </plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> منٹ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> منٹ</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"ابھی"</string>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> دن</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> دن</item>
+ </plurals>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> گھنٹے</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> گھنٹہ</item>
+ </plurals>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> منٹ</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> منٹ</item>
+ </plurals>
+ <string name="time_difference_now" msgid="2068359133884605223">"ابھی"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-uz/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-uz/complication_strings.xml
index 4acf84f..34d045d 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-uz/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-uz/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> kun</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> kun</item>
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> k</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> k</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> st</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> st</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> d</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> d</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g>, <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g>, <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g>, <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g>, <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> kun</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> kun</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> soat</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> soat</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> daq</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> daq</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Hozir"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Hozir"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-vi/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-vi/complication_strings.xml
index d07ef24..3662bc4 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-vi/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-vi/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ngày</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ngày</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> giờ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> giờ</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> phút</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> phút</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> ngày</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> ngày</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> giờ</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> giờ</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> phút</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> phút</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Bây giờ"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Bây giờ"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-zh-rCN/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-zh-rCN/complication_strings.xml
index c500fe4..840e896 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-zh-rCN/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-zh-rCN/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
- <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g>天</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g>天</item>
- </plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
- <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g>小时</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g>小时</item>
- </plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
- <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g>分钟</item>
- <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g>分钟</item>
- </plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g><xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g><xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 天</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 天</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 小时</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 小时</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分钟</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分钟</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"现在"</string>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
+ <item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 天</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 天</item>
+ </plurals>
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
+ <item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 小时</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 小时</item>
+ </plurals>
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
+ <item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分钟</item>
+ <item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分钟</item>
+ </plurals>
+ <string name="time_difference_now" msgid="2068359133884605223">"进行中"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-zh-rHK/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-zh-rHK/complication_strings.xml
index b9b42f8..2b54a12 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-zh-rHK/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-zh-rHK/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 天</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 天</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 小時</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 小時</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分鐘</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分鐘</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 天</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 天</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 小時</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 小時</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分鐘</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分鐘</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"現在"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"現在"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-zh-rTW/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-zh-rTW/complication_strings.xml
index b9b42f8..2b54a12 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-zh-rTW/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-zh-rTW/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 天</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 天</item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 小時</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 小時</item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分鐘</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分鐘</item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="other"><xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g> 天</item>
<item quantity="one"><xliff:g id="NUMBER_OF_DAYS_0">%d</xliff:g> 天</item>
</plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="other"><xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g> 小時</item>
<item quantity="one"><xliff:g id="NUMBER_OF_HOURS_0">%d</xliff:g> 小時</item>
</plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="other"><xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g> 分鐘</item>
<item quantity="one"><xliff:g id="NUMBER_OF_MINUTES_0">%d</xliff:g> 分鐘</item>
</plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"現在"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"現在"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/main/res/values-zu/complication_strings.xml b/wear/watchface/watchface-complications-data/src/main/res/values-zu/complication_strings.xml
index 7a7db9d..18b61b5 100644
--- a/wear/watchface/watchface-complications-data/src/main/res/values-zu/complication_strings.xml
+++ b/wear/watchface/watchface-complications-data/src/main/res/values-zu/complication_strings.xml
@@ -1,31 +1,31 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <plurals name="time_difference_short_days" formatted="false" msgid="8500262093840795448">
+ <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">
+ <item quantity="one">izinsuku<xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
+ <item quantity="other">izinsuku<xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
+ </plurals>
+ <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">
+ <item quantity="one">amahora<xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
+ <item quantity="other">amahora<xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
+ </plurals>
+ <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">
+ <item quantity="one">imizuzu<xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
+ <item quantity="other">imizuzu<xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
+ </plurals>
+ <string name="time_difference_short_days_and_hours" msgid="2384500200491672870">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
+ <string name="time_difference_short_hours_and_minutes" msgid="8030280938566792191">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
+ <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">
<item quantity="one">izinsuku <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
<item quantity="other">izinsuku <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_short_hours" formatted="false" msgid="3258361256003469346">
+ <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">
<item quantity="one">amahora <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
<item quantity="other">amahora <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
</plurals>
- <plurals name="time_difference_short_minutes" formatted="false" msgid="3812930575997556650">
+ <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">
<item quantity="one">imizuzu <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
<item quantity="other">imizuzu <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
</plurals>
- <string name="time_difference_short_days_and_hours" msgid="1756744715731328189">"<xliff:g id="SHORT_DAYS">%1$s</xliff:g> <xliff:g id="SHORT_HOURS">%2$s</xliff:g>"</string>
- <string name="time_difference_short_hours_and_minutes" msgid="7429995187969936129">"<xliff:g id="SHORT_HOURS">%1$s</xliff:g> <xliff:g id="SHORT_MINUTES">%2$s</xliff:g>"</string>
- <plurals name="time_difference_words_days" formatted="false" msgid="345557497041553025">
- <item quantity="one">izinsuku <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
- <item quantity="other">izinsuku <xliff:g id="NUMBER_OF_DAYS_1">%d</xliff:g></item>
- </plurals>
- <plurals name="time_difference_words_hours" formatted="false" msgid="2990178439049007198">
- <item quantity="one">amahora <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
- <item quantity="other">amahora <xliff:g id="NUMBER_OF_HOURS_1">%d</xliff:g></item>
- </plurals>
- <plurals name="time_difference_words_minutes" formatted="false" msgid="9081188175463984403">
- <item quantity="one">imizuzu <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
- <item quantity="other">imizuzu <xliff:g id="NUMBER_OF_MINUTES_1">%d</xliff:g></item>
- </plurals>
- <string name="time_difference_now" msgid="1141173224250945412">"Manje"</string>
+ <string name="time_difference_now" msgid="2068359133884605223">"Manje"</string>
</resources>
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt
index a638235..dce3876 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationDataTest.kt
@@ -23,7 +23,7 @@
import android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder
import android.support.wearable.complications.ComplicationText.TimeFormatBuilder
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
+import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
import com.google.common.truth.Truth
import org.junit.Assert
import org.junit.Assert.assertThrows
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt
index 466a3f5..1ceb670 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTemplateTest.kt
@@ -20,7 +20,7 @@
import android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder
import android.support.wearable.complications.ComplicationText.TimeFormatBuilder
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
+import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
import com.google.common.truth.Truth
import org.junit.Assert
import org.junit.Test
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt
index e2d783e..2a85fef 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/ComplicationTextTest.kt
@@ -21,7 +21,7 @@
import android.support.wearable.complications.ComplicationText.TimeDifferenceBuilder
import android.support.wearable.complications.ComplicationText.TimeFormatBuilder
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
+import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
import com.google.common.truth.Truth
import org.junit.Assert
import org.junit.Test
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt
index 346f5e4..ef1d1a0 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeDifferenceTextTest.kt
@@ -18,7 +18,7 @@
import android.content.Context
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
+import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
import com.google.common.truth.Truth
import org.junit.Assert
import org.junit.Test
diff --git a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt
index 82cb546..16ec776 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/android/support/wearable/complications/TimeFormatTextTest.kt
@@ -18,7 +18,7 @@
import android.content.Context
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
+import androidx.wear.watchface.complications.data.SharedRobolectricTestRunner
import com.google.common.truth.Truth
import org.junit.Assert
import org.junit.Test
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
index dfa9cac..e84feef 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/DataTest.kt
@@ -20,8 +20,6 @@
import android.content.Intent
import android.graphics.drawable.Icon
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.ParcelableSubject
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt
index 91cead6..bbd0815 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ImageTest.kt
@@ -17,7 +17,6 @@
package androidx.wear.watchface.complications.data
import android.graphics.drawable.Icon
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/ParcelableSubject.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt
similarity index 97%
rename from wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/ParcelableSubject.kt
rename to wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt
index 098c10d..e7ddf40 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/ParcelableSubject.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/ParcelableSubject.kt
@@ -14,7 +14,7 @@
* limitations under the License.
*/
-package androidx.wear.watchface.complications
+package androidx.wear.watchface.complications.data
import android.os.Parcel
import android.os.Parcelable
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt
new file mode 100644
index 0000000..5b45eb4
--- /dev/null
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/SharedRobolectricTestRunner.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.wear.watchface.complications.data
+
+import org.junit.runners.model.FrameworkMethod
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.internal.bytecode.InstrumentationConfiguration
+
+/** A test runner for all tests within this package. */
+public class SharedRobolectricTestRunner(private val testClass: Class<*>) :
+ RobolectricTestRunner(testClass) {
+
+ override fun createClassLoaderConfig(method: FrameworkMethod?): InstrumentationConfiguration =
+ InstrumentationConfiguration.Builder(super.createClassLoaderConfig(method)).apply {
+ doNotInstrumentPackage("androidx.wear")
+ doNotInstrumentPackage("android.support.wearable")
+ }.build()
+}
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt
index cb2eef0..d792341 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TextTest.kt
@@ -21,8 +21,6 @@
import android.support.wearable.complications.ComplicationText
import android.support.wearable.complications.TimeFormatText
import androidx.test.core.app.ApplicationProvider
-import androidx.wear.watchface.complications.ParcelableSubject
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
import com.google.common.truth.Truth.assertThat
import org.junit.Assert.assertNull
import org.junit.Test
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt
index 8df0269..b1b89809 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TimeRangeTest.kt
@@ -16,7 +16,6 @@
package androidx.wear.watchface.complications.data
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt
index fce751f..4c4b0a9 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt
+++ b/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/data/TypeTest.kt
@@ -16,7 +16,6 @@
package androidx.wear.watchface.complications.data
-import androidx.wear.watchface.complications.SharedRobolectricTestRunner
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith
diff --git a/wear/watchface/watchface-complications/api/current.txt b/wear/watchface/watchface-complications/api/current.txt
new file mode 100644
index 0000000..60a49fa
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/current.txt
@@ -0,0 +1,83 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications {
+
+ public final class ComplicationDataSourceInfo {
+ ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+ method public String getAppName();
+ method public android.content.ComponentName? getComponentName();
+ method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
+ method public android.graphics.drawable.Icon getIcon();
+ method public String getName();
+ method public androidx.wear.watchface.complications.data.ComplicationType getType();
+ property public final String appName;
+ property public final android.content.ComponentName? componentName;
+ property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
+ property public final android.graphics.drawable.Icon icon;
+ property public final String name;
+ property public final androidx.wear.watchface.complications.data.ComplicationType type;
+ }
+
+ public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
+ ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
+ method public void close();
+ method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+ method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+ }
+
+ public static final class ComplicationDataSourceInfoRetriever.Result {
+ method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
+ method public int getSlotId();
+ property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
+ property public final int slotId;
+ }
+
+ public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
+ ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
+ }
+
+ public final class ComplicationDataSourceInfoRetrieverKt {
+ }
+
+ public final class ComplicationSlotBounds {
+ ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
+ ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
+ method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
+ property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
+ }
+
+ public final class DefaultComplicationDataSourcePolicy {
+ ctor public DefaultComplicationDataSourcePolicy();
+ ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
+ ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
+ ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
+ method public android.content.ComponentName? getPrimaryDataSource();
+ method public android.content.ComponentName? getSecondaryDataSource();
+ method public int getSystemDataSourceFallback();
+ method public boolean isEmpty();
+ property public final android.content.ComponentName? primaryDataSource;
+ property public final android.content.ComponentName? secondaryDataSource;
+ property public final int systemDataSourceFallback;
+ }
+
+ public final class SystemDataSources {
+ field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
+ field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
+ field public static final int DATA_SOURCE_DATE = 2; // 0x2
+ field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
+ field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
+ field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
+ field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
+ field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
+ field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
+ field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
+ field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+ field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
+ field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
+ field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
+ }
+
+ public static final class SystemDataSources.Companion {
+ }
+
+}
+
diff --git a/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt b/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..60a49fa
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/public_plus_experimental_current.txt
@@ -0,0 +1,83 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications {
+
+ public final class ComplicationDataSourceInfo {
+ ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+ method public String getAppName();
+ method public android.content.ComponentName? getComponentName();
+ method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
+ method public android.graphics.drawable.Icon getIcon();
+ method public String getName();
+ method public androidx.wear.watchface.complications.data.ComplicationType getType();
+ property public final String appName;
+ property public final android.content.ComponentName? componentName;
+ property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
+ property public final android.graphics.drawable.Icon icon;
+ property public final String name;
+ property public final androidx.wear.watchface.complications.data.ComplicationType type;
+ }
+
+ public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
+ ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
+ method public void close();
+ method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+ method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+ }
+
+ public static final class ComplicationDataSourceInfoRetriever.Result {
+ method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
+ method public int getSlotId();
+ property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
+ property public final int slotId;
+ }
+
+ public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
+ ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
+ }
+
+ public final class ComplicationDataSourceInfoRetrieverKt {
+ }
+
+ public final class ComplicationSlotBounds {
+ ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
+ ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
+ method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
+ property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
+ }
+
+ public final class DefaultComplicationDataSourcePolicy {
+ ctor public DefaultComplicationDataSourcePolicy();
+ ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
+ ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
+ ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
+ method public android.content.ComponentName? getPrimaryDataSource();
+ method public android.content.ComponentName? getSecondaryDataSource();
+ method public int getSystemDataSourceFallback();
+ method public boolean isEmpty();
+ property public final android.content.ComponentName? primaryDataSource;
+ property public final android.content.ComponentName? secondaryDataSource;
+ property public final int systemDataSourceFallback;
+ }
+
+ public final class SystemDataSources {
+ field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
+ field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
+ field public static final int DATA_SOURCE_DATE = 2; // 0x2
+ field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
+ field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
+ field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
+ field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
+ field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
+ field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
+ field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
+ field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+ field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
+ field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
+ field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
+ }
+
+ public static final class SystemDataSources.Companion {
+ }
+
+}
+
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt b/wear/watchface/watchface-complications/api/res-current.txt
similarity index 100%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/text/DesktopCoreTextField.desktop.kt
copy to wear/watchface/watchface-complications/api/res-current.txt
diff --git a/wear/watchface/watchface-complications/api/restricted_current.txt b/wear/watchface/watchface-complications/api/restricted_current.txt
new file mode 100644
index 0000000..60a49fa
--- /dev/null
+++ b/wear/watchface/watchface-complications/api/restricted_current.txt
@@ -0,0 +1,83 @@
+// Signature format: 4.0
+package androidx.wear.watchface.complications {
+
+ public final class ComplicationDataSourceInfo {
+ ctor public ComplicationDataSourceInfo(String appName, String name, android.graphics.drawable.Icon icon, androidx.wear.watchface.complications.data.ComplicationType type, android.content.ComponentName? componentName);
+ method public String getAppName();
+ method public android.content.ComponentName? getComponentName();
+ method public androidx.wear.watchface.complications.data.ComplicationData getFallbackPreviewData();
+ method public android.graphics.drawable.Icon getIcon();
+ method public String getName();
+ method public androidx.wear.watchface.complications.data.ComplicationType getType();
+ property public final String appName;
+ property public final android.content.ComponentName? componentName;
+ property public final androidx.wear.watchface.complications.data.ComplicationData fallbackPreviewData;
+ property public final android.graphics.drawable.Icon icon;
+ property public final String name;
+ property public final androidx.wear.watchface.complications.data.ComplicationType type;
+ }
+
+ public final class ComplicationDataSourceInfoRetriever implements java.lang.AutoCloseable {
+ ctor public ComplicationDataSourceInfoRetriever(android.content.Context context);
+ method public void close();
+ method @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrieveComplicationDataSourceInfo(android.content.ComponentName watchFaceComponent, int[] watchFaceComplicationIds, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.Result[]> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+ method @RequiresApi(android.os.Build.VERSION_CODES.R) @kotlin.jvm.Throws(exceptionClasses=ServiceDisconnectedException::class) public suspend Object? retrievePreviewComplicationData(android.content.ComponentName complicationDataSourceComponent, androidx.wear.watchface.complications.data.ComplicationType complicationType, kotlin.coroutines.Continuation<? super androidx.wear.watchface.complications.data.ComplicationData> p) throws androidx.wear.watchface.complications.ComplicationDataSourceInfoRetriever.ServiceDisconnectedException;
+ }
+
+ public static final class ComplicationDataSourceInfoRetriever.Result {
+ method public androidx.wear.watchface.complications.ComplicationDataSourceInfo? getInfo();
+ method public int getSlotId();
+ property public final androidx.wear.watchface.complications.ComplicationDataSourceInfo? info;
+ property public final int slotId;
+ }
+
+ public static final class ComplicationDataSourceInfoRetriever.ServiceDisconnectedException extends java.lang.Exception {
+ ctor public ComplicationDataSourceInfoRetriever.ServiceDisconnectedException();
+ }
+
+ public final class ComplicationDataSourceInfoRetrieverKt {
+ }
+
+ public final class ComplicationSlotBounds {
+ ctor public ComplicationSlotBounds(java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,? extends android.graphics.RectF> perComplicationTypeBounds);
+ ctor public ComplicationSlotBounds(android.graphics.RectF bounds);
+ method public java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> getPerComplicationTypeBounds();
+ property public final java.util.Map<androidx.wear.watchface.complications.data.ComplicationType,android.graphics.RectF> perComplicationTypeBounds;
+ }
+
+ public final class DefaultComplicationDataSourcePolicy {
+ ctor public DefaultComplicationDataSourcePolicy();
+ ctor public DefaultComplicationDataSourcePolicy(int systemProvider);
+ ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName dataSource, int systemDataSourceFallback);
+ ctor public DefaultComplicationDataSourcePolicy(android.content.ComponentName primaryDataSource, android.content.ComponentName secondaryDataSource, int systemDataSourceFallback);
+ method public android.content.ComponentName? getPrimaryDataSource();
+ method public android.content.ComponentName? getSecondaryDataSource();
+ method public int getSystemDataSourceFallback();
+ method public boolean isEmpty();
+ property public final android.content.ComponentName? primaryDataSource;
+ property public final android.content.ComponentName? secondaryDataSource;
+ property public final int systemDataSourceFallback;
+ }
+
+ public final class SystemDataSources {
+ field public static final androidx.wear.watchface.complications.SystemDataSources.Companion Companion;
+ field public static final int DATA_SOURCE_APP_SHORTCUT = 6; // 0x6
+ field public static final int DATA_SOURCE_DATE = 2; // 0x2
+ field public static final int DATA_SOURCE_DAY_AND_DATE = 16; // 0x10
+ field public static final int DATA_SOURCE_DAY_OF_WEEK = 13; // 0xd
+ field public static final int DATA_SOURCE_FAVORITE_CONTACT = 14; // 0xe
+ field public static final int DATA_SOURCE_NEXT_EVENT = 9; // 0x9
+ field public static final int DATA_SOURCE_STEP_COUNT = 4; // 0x4
+ field public static final int DATA_SOURCE_SUNRISE_SUNSET = 12; // 0xc
+ field public static final int DATA_SOURCE_TIME_AND_DATE = 3; // 0x3
+ field public static final int DATA_SOURCE_UNREAD_NOTIFICATION_COUNT = 7; // 0x7
+ field public static final int DATA_SOURCE_WATCH_BATTERY = 1; // 0x1
+ field public static final int DATA_SOURCE_WORLD_CLOCK = 5; // 0x5
+ field public static final int NO_DATA_SOURCE = -1; // 0xffffffff
+ }
+
+ public static final class SystemDataSources.Companion {
+ }
+
+}
+
diff --git a/wear/watchface/watchface-complications/build.gradle b/wear/watchface/watchface-complications/build.gradle
new file mode 100644
index 0000000..5f14252
--- /dev/null
+++ b/wear/watchface/watchface-complications/build.gradle
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import androidx.build.RunApiTasks
+
+import androidx.build.LibraryGroups
+import androidx.build.LibraryVersions
+import androidx.build.Publish
+
+plugins {
+ id("AndroidXPlugin")
+ id("com.android.library")
+ id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+ api("androidx.annotation:annotation:1.1.0")
+ api(libs.kotlinStdlib)
+ api(project(":wear:watchface:watchface-complications-data"))
+ implementation("androidx.core:core:1.1.0")
+ implementation("androidx.annotation:annotation:1.2.0")
+ testImplementation(libs.testCore)
+ testImplementation(libs.testRunner)
+ testImplementation(libs.testRules)
+ testImplementation(libs.robolectric)
+ testImplementation(libs.mockitoCore)
+ testImplementation(libs.truth)
+ testImplementation("junit:junit:4.13")
+ testImplementation(libs.kotlinReflect)
+
+ androidTestImplementation(libs.testExtJunit)
+ androidTestImplementation(libs.testCore)
+ androidTestImplementation(libs.testRunner)
+ androidTestImplementation(libs.testRules)
+ androidTestImplementation(libs.truth)
+}
+
+android {
+ buildFeatures {
+ aidl = true
+ }
+ defaultConfig {
+ minSdkVersion 26
+ }
+ // Use Robolectric 4.+
+ testOptions.unitTests.includeAndroidResources = true
+}
+
+androidx {
+ name = "Android Wear Complications"
+ publish = Publish.SNAPSHOT_AND_RELEASE
+ mavenGroup = LibraryGroups.WEAR_WATCHFACE
+ inceptionYear = "2021"
+ description = "Android Wear Complications"
+}
diff --git a/wear/watchface/watchface-complications-data/src/androidTest/AndroidManifest.xml b/wear/watchface/watchface-complications/src/androidTest/AndroidManifest.xml
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/androidTest/AndroidManifest.xml
rename to wear/watchface/watchface-complications/src/androidTest/AndroidManifest.xml
diff --git a/wear/watchface/watchface-complications-data/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt b/wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
rename to wear/watchface/watchface-complications/src/androidTest/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
diff --git a/wear/watchface/watchface-complications/src/main/AndroidManifest.xml b/wear/watchface/watchface-complications/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..6cfe902
--- /dev/null
+++ b/wear/watchface/watchface-complications/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="androidx.wear.watchface.complications">
+</manifest>
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
similarity index 99%
rename from wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
rename to wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
index 41d42f75..2dc6ec8 100644
--- a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
+++ b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetriever.kt
@@ -266,6 +266,7 @@
closed = true
try {
context?.unbindService(serviceConnection)
+ context = null
} catch (e: IllegalArgumentException) {
Log.e(TAG, "unbindService failed", e)
}
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceUpdateRequesterConstants.java b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceUpdateRequesterConstants.java
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceUpdateRequesterConstants.java
rename to wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationDataSourceUpdateRequesterConstants.java
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt
rename to wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/ComplicationSlotBounds.kt
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt
rename to wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/DefaultComplicationDataSourcePolicy.kt
diff --git a/wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt b/wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt
rename to wear/watchface/watchface-complications/src/main/java/androidx/wear/watchface/complications/SystemDataSources.kt
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
similarity index 78%
rename from wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
rename to wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
index 1b03648..13f9934 100644
--- a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
+++ b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/ComplicationDataSourceInfoRetrieverTest.kt
@@ -18,8 +18,6 @@
import android.content.ComponentName
import android.content.Context
-import android.graphics.drawable.Icon
-import android.os.IBinder
import android.support.wearable.complications.IPreviewComplicationDataCallback
import android.support.wearable.complications.IProviderInfoService
import androidx.test.core.app.ApplicationProvider
@@ -34,45 +32,41 @@
import androidx.wear.watchface.complications.data.ShortTextComplicationData
import androidx.wear.watchface.complications.data.SmallImageComplicationData
import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.runBlocking
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.ArgumentMatchers.any
-import org.mockito.ArgumentMatchers.eq
import org.mockito.Mockito
-import org.mockito.Mockito.doAnswer
-import java.time.Instant
+import kotlin.jvm.java
-@RunWith(SharedRobolectricTestRunner::class)
+@org.junit.runner.RunWith(SharedRobolectricTestRunner::class)
public class ComplicationDataSourceInfoRetrieverTest {
private val mockService = Mockito.mock(IProviderInfoService::class.java)
- private val mockBinder = Mockito.mock(IBinder::class.java)
+ private val mockBinder = Mockito.mock(android.os.IBinder::class.java)
private val complicationDataSourceInfoRetriever =
ComplicationDataSourceInfoRetriever(mockService)
private val resources = ApplicationProvider.getApplicationContext<Context>().resources
- @Test
+ @org.junit.Test
@Suppress("NewApi") // retrievePreviewComplicationData
public fun retrievePreviewComplicationData() {
- runBlocking {
+ kotlinx.coroutines.runBlocking {
val component = ComponentName("dataSource.package", "dataSource.class")
val type = ComplicationType.LONG_TEXT
Mockito.`when`(mockService.apiVersion).thenReturn(1)
Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
- val testData: ComplicationData = LongTextComplicationData.Builder(
- PlainComplicationText.Builder("Test Text").build(),
- ComplicationText.EMPTY
- ).build()
+ val testData: ComplicationData =
+ LongTextComplicationData.Builder(
+ PlainComplicationText.Builder("Test Text")
+ .build(),
+ ComplicationText.Companion.EMPTY
+ ).build()
- doAnswer {
+ Mockito.doAnswer {
val callback = it.arguments[2] as IPreviewComplicationDataCallback
callback.updateComplicationData(testData.asWireComplicationData())
true
}.`when`(mockService).requestPreviewComplicationData(
- eq(component),
- eq(type.toWireComplicationType()),
- any()
+ org.mockito.ArgumentMatchers.eq(component),
+ org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
+ org.mockito.ArgumentMatchers.any()
)
val previewData =
@@ -84,29 +78,29 @@
assertThat(
(previewData as LongTextComplicationData).text.getTextAt(
ApplicationProvider.getApplicationContext<Context>().resources,
- Instant.EPOCH
+ java.time.Instant.EPOCH
)
).isEqualTo("Test Text")
}
}
- @Test
+ @org.junit.Test
@Suppress("NewApi") // retrievePreviewComplicationData
public fun retrievePreviewComplicationData_DataSourceReturnsNull() {
- runBlocking {
+ kotlinx.coroutines.runBlocking {
val component = ComponentName("dataSource.package", "dataSource.class")
val type = ComplicationType.LONG_TEXT
Mockito.`when`(mockService.apiVersion).thenReturn(1)
Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
- doAnswer {
+ Mockito.doAnswer {
val callback = it.arguments[2] as IPreviewComplicationDataCallback
callback.updateComplicationData(null)
true
}.`when`(mockService).requestPreviewComplicationData(
- eq(component),
- eq(type.toWireComplicationType()),
- any()
+ org.mockito.ArgumentMatchers.eq(component),
+ org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
+ org.mockito.ArgumentMatchers.any()
)
assertThat(
@@ -118,10 +112,10 @@
}
}
- @Test
+ @org.junit.Test
@Suppress("NewApi") // retrievePreviewComplicationData
public fun retrievePreviewComplicationDataApiNotSupported() {
- runBlocking {
+ kotlinx.coroutines.runBlocking {
val component = ComponentName("dataSource.package", "dataSource.class")
val type = ComplicationType.LONG_TEXT
Mockito.`when`(mockService.apiVersion).thenReturn(0)
@@ -136,20 +130,20 @@
}
}
- @Test
+ @org.junit.Test
@Suppress("NewApi") // retrievePreviewComplicationData
public fun retrievePreviewComplicationDataApiReturnsFalse() {
- runBlocking {
+ kotlinx.coroutines.runBlocking {
val component = ComponentName("dataSource.package", "dataSource.class")
val type = ComplicationType.LONG_TEXT
Mockito.`when`(mockService.apiVersion).thenReturn(1)
Mockito.`when`(mockService.asBinder()).thenReturn(mockBinder)
- doAnswer {
+ Mockito.doAnswer {
false
}.`when`(mockService).requestPreviewComplicationData(
- eq(component),
- eq(type.toWireComplicationType()),
- any()
+ org.mockito.ArgumentMatchers.eq(component),
+ org.mockito.ArgumentMatchers.eq(type.toWireComplicationType()),
+ org.mockito.ArgumentMatchers.any()
)
assertThat(
@@ -161,21 +155,21 @@
}
}
- @Test
+ @org.junit.Test
public fun complicationDataSourceInfo_NullComponentName() {
val complicationDataSourceInfo = ComplicationDataSourceInfo(
"appName",
"name",
- Icon.createWithContentUri("icon"),
+ android.graphics.drawable.Icon.createWithContentUri("icon"),
ComplicationType.SHORT_TEXT,
componentName = null
)
assertThat(complicationDataSourceInfo.componentName).isNull()
}
- @Test
+ @org.junit.Test
public fun createShortTextFallbackPreviewData() {
- val icon = Icon.createWithContentUri("icon")
+ val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
val shortTextPreviewData = ComplicationDataSourceInfo(
"applicationName",
"complicationName",
@@ -184,17 +178,17 @@
componentName = null
).fallbackPreviewData as ShortTextComplicationData
assertThat(
- shortTextPreviewData.text.getTextAt(resources, Instant.EPOCH)
+ shortTextPreviewData.text.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complic")
assertThat(
- shortTextPreviewData.contentDescription!!.getTextAt(resources, Instant.EPOCH)
+ shortTextPreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complicationName")
assertThat(shortTextPreviewData.monochromaticImage!!.image).isEqualTo(icon)
}
- @Test
+ @org.junit.Test
public fun createLongTextFallbackPreviewData() {
- val icon = Icon.createWithContentUri("icon")
+ val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
val longTextPreviewData = ComplicationDataSourceInfo(
"applicationName",
"complicationName",
@@ -203,17 +197,17 @@
componentName = null
).fallbackPreviewData as LongTextComplicationData
assertThat(
- longTextPreviewData.text.getTextAt(resources, Instant.EPOCH)
+ longTextPreviewData.text.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complicationName")
assertThat(
- longTextPreviewData.contentDescription!!.getTextAt(resources, Instant.EPOCH)
+ longTextPreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complicationName")
assertThat(longTextPreviewData.monochromaticImage!!.image).isEqualTo(icon)
}
- @Test
+ @org.junit.Test
public fun createSmallImageFallbackPreviewData() {
- val icon = Icon.createWithContentUri("icon")
+ val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
val smallImagePreviewData = ComplicationDataSourceInfo(
"applicationName",
"complicationName",
@@ -223,13 +217,13 @@
).fallbackPreviewData as SmallImageComplicationData
assertThat(smallImagePreviewData.smallImage.image).isEqualTo(icon)
assertThat(
- smallImagePreviewData.contentDescription!!.getTextAt(resources, Instant.EPOCH)
+ smallImagePreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complicationName")
}
- @Test
+ @org.junit.Test
public fun createPhotoImageFallbackPreviewData() {
- val icon = Icon.createWithContentUri("icon")
+ val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
val photoImagePreviewData = ComplicationDataSourceInfo(
"applicationName",
"complicationName",
@@ -239,13 +233,13 @@
).fallbackPreviewData as PhotoImageComplicationData
assertThat(photoImagePreviewData.photoImage).isEqualTo(icon)
assertThat(
- photoImagePreviewData.contentDescription!!.getTextAt(resources, Instant.EPOCH)
+ photoImagePreviewData.contentDescription!!.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complicationName")
}
- @Test
+ @org.junit.Test
public fun createMonochromaticImageFallbackPreviewData() {
- val icon = Icon.createWithContentUri("icon")
+ val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
val monochromaticImagePreviewData = ComplicationDataSourceInfo(
"applicationName",
"complicationName",
@@ -253,18 +247,19 @@
ComplicationType.MONOCHROMATIC_IMAGE,
componentName = null
).fallbackPreviewData as MonochromaticImageComplicationData
- assertThat(monochromaticImagePreviewData.monochromaticImage.image).isEqualTo(icon)
+ assertThat(monochromaticImagePreviewData.monochromaticImage.image)
+ .isEqualTo(icon)
assertThat(
monochromaticImagePreviewData.contentDescription!!.getTextAt(
resources,
- Instant.EPOCH
+ java.time.Instant.EPOCH
)
).isEqualTo("complicationName")
}
- @Test
+ @org.junit.Test
public fun createRangedValueFallbackPreviewData() {
- val icon = Icon.createWithContentUri("icon")
+ val icon = android.graphics.drawable.Icon.createWithContentUri("icon")
val rangedValuePreviewData = ComplicationDataSourceInfo(
"applicationName",
"complicationName",
@@ -276,13 +271,13 @@
assertThat(rangedValuePreviewData.max).isEqualTo(100.0f)
assertThat(rangedValuePreviewData.value).isEqualTo(42.0f)
assertThat(
- rangedValuePreviewData.text!!.getTextAt(resources, Instant.EPOCH)
+ rangedValuePreviewData.text!!.getTextAt(resources, java.time.Instant.EPOCH)
).isEqualTo("complicationName")
assertThat(rangedValuePreviewData.monochromaticImage!!.image).isEqualTo(icon)
assertThat(
rangedValuePreviewData.contentDescription!!.getTextAt(
resources,
- Instant.EPOCH
+ java.time.Instant.EPOCH
)
).isEqualTo("complicationName")
}
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt
rename to wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SharedRobolectricTestRunner.kt
diff --git a/wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt b/wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt
similarity index 100%
rename from wear/watchface/watchface-complications-data/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt
rename to wear/watchface/watchface-complications/src/test/java/androidx/wear/watchface/complications/SystemDataSourcesTest.kt
diff --git a/wear/watchface/watchface-complications/src/test/resources/robolectric.properties b/wear/watchface/watchface-complications/src/test/resources/robolectric.properties
new file mode 100644
index 0000000..ce87047
--- /dev/null
+++ b/wear/watchface/watchface-complications/src/test/resources/robolectric.properties
@@ -0,0 +1,3 @@
+# Robolectric currently doesn't support API 30, so we have to explicitly specify 29 as the target
+# sdk for now. Remove when no longer necessary.
+sdk=29
diff --git a/wear/watchface/watchface-data/src/main/res/values-af/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-af/accessibility_strings.xml
index ae9f064..7eaea17 100644
--- a/wear/watchface/watchface-data/src/main/res/values-af/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-af/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Geen toestemming tot datatoegang nie"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Geen data nie"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> van <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Geen toestemming vir datatoegang nie"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Geen data nie"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> van <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-am/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-am/accessibility_strings.xml
index 5e99387..e40860f 100644
--- a/wear/watchface/watchface-data/src/main/res/values-am/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-am/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ውሂብን ለመድረስ ፈቃድ የለም"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ውሂብ የለም"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> ከ<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ውሂብን የመድረስ ፈቃድ የለም"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ውሂብ የለም"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> ከ<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ar/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ar/accessibility_strings.xml
index 8431f70..4d2deac 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ar/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ar/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"لا يتوفّر إذن للوصول إلى البيانات."</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"بلا بيانات"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> من <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"لا يتوفّر إذن للوصول إلى البيانات."</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"بلا بيانات"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> من <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-as/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-as/accessibility_strings.xml
index cde435b..f77680f 100644
--- a/wear/watchface/watchface-data/src/main/res/values-as/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-as/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ডেটা এক্সেছ কৰিবলৈ অনুমতি নাই"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"কোনো ডেটা নাই"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>ৰ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ডেটা এক্সেছ কৰিবলৈ অনুমতি নাই"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"কোনো ডেটা নাই"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>ৰ ভিতৰত <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-az/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-az/accessibility_strings.xml
index c96ae24..aab8c0b 100644
--- a/wear/watchface/watchface-data/src/main/res/values-az/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-az/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Dataya giriş icazəsi yoxdur"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Data yoxdur"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Dataya giriş icazəsi yoxdur"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Məlumat yoxdur"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-b+sr+Latn/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-b+sr+Latn/accessibility_strings.xml
index 470cd1e..62f8992 100644
--- a/wear/watchface/watchface-data/src/main/res/values-b+sr+Latn/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-b+sr+Latn/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nema dozvolu za pristup podacima"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nema podataka"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nema dozvolu za pristup podacima"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nema podataka"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-be/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-be/accessibility_strings.xml
index c34216f..b559ddf 100644
--- a/wear/watchface/watchface-data/src/main/res/values-be/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-be/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Няма дазволу на доступ да даных"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Няма даных"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> з <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Няма дазволу на доступ да даных"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Няма даных"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> з <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-bg/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-bg/accessibility_strings.xml
index cfb1a39..7e6d8e3 100644
--- a/wear/watchface/watchface-data/src/main/res/values-bg/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-bg/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Няма разрешение за достъп до данни"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Няма данни"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> от <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Няма разрешение за достъп до данни"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Няма данни"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> от <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-bn/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-bn/accessibility_strings.xml
index 55ba40b..3122f9c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-bn/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-bn/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ডেটা অ্যাক্সেস করার অনুমতি নেই"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"কোনও ডেটা নেই"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>-এর মধ্যে <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ডেটা অ্যাক্সেস করার অনুমতি নেই"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"কোনও ডেটা নেই"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>-এর মধ্যে <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-bs/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-bs/accessibility_strings.xml
index a958b5c..bf6bf5c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-bs/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-bs/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nema odobrenja za pristup podacima"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nema podataka"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nema odobrenja za pristup podacima"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nema podataka"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ca/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ca/accessibility_strings.xml
index f7591b0..8a3dbe24 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ca/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ca/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sense permís d\'accés a les dades"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"No hi ha dades"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sense permís d\'accés a les dades"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"No hi ha dades"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-cs/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-cs/accessibility_strings.xml
index a44ca2e..8910ed7 100644
--- a/wear/watchface/watchface-data/src/main/res/values-cs/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-cs/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nemá oprávnění k přístupu k datům"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Žádné údaje"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> z <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nemá oprávnění k přístupu k datům"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Žádná data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> z <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-da/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-da/accessibility_strings.xml
index 2f25055..2ef7108 100644
--- a/wear/watchface/watchface-data/src/main/res/values-da/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-da/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Der er ikke givet adgang til data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ingen data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> af <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Der er ikke givet adgang til data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Ingen data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> af <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-de/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-de/accessibility_strings.xml
index ddcd329..9ccdc5a 100644
--- a/wear/watchface/watchface-data/src/main/res/values-de/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-de/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Keine Datenzugriffsberechtigung"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Keine Daten"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> von <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Keine Datenzugriffsberechtigung"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Keine Daten"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> von <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-el/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-el/accessibility_strings.xml
index 8e38750..d7bd5c5 100644
--- a/wear/watchface/watchface-data/src/main/res/values-el/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-el/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Χωρίς άδεια πρόσβασης σε δεδομένα"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Χωρίς δεδομένα"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> από <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Χωρίς άδεια πρόσβασης σε δεδομένα"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Χωρίς δεδομένα"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> από <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-en-rAU/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-en-rAU/accessibility_strings.xml
index f7c8fff..7d9a71e 100644
--- a/wear/watchface/watchface-data/src/main/res/values-en-rAU/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-en-rAU/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"No permission to access data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"No data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"No permission to access data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"No data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-en-rCA/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-en-rCA/accessibility_strings.xml
index f7c8fff..7d9a71e 100644
--- a/wear/watchface/watchface-data/src/main/res/values-en-rCA/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-en-rCA/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"No permission to access data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"No data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"No permission to access data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"No data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-en-rGB/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-en-rGB/accessibility_strings.xml
index f7c8fff..7d9a71e 100644
--- a/wear/watchface/watchface-data/src/main/res/values-en-rGB/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-en-rGB/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"No permission to access data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"No data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"No permission to access data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"No data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-en-rIN/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-en-rIN/accessibility_strings.xml
index f7c8fff..7d9a71e 100644
--- a/wear/watchface/watchface-data/src/main/res/values-en-rIN/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-en-rIN/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"No permission to access data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"No data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"No permission to access data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"No data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-en-rXC/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-en-rXC/accessibility_strings.xml
index cf76c15..307b42d 100644
--- a/wear/watchface/watchface-data/src/main/res/values-en-rXC/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-en-rXC/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"No permission to access data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"No data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"No permission to access data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"No data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> of <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-es-rUS/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-es-rUS/accessibility_strings.xml
index f14f1b5..cd6f484 100644
--- a/wear/watchface/watchface-data/src/main/res/values-es-rUS/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-es-rUS/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sin permiso para acceder a datos"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Sin datos"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sin permiso para acceder a datos"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Sin datos"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-es/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-es/accessibility_strings.xml
index f14f1b5..cd6f484 100644
--- a/wear/watchface/watchface-data/src/main/res/values-es/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-es/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sin permiso para acceder a datos"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Sin datos"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sin permiso para acceder a datos"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Sin datos"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-et/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-et/accessibility_strings.xml
index 03433f73..4691acf 100644
--- a/wear/watchface/watchface-data/src/main/res/values-et/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-et/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Pole luba andmetele juurde pääseda"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Andmed puuduvad"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Pole luba andmetele juurde pääseda"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Andmed puuduvad"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-eu/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-eu/accessibility_strings.xml
index 1c823ea..97e5575 100644
--- a/wear/watchface/watchface-data/src/main/res/values-eu/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-eu/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Ez duzu datuak atzitzeko baimenik"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ez dago daturik"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Ez duzu datuak atzitzeko baimenik"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Ez dago daturik"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-fa/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-fa/accessibility_strings.xml
index c26a8ce..ad98904 100644
--- a/wear/watchface/watchface-data/src/main/res/values-fa/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-fa/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"اجازه دسترسی به دادهها وجود ندارد"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"دادهای وجود ندارد"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> از <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"اجازه دسترسی به دادهها وجود ندارد"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"دادهای موجود نیست"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> از <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-fi/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-fi/accessibility_strings.xml
index a5ba076..1b1c42e 100644
--- a/wear/watchface/watchface-data/src/main/res/values-fi/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-fi/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Ei pääsyä dataan"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ei dataa"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Ei pääsyä dataan"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Ei dataa"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-fr-rCA/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-fr-rCA/accessibility_strings.xml
index 3bf9890..bc1d2c2 100644
--- a/wear/watchface/watchface-data/src/main/res/values-fr-rCA/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-fr-rCA/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Aucune autoris. d\'accès aux données"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Aucune donnée"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> sur <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Aucune autoris. d\'accès aux données"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Aucune donnée"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-fr/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-fr/accessibility_strings.xml
index e197273..26a629b 100644
--- a/wear/watchface/watchface-data/src/main/res/values-fr/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-fr/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Non autorisée à accéder aux données"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Aucune donnée"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> sur <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Non autorisée à accéder aux données"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Aucune donnée"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> sur <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-gl/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-gl/accessibility_strings.xml
index f24b2c5..64a185d 100644
--- a/wear/watchface/watchface-data/src/main/res/values-gl/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-gl/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sen permiso para acceder aos datos"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Sen datos"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sen permiso para acceder aos datos"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Sen datos"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-gu/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-gu/accessibility_strings.xml
index 8c30886..7a44f31 100644
--- a/wear/watchface/watchface-data/src/main/res/values-gu/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-gu/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ડેટા ઍક્સેસ કરવાની કોઈ પરવાનગી નથી"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"કોઈ ડેટા નથી"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>માંથી <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ડેટા ઍક્સેસ કરવાની કોઈ પરવાનગી નથી"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"કોઈ ડેટા નથી"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>માંથી <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-hi/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-hi/accessibility_strings.xml
index b07e1ae..64e0b52 100644
--- a/wear/watchface/watchface-data/src/main/res/values-hi/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-hi/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"डेटा ऐक्सेस करने की अनुमति नहीं है"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"कोई डेटा नहीं है"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> में से <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"डेटा ऐक्सेस करने की अनुमति नहीं है"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"कोई डेटा उपलब्ध नहीं है"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> में से <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-hr/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-hr/accessibility_strings.xml
index 6a78557..dcc755b4 100644
--- a/wear/watchface/watchface-data/src/main/res/values-hr/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-hr/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nema dopuštenja za pristup podacima"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nema podataka"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nema dopuštenja za pristup podacima"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nema podataka"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-hu/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-hu/accessibility_strings.xml
index 7283349..2ef7482 100644
--- a/wear/watchface/watchface-data/src/main/res/values-hu/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-hu/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nincs engedély az adatok elérésére"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nincs adat"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>/<xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nincs engedély az adatok elérésére"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nincs adat"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>/<xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-hy/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-hy/accessibility_strings.xml
index 3f48f5e..b6dfdad 100644
--- a/wear/watchface/watchface-data/src/main/res/values-hy/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-hy/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Տվյալները հասանելի չեն"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Տվյալներ չկան"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>՝ <xliff:g id="MAX">%2$f</xliff:g>-ից"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Տվյալները հասանելի չեն"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Տվյալներ չկան"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>՝ <xliff:g id="MAX">%2$f</xliff:g>-ից"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-in/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-in/accessibility_strings.xml
index 29e399a..63a2feb 100644
--- a/wear/watchface/watchface-data/src/main/res/values-in/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-in/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Tidak ada izin untuk mengakses data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Tidak ada data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> dari <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Tidak ada izin untuk mengakses data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Tidak ada data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> dari <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-is/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-is/accessibility_strings.xml
index d6a32f8..51e4e9b 100644
--- a/wear/watchface/watchface-data/src/main/res/values-is/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-is/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Engin heimild til að ná í gögn"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Engin gögn"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> af <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Engin heimild til að ná í gögn"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Engin gögn"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> af <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-it/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-it/accessibility_strings.xml
index 97f2a09..ca510cd 100644
--- a/wear/watchface/watchface-data/src/main/res/values-it/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-it/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nessuna autorizzazione accesso dati"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nessun dato"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> di <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nessuna autorizzazione accesso dati"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nessun dato"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> di <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-iw/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-iw/accessibility_strings.xml
index f7044f7..49a0f3b 100644
--- a/wear/watchface/watchface-data/src/main/res/values-iw/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-iw/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"אין הרשאת גישה לנתונים"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"אין נתונים"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> מתוך <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"אין הרשאת גישה לנתונים"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"אין נתונים"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> מתוך <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ja/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ja/accessibility_strings.xml
index 11432e0..5d112ba 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ja/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ja/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"データへのアクセス権限がありません"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"データがありません"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"データへのアクセス権限がありません"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"データがありません"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ka/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ka/accessibility_strings.xml
index 5748948..51dd708 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ka/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ka/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"მონაცემ. წვდომის ნებართვა არ არის"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"მონაცემები არ არის"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> / <xliff:g id="MAX">%2$f</xliff:g>-დან"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"მონაცემებ. წვდომის ნებართვა არ არის"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"მონაცემები არ არის"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>-დან <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-kk/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-kk/accessibility_strings.xml
index 46a4d64..fe433ec 100644
--- a/wear/watchface/watchface-data/src/main/res/values-kk/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-kk/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Деректерді пайдалануға рұқсат жоқ."</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Деректер жоқ."</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Деректерді пайдалануға рұқсат жоқ."</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Дерек жоқ."</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>/<xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-km/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-km/accessibility_strings.xml
index 5ed5ee6..cad6732 100644
--- a/wear/watchface/watchface-data/src/main/res/values-km/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-km/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"មិនមានការអនុញ្ញាតក្នុងការចូលប្រើទិន្នន័យទេ"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"មិនមានទិន្នន័យទេ"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> នៃ <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"គ្មានការអនុញ្ញាតឱ្យចូលប្រើទិន្នន័យទេ"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"គ្មានទិន្នន័យទេ"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> នៃ <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-kn/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-kn/accessibility_strings.xml
index bed7a1b..c549565 100644
--- a/wear/watchface/watchface-data/src/main/res/values-kn/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-kn/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ಡೇಟಾ ಪ್ರವೇಶಿಸಲು ಯಾವುದೇ ಅನುಮತಿ ಇಲ್ಲ"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ಡೇಟಾ ಇಲ್ಲ"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> ರಲ್ಲಿ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ಡೇಟಾವನ್ನು ಪ್ರವೇಶಿಸಲು ಅನುಮತಿಯಿಲ್ಲ"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ಡೇಟಾ ಇಲ್ಲ"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> ರಲ್ಲಿ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ko/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ko/accessibility_strings.xml
index 01a5e4c..b073bbd 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ko/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ko/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"데이터 액세스 권한 없음"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"데이터 없음"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>걸음 중 <xliff:g id="VALUE">%1$f</xliff:g>걸음"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"데이터 액세스 권한 없음"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"데이터 없음"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> 중 <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ky/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ky/accessibility_strings.xml
index d1f58e9..c30258f 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ky/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ky/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Маалыматты колдонууга уруксат жок"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Маалымат жок"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> ичинен <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Маалыматты колдонууга уруксат жок"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Маалымат жок"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> ичинен <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-lo/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-lo/accessibility_strings.xml
index e436f35..b3251af 100644
--- a/wear/watchface/watchface-data/src/main/res/values-lo/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-lo/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ບໍ່ມີສິດອະນຸຍາດເຂົ້າເຖິງຂໍ້ມູນ"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ບໍ່ມີຂໍ້ມູນ"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> ຈາກ <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ບໍ່ມີການອະນຸຍາດເຂົ້າເຖິງຂໍ້ມູນ"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ບໍ່ມີຂໍ້ມູນ"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> ຈາກ <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-lt/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-lt/accessibility_strings.xml
index 9f8933f..c2c748a 100644
--- a/wear/watchface/watchface-data/src/main/res/values-lt/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-lt/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nėra leidimo duomenims pasiekti"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nėra jokių duomenų"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> iš <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nėra leidimo duomenims pasiekti"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nėra jokių duomenų"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> iš <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-lv/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-lv/accessibility_strings.xml
index 092ebcc..45d4ed4 100644
--- a/wear/watchface/watchface-data/src/main/res/values-lv/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-lv/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nav atļaujas piekļūt datiem"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nav datu"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> no <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nav atļaujas piekļūt datiem"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nav datu"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> no <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-mk/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-mk/accessibility_strings.xml
index edc351e..1fbd463 100644
--- a/wear/watchface/watchface-data/src/main/res/values-mk/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-mk/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Нема дозвола за пристап до податоци"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Нема податоци"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> од <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Нема дозвола за пристап до податоци"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Нема податоци"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> од <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ml/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ml/accessibility_strings.xml
index e862c8b..55d9c15 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ml/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ml/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ഡാറ്റ ആക്സസ് ചെയ്യാൻ അനുമതിയില്ല"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ഡാറ്റയൊന്നുമില്ല"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> / <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ഡാറ്റ ആക്സസ് ചെയ്യാൻ അനുമതിയില്ല"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ഡാറ്റയൊന്നുമില്ല"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>-ൽ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-mn/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-mn/accessibility_strings.xml
index fdf1fbc..2964074 100644
--- a/wear/watchface/watchface-data/src/main/res/values-mn/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-mn/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Өгөгдөлд хандах зөвшөөрөл байхгүй"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Өгөгдөл байхгүй"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>-с <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Өгөгдөлд хандах зөвшөөрөл алга"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Өгөгдөл алга"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>-н <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-mr/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-mr/accessibility_strings.xml
index 8ed1106..f51e85d 100644
--- a/wear/watchface/watchface-data/src/main/res/values-mr/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-mr/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"डेटा अॅक्सेस करण्याची परवानगी नाही"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"कोणताही डेटा नाही"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> पैकी <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"डेटा अॅक्सेस करण्याची परवानगी नाही"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"कोणताही डेटा नाही"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> पैकी <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ms/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ms/accessibility_strings.xml
index a0def57..67fd1c3 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ms/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ms/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Tiada kebenaran untuk mengakses data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Tiada data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> daripada <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Tiada kebenaran mengakses data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Tiada data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> daripada <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-my/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-my/accessibility_strings.xml
index cebc57d..93cb84a 100644
--- a/wear/watchface/watchface-data/src/main/res/values-my/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-my/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ဒေတာသုံးရန် ခွင့်ပြုချက်မရှိပါ"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ဒေတာမရှိပါ"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> အနက် <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ဒေတာသုံးရန် ခွင့်ပြုချက်မရှိပါ"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ဒေတာမရှိပါ"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> အနက် <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-nb/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-nb/accessibility_strings.xml
index 74fbe1d..2d39c56 100644
--- a/wear/watchface/watchface-data/src/main/res/values-nb/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-nb/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Ingen tilgang til dataene"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ingen data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> av <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Ingen tilgang til dataene"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Ingen data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> av <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ne/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ne/accessibility_strings.xml
index f0d48e2..a729c77 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ne/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ne/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"डेटा प्रयोग गर्ने अनुमति दिइएको छैन"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"डेटा छैन"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> मध्ये <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"डेटा प्रयोग गर्ने अनुमति दिइएको छैन"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"डेटा छैन"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> मध्ये <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-nl/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-nl/accessibility_strings.xml
index cf89d59..8e322c9 100644
--- a/wear/watchface/watchface-data/src/main/res/values-nl/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-nl/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Geen toegang tot gegevens"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Geen gegevens"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> van <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Geen toegang tot gegevens"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Geen gegevens"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> van <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-or/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-or/accessibility_strings.xml
index 7a8f33e..4b5488c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-or/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-or/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ଡାଟା ଆକ୍ସେସ୍ କରିବାକୁ ଅନୁମତି ନାହିଁ"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"କୌଣସି ଡାଟା ନାହିଁ"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>ର <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ଡାଟା ଆକ୍ସେସ କରିବାକୁ ଅନୁମତି ନାହିଁ"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"କୌଣସି ଡାଟା ନାହିଁ"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>ରୁ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-pa/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-pa/accessibility_strings.xml
index cc4a439..29e93f6 100644
--- a/wear/watchface/watchface-data/src/main/res/values-pa/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-pa/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਨਹੀਂ"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ਕੋਈ ਡਾਟਾ ਨਹੀਂ"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g> ਵਿੱਚੋਂ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ਡਾਟੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਲਈ ਇਜਾਜ਼ਤ ਨਹੀਂ"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ਕੋਈ ਡਾਟਾ ਨਹੀਂ"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g> ਵਿੱਚੋਂ <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-pl/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-pl/accessibility_strings.xml
index 9571ccd..b409a8c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-pl/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-pl/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Brak dostępu do danych"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Brak danych"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Brak dostępu do danych"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Brak danych"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> z <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-pt-rBR/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-pt-rBR/accessibility_strings.xml
index c4f83ae..1585b19 100644
--- a/wear/watchface/watchface-data/src/main/res/values-pt-rBR/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-pt-rBR/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sem permissão para acessar os dados"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Não há dados"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sem permissão para acessar os dados"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Não há dados"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-pt-rPT/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-pt-rPT/accessibility_strings.xml
index b6b63ae..7fc2618 100644
--- a/wear/watchface/watchface-data/src/main/res/values-pt-rPT/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-pt-rPT/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sem autorização de acesso aos dados"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Sem dados"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sem autorização de acesso aos dados"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Sem dados"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-pt/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-pt/accessibility_strings.xml
index c4f83ae..1585b19 100644
--- a/wear/watchface/watchface-data/src/main/res/values-pt/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-pt/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Sem permissão para acessar os dados"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Não há dados"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Sem permissão para acessar os dados"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Não há dados"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> de <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ro/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ro/accessibility_strings.xml
index 99245d7..0202954 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ro/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ro/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nicio permisiune pentru accesarea datelor"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nu există date"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> din <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Fără permisiuni pentru accesarea datelor"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Fără date"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> din <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ru/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ru/accessibility_strings.xml
index 1041a2a..d85f0f7 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ru/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ru/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Нет разрешения на доступ к данным"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Нет данных"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> из <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Нет разрешения на доступ к данным"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Нет данных"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> из <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-si/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-si/accessibility_strings.xml
index 5659c88..f1e8055 100644
--- a/wear/watchface/watchface-data/src/main/res/values-si/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-si/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"දත්තවලට ප්රවේශ වීමට අවසර නැත"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"දත්ත නැත"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>කින් <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"දත්තවලට ප්රවේශ වීමට අවසර නැත"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"දත්ත නැත"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>කින් <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-sk/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-sk/accessibility_strings.xml
index a59e8f1..ab02dd2 100644
--- a/wear/watchface/watchface-data/src/main/res/values-sk/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-sk/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nemá povolený prístup k údajom"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Žiadne údaje"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> z <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nemá povolený prístup k údajom"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Žiadne údaje"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> z <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-sl/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-sl/accessibility_strings.xml
index 0bbdeca..c66a090 100644
--- a/wear/watchface/watchface-data/src/main/res/values-sl/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-sl/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Ni dovoljenja za dostop do podatkov"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ni podatkov"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Ni dovoljenja za dostop do podatkov"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Ni podatkov"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> od <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-sq/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-sq/accessibility_strings.xml
index 8304a75..506fe9d 100644
--- a/wear/watchface/watchface-data/src/main/res/values-sq/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-sq/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Nuk ka leje për qasje te të dhënat"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Nuk ka të dhëna"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> nga <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Nuk ka leje për qasje te të dhënat"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Nuk ka të dhëna"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> nga <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-sr/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-sr/accessibility_strings.xml
index a896dd4..62a3683 100644
--- a/wear/watchface/watchface-data/src/main/res/values-sr/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-sr/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Нема дозволу за приступ подацима"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Нема података"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> од <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Нема дозволу за приступ подацима"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Нема података"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> од <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-sv/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-sv/accessibility_strings.xml
index 4072d54..fc6497c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-sv/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-sv/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Ingen åtkomst till data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ingen data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> av <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Ingen åtkomst till data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Inga data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> av <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-sw/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-sw/accessibility_strings.xml
index 30544a9..bef006c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-sw/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-sw/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Hakuna ruhusa ya kufikia data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Hakuna data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> kati ya <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Hakuna ruhusa ya kufikia data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Hakuna data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> kati ya <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ta/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ta/accessibility_strings.xml
index 9c55867..25c3d45 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ta/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ta/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"தரவை அணுக அனுமதி இல்லை"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"தரவு இல்லை"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"தரவை அணுக அனுமதி இல்லை"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"தரவு ஏதுமில்லை"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> / <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-te/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-te/accessibility_strings.xml
index e6e5fd5..6d66489 100644
--- a/wear/watchface/watchface-data/src/main/res/values-te/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-te/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"డేటా యాక్సెస్ చేయడానికి అనుమతి లేదు"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"డేటా లేదు"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="MAX">%2$f</xliff:g>లో <xliff:g id="VALUE">%1$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"డేటా యాక్సెస్ చేయడానికి అనుమతి లేదు"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"డేటా ఏదీ లేదు"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="MAX">%2$f</xliff:g>లో <xliff:g id="VALUE">%1$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-th/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-th/accessibility_strings.xml
index 8031ad3..ac350be 100644
--- a/wear/watchface/watchface-data/src/main/res/values-th/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-th/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ไม่มีสิทธิ์เข้าถึงข้อมูล"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"ไม่มีข้อมูล"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> จาก <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ไม่มีสิทธิ์เข้าถึงข้อมูล"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"ไม่มีข้อมูล"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> จาก <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-tl/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-tl/accessibility_strings.xml
index a5fb5c1..a7ed8ad 100644
--- a/wear/watchface/watchface-data/src/main/res/values-tl/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-tl/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Walang pahintulot na kunin ang data"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Walang data"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> sa <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Walang pahintulot na kunin ang data"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Walang data"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> sa <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-tr/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-tr/accessibility_strings.xml
index 38fef9a..19f9317 100644
--- a/wear/watchface/watchface-data/src/main/res/values-tr/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-tr/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Verilere erişim izni yok"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Veri yok"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Verilere erişim izni yok"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Veri yok"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-uk/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-uk/accessibility_strings.xml
index f80a178..d78cee1 100644
--- a/wear/watchface/watchface-data/src/main/res/values-uk/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-uk/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Немає дозволу на доступ до даних"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Немає даних"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> з <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Немає дозволу на доступ до даних"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Немає даних"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> з <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-ur/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-ur/accessibility_strings.xml
index 05474c9..32edbef 100644
--- a/wear/watchface/watchface-data/src/main/res/values-ur/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-ur/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"ڈیٹا تک رسائی کیلئے کوئی اجازت نہیں"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"کوئی ڈیٹا نہیں ہے"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> از <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"ڈیٹا تک رسائی کیلئے کوئی اجازت نہیں"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"کوئی ڈیٹا نہیں ہے"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> از <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-uz/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-uz/accessibility_strings.xml
index e846d90..86420748 100644
--- a/wear/watchface/watchface-data/src/main/res/values-uz/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-uz/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Axborotni ochishga ruxsat yoʻq"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Hech narsa topilmadi"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> / <xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Axborotni ochishga ruxsat yoʻq"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Hech narsa topilmadi"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> / <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-vi/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-vi/accessibility_strings.xml
index 12c2927..7f7f835 100644
--- a/wear/watchface/watchface-data/src/main/res/values-vi/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-vi/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Không có quyền truy cập dữ liệu"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Không có dữ liệu"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Không có quyền truy cập dữ liệu"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Không có dữ liệu"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-zh-rCN/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-zh-rCN/accessibility_strings.xml
index 4727c01..bec7ac7 100644
--- a/wear/watchface/watchface-data/src/main/res/values-zh-rCN/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-zh-rCN/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"无权访问数据"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"无数据"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"无权访问数据"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"无数据"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> / <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-zh-rHK/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-zh-rHK/accessibility_strings.xml
index 9bc8513..491a684 100644
--- a/wear/watchface/watchface-data/src/main/res/values-zh-rHK/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-zh-rHK/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"冇權存取資料"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"冇資料"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"冇權存取資料"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"冇資料"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"第 <xliff:g id="VALUE">%1$f</xliff:g> 步,一共有 <xliff:g id="MAX">%2$f</xliff:g> 步"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-zh-rTW/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-zh-rTW/accessibility_strings.xml
index 410015f..3a5f1bc 100644
--- a/wear/watchface/watchface-data/src/main/res/values-zh-rTW/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-zh-rTW/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"無權存取資料"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"沒有任何資料"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g>/<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"無權存取資料"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"沒有資料"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"第 <xliff:g id="VALUE">%1$f</xliff:g>,共 <xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-data/src/main/res/values-zu/accessibility_strings.xml b/wear/watchface/watchface-data/src/main/res/values-zu/accessibility_strings.xml
index 47f72f4..103b63c 100644
--- a/wear/watchface/watchface-data/src/main/res/values-zu/accessibility_strings.xml
+++ b/wear/watchface/watchface-data/src/main/res/values-zu/accessibility_strings.xml
@@ -17,7 +17,7 @@
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="a11y_no_permission" msgid="6173908979849605412">"Ayikho imvume yokufinyelela idatha"</string>
- <string name="a11y_no_data" msgid="2401847004061006997">"Ayikho idatha"</string>
- <string name="a11y_template_range" msgid="2205069205653242011">"<xliff:g id="VALUE">%1$f</xliff:g> ku-<xliff:g id="MAX">%2$f</xliff:g>"</string>
+ <string name="a11y_no_permission" msgid="6954835069208568445">"Ayikho imvume yokufinyelela idatha"</string>
+ <string name="a11y_no_data" msgid="1150196161728975556">"Ayikho idatha"</string>
+ <string name="a11y_template_range" msgid="43093005594777633">"<xliff:g id="VALUE">%1$f</xliff:g> ku-<xliff:g id="MAX">%2$f</xliff:g>"</string>
</resources>
diff --git a/wear/watchface/watchface-editor-guava/api/current.txt b/wear/watchface/watchface-editor-guava/api/current.txt
index 7bd5fe0..5592a04 100644
--- a/wear/watchface/watchface-editor-guava/api/current.txt
+++ b/wear/watchface/watchface-editor-guava/api/current.txt
@@ -8,10 +8,8 @@
method public Integer? getBackgroundComplicationSlotId();
method public Integer? getComplicationSlotIdAt(int x, int y);
method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
- method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> p);
- method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>>> p);
- method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>>> getListenableComplicationPreviewData();
- method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> getListenableComplicationsProviderInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
method public java.time.Instant getPreviewReferenceInstant();
method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -26,6 +24,8 @@
property public Integer? backgroundComplicationSlotId;
property public boolean commitChangesOnClose;
property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
+ property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+ property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
property public java.time.Instant previewReferenceInstant;
property public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
property public androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
diff --git a/wear/watchface/watchface-editor-guava/api/public_plus_experimental_current.txt b/wear/watchface/watchface-editor-guava/api/public_plus_experimental_current.txt
index 7bd5fe0..5592a04 100644
--- a/wear/watchface/watchface-editor-guava/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-editor-guava/api/public_plus_experimental_current.txt
@@ -8,10 +8,8 @@
method public Integer? getBackgroundComplicationSlotId();
method public Integer? getComplicationSlotIdAt(int x, int y);
method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
- method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> p);
- method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>>> p);
- method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>>> getListenableComplicationPreviewData();
- method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> getListenableComplicationsProviderInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
method public java.time.Instant getPreviewReferenceInstant();
method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -26,6 +24,8 @@
property public Integer? backgroundComplicationSlotId;
property public boolean commitChangesOnClose;
property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
+ property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+ property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
property public java.time.Instant previewReferenceInstant;
property public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
property public androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
diff --git a/wear/watchface/watchface-editor-guava/api/restricted_current.txt b/wear/watchface/watchface-editor-guava/api/restricted_current.txt
index 7bd5fe0..5592a04 100644
--- a/wear/watchface/watchface-editor-guava/api/restricted_current.txt
+++ b/wear/watchface/watchface-editor-guava/api/restricted_current.txt
@@ -8,10 +8,8 @@
method public Integer? getBackgroundComplicationSlotId();
method public Integer? getComplicationSlotIdAt(int x, int y);
method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
- method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> p);
- method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>>> p);
- method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>>> getListenableComplicationPreviewData();
- method public com.google.common.util.concurrent.ListenableFuture<kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> getListenableComplicationsProviderInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
method public java.time.Instant getPreviewReferenceInstant();
method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -26,6 +24,8 @@
property public Integer? backgroundComplicationSlotId;
property public boolean commitChangesOnClose;
property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
+ property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+ property public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
property public java.time.Instant previewReferenceInstant;
property public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
property public androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
diff --git a/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt b/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
index 5630a1e..8709b6d 100644
--- a/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
+++ b/wear/watchface/watchface-editor-guava/src/main/java/androidx/wear/watchface/editor/ListenableEditorSession.kt
@@ -129,45 +129,16 @@
override val complicationSlotsState: StateFlow<Map<Int, ComplicationSlotState>> by
wrappedEditorSession::complicationSlotsState
+ override val complicationsPreviewData: StateFlow<Map<Int, ComplicationData>> by
+ wrappedEditorSession::complicationsPreviewData
+
+ override val complicationsDataSourceInfo: StateFlow<Map<Int, ComplicationDataSourceInfo?>> by
+ wrappedEditorSession::complicationsDataSourceInfo
+
@Suppress("INAPPLICABLE_JVM_NAME")
@get:JvmName("isCommitChangesOnClose")
override var commitChangesOnClose: Boolean by wrappedEditorSession::commitChangesOnClose
- /** [ListenableFuture] wrapper around [EditorSession.getComplicationsPreviewData]. */
- public fun getListenableComplicationPreviewData():
- ListenableFuture<StateFlow<Map<Int, ComplicationData>>> {
- val future = ResolvableFuture.create<StateFlow<Map<Int, ComplicationData>>>()
- getCoroutineScope().launch {
- try {
- future.set(wrappedEditorSession.getComplicationsPreviewData())
- } catch (e: Exception) {
- future.setException(e)
- }
- }
- return future
- }
-
- /** [ListenableFuture] wrapper around [EditorSession.getComplicationsDataSourceInfo]. */
- public fun getListenableComplicationsProviderInfo():
- ListenableFuture<StateFlow<Map<Int, ComplicationDataSourceInfo?>>> {
- val future = ResolvableFuture.create<StateFlow<Map<Int, ComplicationDataSourceInfo?>>>()
- getCoroutineScope().launch {
- try {
- future.set(wrappedEditorSession.getComplicationsDataSourceInfo())
- } catch (e: Exception) {
- future.setException(e)
- }
- }
- return future
- }
-
- override suspend fun getComplicationsPreviewData(): StateFlow<Map<Int, ComplicationData>> =
- wrappedEditorSession.getComplicationsPreviewData()
-
- override suspend fun
- getComplicationsDataSourceInfo(): StateFlow<Map<Int, ComplicationDataSourceInfo?>> =
- wrappedEditorSession.getComplicationsDataSourceInfo()
-
@get:SuppressWarnings("AutoBoxing")
override val backgroundComplicationSlotId: Int? by
wrappedEditorSession::backgroundComplicationSlotId
diff --git a/wear/watchface/watchface-editor/api/current.txt b/wear/watchface/watchface-editor/api/current.txt
index 8960bdc..29c54f0 100644
--- a/wear/watchface/watchface-editor/api/current.txt
+++ b/wear/watchface/watchface-editor/api/current.txt
@@ -14,7 +14,6 @@
public final class EditorRequest {
ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
- method public static boolean canWatchFaceSupportHeadlessEditing(android.content.pm.PackageManager packageManager, String watchfacePackageName);
method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
method public String getEditorPackageName();
method public androidx.wear.watchface.client.DeviceConfig? getHeadlessDeviceConfig();
@@ -32,7 +31,6 @@
}
public static final class EditorRequest.Companion {
- method public boolean canWatchFaceSupportHeadlessEditing(android.content.pm.PackageManager packageManager, String watchfacePackageName);
method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
}
@@ -42,8 +40,8 @@
method public Integer? getBackgroundComplicationSlotId();
method @UiThread public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
- method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> p);
- method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>>> p);
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
method public java.time.Instant getPreviewReferenceInstant();
method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -56,6 +54,8 @@
property public abstract Integer? backgroundComplicationSlotId;
property @UiThread public abstract boolean commitChangesOnClose;
property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
+ property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+ property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
property public abstract java.time.Instant previewReferenceInstant;
property public abstract kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
diff --git a/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt b/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
index 8960bdc..29c54f0 100644
--- a/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface-editor/api/public_plus_experimental_current.txt
@@ -14,7 +14,6 @@
public final class EditorRequest {
ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
- method public static boolean canWatchFaceSupportHeadlessEditing(android.content.pm.PackageManager packageManager, String watchfacePackageName);
method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
method public String getEditorPackageName();
method public androidx.wear.watchface.client.DeviceConfig? getHeadlessDeviceConfig();
@@ -32,7 +31,6 @@
}
public static final class EditorRequest.Companion {
- method public boolean canWatchFaceSupportHeadlessEditing(android.content.pm.PackageManager packageManager, String watchfacePackageName);
method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
}
@@ -42,8 +40,8 @@
method public Integer? getBackgroundComplicationSlotId();
method @UiThread public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
- method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> p);
- method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>>> p);
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
method public java.time.Instant getPreviewReferenceInstant();
method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -56,6 +54,8 @@
property public abstract Integer? backgroundComplicationSlotId;
property @UiThread public abstract boolean commitChangesOnClose;
property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
+ property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+ property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
property public abstract java.time.Instant previewReferenceInstant;
property public abstract kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
diff --git a/wear/watchface/watchface-editor/api/restricted_current.txt b/wear/watchface/watchface-editor/api/restricted_current.txt
index 8960bdc..29c54f0 100644
--- a/wear/watchface/watchface-editor/api/restricted_current.txt
+++ b/wear/watchface/watchface-editor/api/restricted_current.txt
@@ -14,7 +14,6 @@
public final class EditorRequest {
ctor @RequiresApi(android.os.Build.VERSION_CODES.R) public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle, @RequiresApi androidx.wear.watchface.client.WatchFaceId watchFaceId, androidx.wear.watchface.client.DeviceConfig? headlessDeviceConfig, androidx.wear.watchface.editor.PreviewScreenshotParams? previewScreenshotParams);
ctor public EditorRequest(android.content.ComponentName watchFaceComponentName, String editorPackageName, androidx.wear.watchface.style.UserStyleData? initialUserStyle);
- method public static boolean canWatchFaceSupportHeadlessEditing(android.content.pm.PackageManager packageManager, String watchfacePackageName);
method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public static androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
method public String getEditorPackageName();
method public androidx.wear.watchface.client.DeviceConfig? getHeadlessDeviceConfig();
@@ -32,7 +31,6 @@
}
public static final class EditorRequest.Companion {
- method public boolean canWatchFaceSupportHeadlessEditing(android.content.pm.PackageManager packageManager, String watchfacePackageName);
method @kotlin.jvm.Throws(exceptionClasses=TimeoutCancellationException::class) public androidx.wear.watchface.editor.EditorRequest createFromIntent(android.content.Intent intent) throws kotlinx.coroutines.TimeoutCancellationException;
}
@@ -42,8 +40,8 @@
method public Integer? getBackgroundComplicationSlotId();
method @UiThread public Integer? getComplicationSlotIdAt(@Px int x, @Px int y);
method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> getComplicationSlotsState();
- method public suspend Object? getComplicationsDataSourceInfo(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.ComplicationDataSourceInfo>>> p);
- method public suspend Object? getComplicationsPreviewData(kotlin.coroutines.Continuation<? super kotlinx.coroutines.flow.StateFlow<? extends java.util.Map<java.lang.Integer,? extends androidx.wear.watchface.complications.data.ComplicationData>>> p);
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> getComplicationsDataSourceInfo();
+ method public kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> getComplicationsPreviewData();
method public java.time.Instant getPreviewReferenceInstant();
method public kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> getUserStyle();
method public androidx.wear.watchface.style.UserStyleSchema getUserStyleSchema();
@@ -56,6 +54,8 @@
property public abstract Integer? backgroundComplicationSlotId;
property @UiThread public abstract boolean commitChangesOnClose;
property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.client.ComplicationSlotState>> complicationSlotsState;
+ property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.ComplicationDataSourceInfo>> complicationsDataSourceInfo;
+ property public abstract kotlinx.coroutines.flow.StateFlow<java.util.Map<java.lang.Integer,androidx.wear.watchface.complications.data.ComplicationData>> complicationsPreviewData;
property public abstract java.time.Instant previewReferenceInstant;
property public abstract kotlinx.coroutines.flow.MutableStateFlow<androidx.wear.watchface.style.UserStyle> userStyle;
property public abstract androidx.wear.watchface.style.UserStyleSchema userStyleSchema;
diff --git a/wear/watchface/watchface-editor/build.gradle b/wear/watchface/watchface-editor/build.gradle
index 64ef142..a5ba515 100644
--- a/wear/watchface/watchface-editor/build.gradle
+++ b/wear/watchface/watchface-editor/build.gradle
@@ -47,6 +47,8 @@
androidTestImplementation(libs.kotlinCoroutinesTest)
androidTestImplementation(libs.kotlinTest)
androidTestImplementation(libs.truth)
+
+ samples(project(":wear:watchface:watchface-samples"))
}
android {
diff --git a/wear/watchface/watchface-editor/lint-baseline.xml b/wear/watchface/watchface-editor/lint-baseline.xml
deleted file mode 100644
index 3d4c55e..0000000
--- a/wear/watchface/watchface-editor/lint-baseline.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
-
- <issue
- id="NewApi"
- message="Field requires API level 30 (current min is 26): `getWatchFaceId`"
- errorLine1=" watchFaceId.id"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/watchface/editor/EditorSession.kt"
- line="510"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Field requires API level 30 (current min is 26): `getWatchFaceId`"
- errorLine1=" watchFaceId.id,"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/main/java/androidx/wear/watchface/editor/EditorSession.kt"
- line="697"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Field requires API level 30 (current min is 26): `getWatchFaceId`"
- errorLine1=" assertThat(it.editorSession.watchFaceId.id).isEqualTo(testInstanceId.id)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt"
- line="671"
- column="41"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Field requires API level 30 (current min is 26): `getWatchFaceId`"
- errorLine1=" assertThat(activity.editorSession.watchFaceId.id).isEqualTo(testInstanceId.id)"
- errorLine2=" ~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt"
- line="690"
- column="43"/>
- </issue>
-
-</issues>
diff --git a/wear/watchface/watchface-editor/samples/lint-baseline.xml b/wear/watchface/watchface-editor/samples/lint-baseline.xml
new file mode 100644
index 0000000..68653f9
--- /dev/null
+++ b/wear/watchface/watchface-editor/samples/lint-baseline.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/complication_config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="11"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="10"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
+ errorLine1=" complicationSlotsManager.addTapListener("
+ errorLine2=" ^">
+ <location
+ file="src/test/java/androidx/wear/watchface/TestCommon.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 30; however, the containing class androidx.wear.watchface.WatchFaceImpl is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" renderer.surfaceHolder.surface.setFrameRate("
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/watchface/WatchFace.kt"
+ line="606"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
index 491369a..6603944 100644
--- a/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
+++ b/wear/watchface/watchface-editor/samples/src/main/java/androidx/wear/watchface/editor/sample/ComplicationConfigFragment.kt
@@ -81,7 +81,7 @@
private val watchFaceConfigActivity: WatchFaceConfigActivity
) : SwipeDismissFrameLayout(context) {
- private lateinit var previewComplicationData: StateFlow<Map<Int, ComplicationData>>
+ private lateinit var previewComplicationData: StateFlow<Map<Int, ComplicationData>?>
private val drawRect = Rect()
// One invisible button per complication.
@@ -112,7 +112,7 @@
watchFaceConfigActivity.coroutineScope.launch {
val dataSourceInfo =
watchFaceConfigActivity.editorSession
- .getComplicationsDataSourceInfo().value[entry.key]
+ .complicationsDataSourceInfo.value[entry.key]
it.tooltipText =
dataSourceInfo?.name ?: "Empty complication data source"
}
@@ -127,8 +127,7 @@
init {
watchFaceConfigActivity.coroutineScope.launch {
- previewComplicationData =
- watchFaceConfigActivity.editorSession.getComplicationsPreviewData()
+ previewComplicationData = watchFaceConfigActivity.editorSession.complicationsPreviewData
setWillNotDraw(false)
previewComplicationData.collect {
requestLayout()
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
index 6abee71..6cff617 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionGuavaTest.kt
@@ -36,7 +36,6 @@
import androidx.wear.watchface.complications.SystemDataSources
import androidx.wear.watchface.complications.data.ComplicationType
import androidx.wear.watchface.complications.data.LongTextComplicationData
-import androidx.wear.watchface.complications.data.ShortTextComplicationData
import androidx.wear.watchface.CanvasComplication
import androidx.wear.watchface.ComplicationDataSourceChooserIntent
import androidx.wear.watchface.ComplicationHelperActivity
@@ -178,35 +177,6 @@
}
@Test
- public fun getListenableComplicationPreviewData() {
- val scenario = createOnWatchFaceEditingTestActivity(
- emptyList(),
- listOf(leftComplication, rightComplication)
- )
-
- lateinit var listenableEditorSession: ListenableEditorSession
- scenario.onActivity { activity ->
- listenableEditorSession = activity.listenableEditorSession
- }
-
- val resources = ApplicationProvider.getApplicationContext<Context>().resources
- val future = listenableEditorSession.getListenableComplicationPreviewData()
- val previewData = future.get(TIMEOUT_MS, TimeUnit.MILLISECONDS).value
-
- val leftComplicationData = previewData[LEFT_COMPLICATION_ID] as
- ShortTextComplicationData
- assertThat(
- leftComplicationData.text.getTextAt(resources, Instant.EPOCH)
- ).isEqualTo("Left")
-
- val rightComplicationData = previewData[RIGHT_COMPLICATION_ID] as
- LongTextComplicationData
- assertThat(
- rightComplicationData.text.getTextAt(resources, Instant.EPOCH)
- ).isEqualTo("Right")
- }
-
- @Test
public fun listenableOpenComplicationDataSourceChooser() {
ComplicationDataSourceChooserContract.useTestComplicationHelperActivity = true
val chosenComplicationDataSourceInfo = ComplicationDataSourceInfo(
@@ -254,8 +224,7 @@
// This should update the preview data to point to the updated dataSource3 data.
val previewComplication =
- listenableEditorSession.getListenableComplicationPreviewData()
- .get(TIMEOUT_MS, TimeUnit.MILLISECONDS).value[LEFT_COMPLICATION_ID]
+ listenableEditorSession.complicationsPreviewData.value[LEFT_COMPLICATION_ID]
as LongTextComplicationData
assertThat(
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
index dc9b220..152507f 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
@@ -21,8 +21,8 @@
import android.content.ComponentName
import android.content.Context
import android.content.Intent
-import android.content.pm.ApplicationInfo
import android.content.pm.PackageManager
+import android.content.pm.ServiceInfo
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
@@ -96,6 +96,7 @@
import kotlinx.coroutines.TimeoutCancellationException
import kotlinx.coroutines.android.asCoroutineDispatcher
import kotlinx.coroutines.async
+import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.job
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
@@ -107,6 +108,7 @@
import org.junit.Assert.assertNull
import org.junit.Assert.assertTrue
import org.junit.Assert.fail
+import org.junit.Ignore
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.any
@@ -1102,6 +1104,9 @@
assertThat(
editorSession.complicationSlotsState.value[LEFT_COMPLICATION_ID]!!.bounds
).isEqualTo(Rect(120, 160, 160, 240))
+ assertThat(
+ editorSession.complicationsDataSourceInfo.value[LEFT_COMPLICATION_ID]!!.name
+ ).isEqualTo("DataSource1")
/**
* Invoke [TestComplicationHelperActivity] which will change the complication data
@@ -1120,7 +1125,7 @@
// This should update the preview data to point to the updated DataSource3 data.
val previewComplication =
- editorSession.getComplicationsPreviewData().value[LEFT_COMPLICATION_ID]
+ editorSession.complicationsPreviewData.value[LEFT_COMPLICATION_ID]
as LongTextComplicationData
assertThat(
@@ -1131,6 +1136,10 @@
).isEqualTo("DataSource3")
assertThat(
+ editorSession.complicationsDataSourceInfo.value[LEFT_COMPLICATION_ID]!!.name
+ ).isEqualTo("TestDataSource3")
+
+ assertThat(
TestComplicationHelperActivity.lastIntent?.extras?.getString(
ComplicationDataSourceChooserIntent.EXTRA_WATCHFACE_INSTANCE_ID
)
@@ -1263,7 +1272,7 @@
assertThat(chosenComplicationDataSource.complicationSlotId)
.isEqualTo(LEFT_COMPLICATION_ID)
assertThat(chosenComplicationDataSource.complicationDataSourceInfo).isNull()
- assertThat(editorSession.getComplicationsPreviewData().value[LEFT_COMPLICATION_ID])
+ assertThat(editorSession.complicationsPreviewData.value[LEFT_COMPLICATION_ID])
.isInstanceOf(EmptyComplicationData::class.java)
}
}
@@ -1818,6 +1827,7 @@
}
@Test
+ @Ignore // TODO(b/200917204): This test is flaking on the bots.
public fun forceCloseEditorSessionDuring_fetchComplicationsData() {
val getProviderInfosLatch = CountDownLatch(1)
val complicationDataSourceInfoRetrieverProvider =
@@ -1832,7 +1842,7 @@
scenario.onActivity { activity ->
activity.immediateCoroutineScope.launch {
- activity.editorSession.getComplicationsPreviewData()
+ activity.editorSession.complicationsPreviewData.collect {}
fail("We shouldn't get here due to the editor closing")
}
}
@@ -2002,7 +2012,7 @@
scenario.onActivity { activity ->
runBlocking {
- val previewData = activity.editorSession.getComplicationsPreviewData().value
+ val previewData = activity.editorSession.complicationsPreviewData.value
assertThat(previewData.size).isEqualTo(2)
assertThat(previewData[LEFT_COMPLICATION_ID])
.isInstanceOf(ShortTextComplicationData::class.java)
@@ -2037,7 +2047,7 @@
scenario.onActivity { activity ->
runBlocking {
- val previewData = activity.editorSession.getComplicationsPreviewData().value
+ val previewData = activity.editorSession.complicationsPreviewData.value
assertThat(previewData.size).isEqualTo(2)
assertThat(previewData[LEFT_COMPLICATION_ID])
.isInstanceOf(ShortTextComplicationData::class.java)
@@ -2150,17 +2160,21 @@
public fun watchfaceSupportsHeadlessEditing() {
val mockPackageManager = Mockito.mock(PackageManager::class.java)
- `when`(mockPackageManager.getApplicationInfo("test.package", PackageManager.GET_META_DATA))
- .thenReturn(
- ApplicationInfo().apply {
- metaData = Bundle().apply {
- putString(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, "4")
- }
- }
+ `when`(
+ mockPackageManager.getServiceInfo(
+ ComponentName("test.package", EditorRequest.WATCHFACE_CONTROL_SERVICE),
+ PackageManager.GET_META_DATA
)
+ ).thenReturn(
+ ServiceInfo().apply {
+ metaData = Bundle().apply {
+ putInt(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, 4)
+ }
+ }
+ )
assertThat(
- EditorRequest.canWatchFaceSupportHeadlessEditing(mockPackageManager, "test.package")
+ EditorRequest.supportsWatchFaceHeadlessEditing(mockPackageManager, "test.package")
).isTrue()
}
@@ -2168,17 +2182,21 @@
public fun watchfaceSupportsHeadlessEditing_oldApi() {
val mockPackageManager = Mockito.mock(PackageManager::class.java)
- `when`(mockPackageManager.getApplicationInfo("test.package", PackageManager.GET_META_DATA))
- .thenReturn(
- ApplicationInfo().apply {
- metaData = Bundle().apply {
- putString(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, "3")
- }
- }
+ `when`(
+ mockPackageManager.getServiceInfo(
+ ComponentName("test.package", EditorRequest.WATCHFACE_CONTROL_SERVICE),
+ PackageManager.GET_META_DATA
)
+ ).thenReturn(
+ ServiceInfo().apply {
+ metaData = Bundle().apply {
+ putInt(EditorRequest.ANDROIDX_WATCHFACE_API_VERSION, 3)
+ }
+ }
+ )
assertThat(
- EditorRequest.canWatchFaceSupportHeadlessEditing(mockPackageManager, "test.package")
+ EditorRequest.supportsWatchFaceHeadlessEditing(mockPackageManager, "test.package")
).isFalse()
}
diff --git a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
index 816ac65..bf06e80 100644
--- a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
+++ b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/EditorSession.kt
@@ -28,6 +28,7 @@
import android.support.wearable.watchface.Constants
import android.support.wearable.watchface.SharedMemoryImage
import androidx.activity.ComponentActivity
+import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.contract.ActivityResultContract
import androidx.annotation.Px
import androidx.annotation.RequiresApi
@@ -74,13 +75,13 @@
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeout
import java.lang.reflect.Proxy
import java.time.Duration
import java.time.Instant
import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
/**
* Interface for manipulating watch face state during a watch face editing session. The editor
@@ -151,28 +152,29 @@
/**
* Returns a flow of maps of [androidx.wear.watchface.ComplicationSlot] ids to preview
- * [ComplicationData] suitable for use in rendering a preview of the watch face. Note if a
- * slot is configured to be empty then it will an instance of [EmptyComplicationData].
- * Disabled complicationSlots are included. Note also unlike live data this is static per
- * complication data source, but it may update (on the UiThread) as a result of
- * [openComplicationDataSourceChooser].
+ * [ComplicationData] suitable for use in rendering a preview of the watch face. This data is
+ * fetched asynchronously and the map will initially be empty. New data may be pushed as
+ * result of running [openComplicationDataSourceChooser].
+ *
+ * Note if a slot is configured to be empty then the map will contain an instance of
+ * [EmptyComplicationData] for that slot. Disabled complicationSlots are included in the map.
*
* If accessed from java, consider using
* [androidx.lifecycle.FlowLiveDataConversions.asLiveData] to observe changes.
*/
- public suspend fun getComplicationsPreviewData(): StateFlow<Map<Int, ComplicationData>>
+ public val complicationsPreviewData: StateFlow<Map<Int, ComplicationData>>
/**
* Returns a flow of maps of [androidx.wear.watchface.ComplicationSlot] ids to
* [ComplicationDataSourceInfo] that represent the information available about the data
- * source for each complication.
+ * source for each complication. This data is fetched asynchronously and the map will initially
+ * be empty. New data may be pushed as result of running [openComplicationDataSourceChooser].
*
- * A `null` [ComplicationDataSourceInfo] will be associated with a complication slot id if the
- * [androidx.wear.watchface.ComplicationSlot] is configured to show the empty complication
+ * Note a `null` [ComplicationDataSourceInfo] will be associated with a complication slot id if
+ * the [androidx.wear.watchface.ComplicationSlot] is configured to show the empty complication
* data source.
*/
- public suspend fun
- getComplicationsDataSourceInfo(): StateFlow<Map<Int, ComplicationDataSourceInfo?>>
+ public val complicationsDataSourceInfo: StateFlow<Map<Int, ComplicationDataSourceInfo?>>
/** The ID of the background complication or `null` if there isn't one. */
@get:SuppressWarnings("AutoBoxing")
@@ -245,7 +247,7 @@
public suspend fun createOnWatchEditorSession(activity: ComponentActivity): EditorSession {
var editorSession: EditorSession? = null
// Wait until Lifecycle.Event.ON_CREATE.
- suspendCoroutine<Unit> { continuation ->
+ suspendCancellableCoroutine<Unit> { continuation ->
activity.lifecycle.addObserver(
object : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
@@ -396,9 +398,9 @@
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
public abstract class BaseEditorSession internal constructor(
- private val activity: ComponentActivity,
- private val complicationDataSourceInfoRetrieverProvider:
- ComplicationDataSourceInfoRetrieverProvider,
+ private var activity: ComponentActivity?,
+ private var complicationDataSourceInfoRetrieverProvider:
+ ComplicationDataSourceInfoRetrieverProvider?,
public val coroutineScope: CoroutineScope,
private val previewScreenshotParams: PreviewScreenshotParams?
) : EditorSession {
@@ -431,28 +433,22 @@
* This is completed when [fetchComplicationsData] has called [getPreviewData] for each
* complication and each of those have been completed.
*/
- internal val deferredComplicationPreviewDataMapFlow =
- CompletableDeferred<MutableStateFlow<Map<Int, ComplicationData>>>()
+ internal val deferredComplicationPreviewDataAvailable = CompletableDeferred<Unit>()
- override suspend fun getComplicationsPreviewData(): StateFlow<Map<Int, ComplicationData>> =
- deferredComplicationPreviewDataMapFlow.await()
+ override val complicationsPreviewData = MutableStateFlow<Map<Int, ComplicationData>>(emptyMap())
- /** This is completed when [fetchComplicationsData] has fetched the data. */
- private val deferredComplicationsDataSourceInfoMapFlow =
- CompletableDeferred<MutableStateFlow<Map<Int, ComplicationDataSourceInfo?>>>()
-
- override suspend fun
- getComplicationsDataSourceInfo(): StateFlow<Map<Int, ComplicationDataSourceInfo?>> =
- deferredComplicationsDataSourceInfoMapFlow.await()
+ override val complicationsDataSourceInfo =
+ MutableStateFlow<Map<Int, ComplicationDataSourceInfo?>>(emptyMap())
/** Pending result for ComplicationDataSourceChooserRequest. */
internal var pendingComplicationDataSourceChooserResult:
CompletableDeferred<ComplicationDataSourceChooserResult?>? = null
- private val chooseComplicationDataSource =
- activity.registerForActivityResult(ComplicationDataSourceChooserContract()) {
- onComplicationDataSourceChooserResult(it)
- }
+ private var chooseComplicationDataSource:
+ ActivityResultLauncher<ComplicationDataSourceChooserRequest>? =
+ activity!!.registerForActivityResult(ComplicationDataSourceChooserContract()) {
+ onComplicationDataSourceChooserResult(it)
+ }
// Fetches the current ComplicationSlotState for each complication.
internal abstract fun fetchComplicationSlotsState(): Map<Int, ComplicationSlotState>
@@ -504,7 +500,7 @@
}
pendingComplicationDataSourceChooserResult = deferredResult
- chooseComplicationDataSource.launch(
+ chooseComplicationDataSource!!.launch(
ComplicationDataSourceChooserRequest(
this,
complicationSlotId,
@@ -527,15 +523,14 @@
}
val complicationDataSourceInfoRetriever =
- complicationDataSourceInfoRetrieverProvider.getComplicationDataSourceInfoRetriever()
+ complicationDataSourceInfoRetrieverProvider!!.getComplicationDataSourceInfoRetriever()
try {
- val complicationsDataSourceInfoMapFlow =
- deferredComplicationsDataSourceInfoMapFlow.await()
+ deferredComplicationPreviewDataAvailable.await()
// Emit an updated complicationsDataSourceInfoMap.
- complicationsDataSourceInfoMapFlow.value =
- HashMap(complicationsDataSourceInfoMapFlow.value).apply {
+ complicationsDataSourceInfo.value =
+ HashMap(complicationsDataSourceInfo.value).apply {
this[complicationSlotId] = complicationDataSourceChooserResult.dataSourceInfo
}
@@ -543,11 +538,10 @@
complicationDataSourceInfoRetriever,
complicationDataSourceChooserResult.dataSourceInfo
)
- val complicationPreviewDataMapFlow = deferredComplicationPreviewDataMapFlow.await()
// Emit an updated complicationPreviewDataMap.
- complicationPreviewDataMapFlow.value =
- HashMap(complicationPreviewDataMapFlow.value).apply {
+ complicationsPreviewData.value =
+ HashMap(complicationsPreviewData.value).apply {
this[complicationSlotId] = previewData ?: EmptyComplicationData()
}
@@ -627,7 +621,7 @@
protected fun fetchComplicationsData(fetchCoroutineScope: CoroutineScope): Job {
val complicationDataSourceInfoRetriever =
- complicationDataSourceInfoRetrieverProvider.getComplicationDataSourceInfoRetriever()
+ complicationDataSourceInfoRetrieverProvider!!.getComplicationDataSourceInfoRetriever()
return fetchCoroutineScope.launchWithTracing(
"BaseEditorSession.fetchComplicationsData"
) {
@@ -640,28 +634,23 @@
watchFaceComponentName,
complicationSlotsState.value.keys.toIntArray()
)
- deferredComplicationsDataSourceInfoMapFlow.complete(
- MutableStateFlow(
- extractComplicationsDataSourceInfoMap(dataSourceInfoArray) ?: emptyMap()
- )
- )
+ complicationsDataSourceInfo.value =
+ extractComplicationsDataSourceInfoMap(dataSourceInfoArray) ?: emptyMap()
+
// Parallel fetch preview ComplicationData.
- deferredComplicationPreviewDataMapFlow.complete(
- MutableStateFlow(
- dataSourceInfoArray?.associateBy(
- { it.slotId },
- {
- async {
- getPreviewData(complicationDataSourceInfoRetriever, it.info)
- }
- }
- // Coerce to a Map<Int, ComplicationData> omitting null values.
- // If mapNotNullValues existed we would use it here.
- )?.mapValues {
- it.value.await() ?: EmptyComplicationData()
- } ?: emptyMap()
- )
- )
+ complicationsPreviewData.value = dataSourceInfoArray?.associateBy(
+ { it.slotId },
+ {
+ async {
+ getPreviewData(complicationDataSourceInfoRetriever, it.info)
+ }
+ }
+ // Coerce to a Map<Int, ComplicationData> omitting null values.
+ // If mapNotNullValues existed we would use it here.
+ )?.mapValues {
+ it.value.await() ?: EmptyComplicationData()
+ } ?: emptyMap()
+ deferredComplicationPreviewDataAvailable.complete(Unit)
} finally {
complicationDataSourceInfoRetriever.close()
}
@@ -679,6 +668,7 @@
coroutineScope.launchWithTracing("BaseEditorSession.close") {
try {
withTimeout(CLOSE_BROADCAST_TIMEOUT_MILLIS) {
+ deferredComplicationPreviewDataAvailable.await()
val previewImage =
if (commitChangesOnClose && previewScreenshotParams != null &&
Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1
@@ -687,7 +677,7 @@
renderWatchFaceToBitmap(
previewScreenshotParams.renderParameters,
previewScreenshotParams.instant,
- getComplicationsPreviewData().value
+ complicationsPreviewData.value
)
)
} else {
@@ -697,7 +687,7 @@
EditorStateWireFormat(
watchFaceId.id,
userStyle.value.toWireFormat(),
- getComplicationsPreviewData().value.mapNotNull {
+ complicationsPreviewData.value.mapNotNull {
if (complicationSlotsState.value[it.key]!!.isEnabled) {
IdAndComplicationDataWireFormat(
it.key,
@@ -718,6 +708,9 @@
closed = true
editorSessionTraceEvent.close()
coroutineScope.cancel()
+ activity = null
+ complicationDataSourceInfoRetrieverProvider = null
+ chooseComplicationDataSource = null
}
}
@@ -730,7 +723,10 @@
EditorService.globalEditorService.removeCloseCallback(closeCallback)
editorSessionTraceEvent.close()
coroutineScope.cancel()
- activity.finish()
+ activity?.finish()
+ activity = null
+ complicationDataSourceInfoRetrieverProvider = null
+ chooseComplicationDataSource = null
}
protected fun requireNotClosed() {
@@ -769,21 +765,14 @@
}
override fun fetchComplicationSlotsState(): Map<Int, ComplicationSlotState> {
- val previewDataMap = runBlocking {
- if (deferredComplicationPreviewDataMapFlow.isCompleted) {
- deferredComplicationPreviewDataMapFlow.await().value
- } else {
- null
- }
- }
return editorDelegate.complicationSlotsManager.complicationSlots.mapValues {
requireNotClosed()
// Get the ComplicationType from the preview data if available. This is important
// because the type and therefore bounds may change based on the selected complication
// data source.
- val type = previewDataMap?.let { previewDataMap ->
- previewDataMap[it.key]!!.type
- } ?: it.value.complicationData.value.type
+ val type = complicationsPreviewData.value.let { previewDataMap ->
+ previewDataMap[it.key]?.type ?: it.value.complicationData.value.type
+ }
ComplicationSlotState(
it.value.computeBounds(editorDelegate.screenBounds, type),
it.value.boundsType,
diff --git a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
index 119b579..50b535e 100644
--- a/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
+++ b/wear/watchface/watchface-editor/src/main/java/androidx/wear/watchface/editor/WatchFaceEditorContract.kt
@@ -25,6 +25,7 @@
import android.os.Build
import androidx.activity.result.contract.ActivityResultContract
import androidx.annotation.RequiresApi
+import androidx.annotation.RestrictTo
import androidx.wear.watchface.RenderParameters
import androidx.wear.watchface.client.DeviceConfig
import androidx.wear.watchface.client.EditorServiceClient
@@ -91,7 +92,8 @@
* @param headlessDeviceConfig If `non-null` then this is the [DeviceConfig] to use when creating
* a headless instance to back the [EditorSession]. If `null` then the current interactive instance
* will be used. If there isn't one then the [EditorSession] won't launch until it's been created.
- * Note [canWatchFaceSupportHeadlessEditing] can be used to determine if this feature is supported.
+ * Note [supportsWatchFaceHeadlessEditing] can be used to determine if this feature is supported.
+ * If it's not supported this parameter will be ignored.
* @param previewScreenshotParams If `non-null` then [EditorSession] upon
* closing will render a screenshot with [PreviewScreenshotParams] using the existing interactive
* or headless instance which will be sent in [EditorState] to any registered clients.
@@ -168,22 +170,31 @@
)
internal const val ANDROIDX_WATCHFACE_API_VERSION = "androidx.wear.watchface.api_version"
+ internal const val WATCHFACE_CONTROL_SERVICE =
+ "androidx.wear.watchface.control.WatchFaceControlService"
/**
- * Inspects the watchface's manifest to determine whether or not it supports headless
- * editing.
+ * Intended to be used in conjunction with [EditorRequest], inspects the watchface's
+ * manifest to determine whether or not it supports headless editing.
+ *
+ * @param packageManager The [PackageManager].
+ * @param watchfacePackageName The package name of the watchface, see
+ * [ComponentName.getPackageName].
+ * @throws [PackageManager.NameNotFoundException] if watchfacePackageName is not recognized.
+ * @hide
*/
@JvmStatic
- public fun canWatchFaceSupportHeadlessEditing(
+ @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+ @Throws(PackageManager.NameNotFoundException::class)
+ public fun supportsWatchFaceHeadlessEditing(
packageManager: PackageManager,
watchfacePackageName: String
): Boolean {
- val metaData = packageManager.getApplicationInfo(
- watchfacePackageName, PackageManager.GET_META_DATA
- ).metaData
- val apiVersion =
- metaData.getString(ANDROIDX_WATCHFACE_API_VERSION)?.toInt() ?: return false
- return apiVersion >= 4
+ val metaData = packageManager.getServiceInfo(
+ ComponentName(watchfacePackageName, WATCHFACE_CONTROL_SERVICE),
+ PackageManager.GET_META_DATA
+ ).metaData ?: return false
+ return metaData.getInt(ANDROIDX_WATCHFACE_API_VERSION) >= 4
}
}
}
diff --git a/wear/watchface/watchface-guava/lint-baseline.xml b/wear/watchface/watchface-guava/lint-baseline.xml
deleted file mode 100644
index 2228767..0000000
--- a/wear/watchface/watchface-guava/lint-baseline.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.2.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.2.0-dev)" variant="all" version="7.2.0-dev">
-
- <issue
- id="NewApi"
- message="Call requires API level 27 (current min is 26): `WatchFaceControlService`"
- errorLine1=" private val realService = object : WatchFaceControlService() {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt"
- line="62"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Extending WatchFaceControlService requires API level 27 (current min is 26): `WatchFaceControlService`"
- errorLine1=" private val realService = object : WatchFaceControlService() {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt"
- line="62"
- column="40"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 27 (current min is 26): `IWatchFaceInstanceServiceStub`"
- errorLine1=" object : IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper())) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt"
- line="64"
- column="13"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Extending IWatchFaceInstanceServiceStub requires API level 27 (current min is 26): `IWatchFaceInstanceServiceStub`"
- errorLine1=" object : IWatchFaceInstanceServiceStub(this, Handler(Looper.getMainLooper())) {"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/androidTest/java/androidx/wear/watchface/test/WatchFaceControlTestService.kt"
- line="64"
- column="22"/>
- </issue>
-
-</issues>
diff --git a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
index 4ed56833..cf50ed7 100644
--- a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
+++ b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableCanvasRenderer.kt
@@ -22,8 +22,8 @@
import androidx.wear.watchface.style.CurrentUserStyleRepository
import com.google.common.util.concurrent.ListenableFuture
import com.google.common.util.concurrent.SettableFuture
+import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
/**
* [ListenableFuture]-based compatibility wrapper around [Renderer.CanvasRenderer]'s suspending
@@ -45,7 +45,8 @@
) {
/**
* Perform UiThread specific initialization. Will be called once during initialization
- * before any subsequent calls to [render].
+ * before any subsequent calls to [render]. Note cancellation of the returned future is not
+ * supported.
*
* @return A ListenableFuture<Unit> which is resolved when UiThread has completed. Rendering
* will be blocked until this has resolved.
@@ -57,7 +58,7 @@
}
}
- override suspend fun init(): Unit = suspendCoroutine {
+ override suspend fun init(): Unit = suspendCancellableCoroutine {
val future = initFuture()
future.addListener(
{ it.resume(future.get()) },
diff --git a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
index 8a9dd5e..62ad415 100644
--- a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
+++ b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableGlesRenderer.kt
@@ -26,9 +26,9 @@
import com.google.common.util.concurrent.ListenableFuture
import com.google.common.util.concurrent.SettableFuture
import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.suspendCancellableCoroutine
import kotlinx.coroutines.sync.Mutex
import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
internal val EGL_CONFIG_ATTRIB_LIST = intArrayOf(
EGL14.EGL_RENDERABLE_TYPE,
@@ -115,7 +115,7 @@
* Called once a background thread when a new GL context is created on the background
* thread, before any subsequent calls to [render]. Note this function is called inside a
* lambda passed to [runBackgroundThreadGlCommands] which has synchronized access to the
- * GL context.
+ * GL context. Note cancellation of the returned future is not supported.
*
* @return A ListenableFuture<Unit> which is resolved when background thread work has
* completed. Rendering will be blocked until this has resolved.
@@ -126,7 +126,7 @@
}
}
- override suspend fun onBackgroundThreadGlContextCreated(): Unit = suspendCoroutine {
+ override suspend fun onBackgroundThreadGlContextCreated(): Unit = suspendCancellableCoroutine {
val future = onBackgroundThreadGlContextCreatedFuture()
future.addListener(
{ it.resume(future.get()) },
@@ -137,8 +137,9 @@
/**
* Called when a new GL surface is created on the UiThread, before any subsequent calls
* to [render] and in response to [SurfaceHolder.Callback.surfaceChanged]. Note this function
- * is called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which
- * has synchronized access to the GL context.
+ * is called inside a lambda passed to [Renderer.GlesRenderer.runUiThreadGlCommands] which
+ * has synchronized access to the GL context. Note cancellation of the returned future is not
+ * supported.
*
* @param width width of surface in pixels
* @param height height of surface in pixels
@@ -154,7 +155,7 @@
}
override suspend fun onUiThreadGlSurfaceCreated(@Px width: Int, @Px height: Int): Unit =
- suspendCoroutine {
+ suspendCancellableCoroutine {
val future = onUiThreadGlSurfaceCreatedFuture(width, height)
future.addListener(
{ it.resume(future.get()) },
diff --git a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
index 0804d01..04c6615 100644
--- a/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
+++ b/wear/watchface/watchface-guava/src/main/java/androidx/wear/watchface/ListenableWatchFaceService.kt
@@ -17,17 +17,39 @@
package androidx.wear.watchface
import android.view.SurfaceHolder
+import androidx.wear.watchface.WatchFaceService.Companion.MAX_CREATE_WATCHFACE_TIME_MILLIS
import androidx.wear.watchface.style.CurrentUserStyleRepository
+import androidx.wear.watchface.style.UserStyleSchema
import com.google.common.util.concurrent.ListenableFuture
+import kotlinx.coroutines.suspendCancellableCoroutine
import kotlin.coroutines.resume
-import kotlin.coroutines.suspendCoroutine
/**
* [ListenableFuture]-based compatibility wrapper around [WatchFaceService]'s suspending
* [WatchFaceService.createWatchFace].
*/
public abstract class ListenableWatchFaceService : WatchFaceService() {
- /** Override this factory method to create your WatchFaceImpl. */
+ /**
+ * Override this factory method to create your WatchFaceImpl. This method will be called by the
+ * library on a background thread, if possible any expensive initialization should be done
+ * asynchronously. The [WatchFace] and its [Renderer] should be accessed exclusively from the
+ * UiThread afterwards. There is a memory barrier between construction and rendering so no
+ * special threading primitives are required.
+ *
+ * Warning the system will likely time out waiting for watch face initialization if it takes
+ * longer than [MAX_CREATE_WATCHFACE_TIME_MILLIS] milliseconds.
+ *
+ * Note cancellation of the returned future is not supported.
+ *
+ * @param surfaceHolder The [SurfaceHolder] to pass to the [Renderer]'s constructor.
+ * @param watchState The [WatchState] for the watch face.
+ * @param complicationSlotsManager The [ComplicationSlotsManager] returned by
+ * [createComplicationSlotsManager].
+ * @param currentUserStyleRepository The [CurrentUserStyleRepository] constructed using the
+ * [UserStyleSchema] returned by [createUserStyleSchema].
+ * @return A [ListenableFuture] for a [WatchFace] whose [Renderer] uses the provided
+ * [surfaceHolder].
+ */
protected abstract fun createWatchFaceFuture(
surfaceHolder: SurfaceHolder,
watchState: WatchState,
@@ -40,7 +62,7 @@
watchState: WatchState,
complicationSlotsManager: ComplicationSlotsManager,
currentUserStyleRepository: CurrentUserStyleRepository
- ): WatchFace = suspendCoroutine {
+ ): WatchFace = suspendCancellableCoroutine {
val future = createWatchFaceFuture(
surfaceHolder,
watchState,
diff --git a/wear/watchface/watchface-samples-minimal-complications/build.gradle b/wear/watchface/watchface-samples-minimal-complications/build.gradle
index 11aabca..a91525c 100644
--- a/wear/watchface/watchface-samples-minimal-complications/build.gradle
+++ b/wear/watchface/watchface-samples-minimal-complications/build.gradle
@@ -30,6 +30,7 @@
api(project(":wear:watchface:watchface-editor"))
api(project(":wear:watchface:watchface-editor-guava"))
api(project(":wear:watchface:watchface-guava"))
+ implementation("androidx.lifecycle:lifecycle-livedata-ktx:2.3.1")
implementation(libs.guavaAndroid)
}
diff --git a/wear/watchface/watchface-samples-minimal-complications/lint-baseline.xml b/wear/watchface/watchface-samples-minimal-complications/lint-baseline.xml
new file mode 100644
index 0000000..68653f9
--- /dev/null
+++ b/wear/watchface/watchface-samples-minimal-complications/lint-baseline.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/complication_config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="11"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="10"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
+ errorLine1=" complicationSlotsManager.addTapListener("
+ errorLine2=" ^">
+ <location
+ file="src/test/java/androidx/wear/watchface/TestCommon.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 30; however, the containing class androidx.wear.watchface.WatchFaceImpl is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" renderer.surfaceHolder.surface.setFrameRate("
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/watchface/WatchFace.kt"
+ line="606"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
index 1d27d3e..610716d 100644
--- a/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
+++ b/wear/watchface/watchface-samples-minimal-complications/src/main/java/androidx/wear/watchface/samples/minimal/complications/ConfigActivity.java
@@ -27,7 +27,7 @@
import androidx.activity.ComponentActivity;
import androidx.annotation.Nullable;
-import androidx.annotation.RequiresApi;
+import androidx.lifecycle.FlowLiveDataConversions;
import androidx.wear.watchface.complications.ComplicationDataSourceInfo;
import androidx.wear.watchface.complications.data.ComplicationData;
import androidx.wear.watchface.complications.rendering.ComplicationDrawable;
@@ -35,11 +35,8 @@
import com.google.common.util.concurrent.ListenableFuture;
-import java.util.Map;
import java.util.concurrent.Executor;
-import kotlinx.coroutines.flow.StateFlow;
-
/** Configuration activity for the watch face. */
public class ConfigActivity extends ComponentActivity {
@@ -58,7 +55,8 @@
private ImageView mComplicationPreview;
private ComplicationDrawable mComplicationPreviewDrawable;
- @Nullable private ListenableEditorSession mEditorSession;
+ @Nullable
+ private ListenableEditorSession mEditorSession;
public ConfigActivity() {
addCallback(
@@ -68,8 +66,7 @@
@Override
public void onSuccess(ListenableEditorSession editorSession) {
super.onSuccess(editorSession);
- ConfigActivity.this.mEditorSession = editorSession;
- updateComplicationSlotStatus();
+ setEditorSession(editorSession);
}
});
}
@@ -91,52 +88,14 @@
}
}
- private void changeComplication() {
- Log.d(TAG, "changeComplication");
- if (mEditorSession == null) {
- return;
- }
- mEditorSession
- .listenableOpenComplicationDataSourceChooser(WatchFaceService.COMPLICATION_ID)
- .addListener(this::updateComplicationSlotStatus, mMainExecutor);
- }
-
- @Override
- protected void onResume() {
- super.onResume();
- updateComplicationSlotStatus();
- }
-
- @Override
- protected void onDestroy() {
- finish();
- super.onDestroy();
- }
-
- private void updateComplicationSlotStatus() {
- if (mEditorSession == null) {
- return;
- }
- updateComplicationDataSourceName();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
- updateComplicationSlotPreview();
- }
- }
-
- private void updateComplicationDataSourceName() {
- if (mEditorSession == null) {
- return;
- }
- addCallback(
- mEditorSession.getListenableComplicationsProviderInfo(),
- new BaseFutureCallback<StateFlow<Map<Integer, ComplicationDataSourceInfo>>>(
- this, TAG, "getListenableComplicationsProviderInfo") {
- @Override
- public void onSuccess(
- StateFlow<Map<Integer, ComplicationDataSourceInfo>> flow) {
- super.onSuccess(flow);
+ private void setEditorSession(ListenableEditorSession editorSession) {
+ ConfigActivity.this.mEditorSession = editorSession;
+ FlowLiveDataConversions.asLiveData(mEditorSession.getComplicationsDataSourceInfo()).observe(
+ this,
+ complicationDataSourceInfoMap -> {
+ if (!complicationDataSourceInfoMap.isEmpty()) {
ComplicationDataSourceInfo info =
- flow.getValue().get(WatchFaceService.COMPLICATION_ID);
+ complicationDataSourceInfoMap.get(WatchFaceService.COMPLICATION_ID);
if (info == null) {
mComplicationProviderName.setText(
getString(R.string.complication_none));
@@ -144,23 +103,17 @@
mComplicationProviderName.setText(info.getName());
}
}
- });
- }
+ }
+ );
- @RequiresApi(Build.VERSION_CODES.R)
- private void updateComplicationSlotPreview() {
- if (mEditorSession == null) {
- return;
- }
- addCallback(
- mEditorSession.getListenableComplicationPreviewData(),
- new BaseFutureCallback<StateFlow<Map<Integer, ComplicationData>>>(
- this, TAG, "getListenableComplicationPreviewData") {
- @Override
- public void onSuccess(StateFlow<Map<Integer, ComplicationData>> flow) {
- super.onSuccess(flow);
+ FlowLiveDataConversions.asLiveData(mEditorSession.getComplicationsPreviewData()).observe(
+ this,
+ complicationsPreviewData -> {
+ if (complicationsPreviewData.isEmpty()) {
+ mComplicationPreview.setImageResource(R.drawable.preview_loading);
+ } else {
ComplicationData preview =
- flow.getValue().get(WatchFaceService.COMPLICATION_ID);
+ complicationsPreviewData.get(WatchFaceService.COMPLICATION_ID);
if (preview != null) {
mComplicationPreview.setImageDrawable(mComplicationPreviewDrawable);
mComplicationPreviewDrawable.setComplicationData(preview, true);
@@ -168,13 +121,25 @@
mComplicationPreview.setImageResource(R.drawable.preview_unavailable);
}
}
+ }
- @Override
- public void onPending() {
- super.onPending();
- mComplicationPreview.setImageResource(R.drawable.preview_loading);
- }
- });
+ );
+ }
+
+ private void changeComplication() {
+ Log.d(TAG, "changeComplication");
+ if (mEditorSession == null) {
+ return;
+ }
+ mEditorSession
+ .listenableOpenComplicationDataSourceChooser(WatchFaceService.COMPLICATION_ID)
+ .addListener(() -> { /* Empty on purpose. */ }, mMainExecutor);
+ }
+
+ @Override
+ protected void onDestroy() {
+ finish();
+ super.onDestroy();
}
private <T> void addCallback(ListenableFuture<T> future, FutureCallback<T> callback) {
diff --git a/wear/watchface/watchface-samples-minimal-style/lint-baseline.xml b/wear/watchface/watchface-samples-minimal-style/lint-baseline.xml
new file mode 100644
index 0000000..68653f9
--- /dev/null
+++ b/wear/watchface/watchface-samples-minimal-style/lint-baseline.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/complication_config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="11"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="10"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
+ errorLine1=" complicationSlotsManager.addTapListener("
+ errorLine2=" ^">
+ <location
+ file="src/test/java/androidx/wear/watchface/TestCommon.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 30; however, the containing class androidx.wear.watchface.WatchFaceImpl is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" renderer.surfaceHolder.surface.setFrameRate("
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/watchface/WatchFace.kt"
+ line="606"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/wear/watchface/watchface-style/build.gradle b/wear/watchface/watchface-style/build.gradle
index f6994bf..4b8ee65 100644
--- a/wear/watchface/watchface-style/build.gradle
+++ b/wear/watchface/watchface-style/build.gradle
@@ -28,6 +28,7 @@
dependencies {
api("androidx.annotation:annotation:1.1.0")
+ api(project(":wear:watchface:watchface-complications"))
api(project(":wear:watchface:watchface-data"))
api(libs.kotlinStdlib)
diff --git a/wear/watchface/watchface-style/lint-baseline.xml b/wear/watchface/watchface-style/lint-baseline.xml
deleted file mode 100644
index 6ac7089..0000000
--- a/wear/watchface/watchface-style/lint-baseline.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(unparceled.icon!!.uri.toString()).isEqualTo("settingIcon")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="80"
- column="38"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray[0].icon!!.uri.toString()).isEqualTo("icon1")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="87"
- column="42"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray[1].icon!!.uri.toString()).isEqualTo("icon2")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="90"
- column="42"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray[2].icon!!.uri.toString()).isEqualTo("icon3")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="93"
- column="42"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(unmarshalled1.icon!!.uri.toString()).isEqualTo("icon1")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="108"
- column="41"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(unmarshalled2.icon!!.uri.toString()).isEqualTo("icon2")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="111"
- column="41"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(unmarshalled3.icon!!.uri.toString()).isEqualTo("icon3")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="114"
- column="41"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(schema.userStyleSettings[0].icon!!.uri.toString()).isEqualTo("settingIcon1")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="172"
- column="55"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray1[0].icon!!.uri.toString()).isEqualTo("icon1")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="182"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray1[1].icon!!.uri.toString()).isEqualTo("icon2")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="185"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(schema.userStyleSettings[1].icon!!.uri.toString()).isEqualTo("settingIcon2")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="191"
- column="55"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray2[0].icon!!.uri.toString()).isEqualTo("icon3")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="201"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 28 (current min is 25): `android.graphics.drawable.Icon#getUri`"
- errorLine1=" assertThat(optionArray2[1].icon!!.uri.toString()).isEqualTo("icon4")"
- errorLine2=" ~~~">
- <location
- file="src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt"
- line="204"
- column="43"/>
- </issue>
-
-</issues>
diff --git a/wear/watchface/watchface/api/current.txt b/wear/watchface/watchface/api/current.txt
index 2aa4b8f..6f3baa0 100644
--- a/wear/watchface/watchface/api/current.txt
+++ b/wear/watchface/watchface/api/current.txt
@@ -172,7 +172,6 @@
}
public abstract sealed class Renderer {
- method public abstract void dump(java.io.PrintWriter writer);
method public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> getAdditionalContentDescriptionLabels();
method public final float getCenterX();
method public final float getCenterY();
@@ -183,6 +182,7 @@
method public final android.view.SurfaceHolder getSurfaceHolder();
method @UiThread public final void invalidate();
method @UiThread public void onDestroy();
+ method @UiThread public abstract void onDump(java.io.PrintWriter writer);
method @UiThread protected void onRenderParametersChanged(androidx.wear.watchface.RenderParameters renderParameters);
method public final void postInvalidate();
method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> value);
@@ -199,8 +199,8 @@
public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
- method public void dump(java.io.PrintWriter writer);
method @UiThread public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void onDump(java.io.PrintWriter writer);
method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
}
@@ -209,12 +209,12 @@
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
- method public void dump(java.io.PrintWriter writer);
method public final android.opengl.EGLContext getEglBackgroundThreadContext();
method public final android.opengl.EGLConfig getEglConfig();
method public final android.opengl.EGLDisplay getEglDisplay();
method public final android.opengl.EGLContext getEglUiThreadContext();
method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void onDump(java.io.PrintWriter writer);
method @UiThread public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method @UiThread public abstract void render(java.time.ZonedDateTime zonedDateTime);
method @UiThread public abstract void renderHighlightLayer(java.time.ZonedDateTime zonedDateTime);
@@ -286,7 +286,7 @@
}
public static interface WatchFace.TapListener {
- method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent);
+ method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
}
public final class WatchFaceKt {
diff --git a/wear/watchface/watchface/api/public_plus_experimental_current.txt b/wear/watchface/watchface/api/public_plus_experimental_current.txt
index 2aa4b8f..6f3baa0 100644
--- a/wear/watchface/watchface/api/public_plus_experimental_current.txt
+++ b/wear/watchface/watchface/api/public_plus_experimental_current.txt
@@ -172,7 +172,6 @@
}
public abstract sealed class Renderer {
- method public abstract void dump(java.io.PrintWriter writer);
method public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> getAdditionalContentDescriptionLabels();
method public final float getCenterX();
method public final float getCenterY();
@@ -183,6 +182,7 @@
method public final android.view.SurfaceHolder getSurfaceHolder();
method @UiThread public final void invalidate();
method @UiThread public void onDestroy();
+ method @UiThread public abstract void onDump(java.io.PrintWriter writer);
method @UiThread protected void onRenderParametersChanged(androidx.wear.watchface.RenderParameters renderParameters);
method public final void postInvalidate();
method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> value);
@@ -199,8 +199,8 @@
public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
- method public void dump(java.io.PrintWriter writer);
method @UiThread public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void onDump(java.io.PrintWriter writer);
method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
}
@@ -209,12 +209,12 @@
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
- method public void dump(java.io.PrintWriter writer);
method public final android.opengl.EGLContext getEglBackgroundThreadContext();
method public final android.opengl.EGLConfig getEglConfig();
method public final android.opengl.EGLDisplay getEglDisplay();
method public final android.opengl.EGLContext getEglUiThreadContext();
method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void onDump(java.io.PrintWriter writer);
method @UiThread public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method @UiThread public abstract void render(java.time.ZonedDateTime zonedDateTime);
method @UiThread public abstract void renderHighlightLayer(java.time.ZonedDateTime zonedDateTime);
@@ -286,7 +286,7 @@
}
public static interface WatchFace.TapListener {
- method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent);
+ method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
}
public final class WatchFaceKt {
diff --git a/wear/watchface/watchface/api/restricted_current.txt b/wear/watchface/watchface/api/restricted_current.txt
index 4cdbf7f..d6a7a5c 100644
--- a/wear/watchface/watchface/api/restricted_current.txt
+++ b/wear/watchface/watchface/api/restricted_current.txt
@@ -174,7 +174,6 @@
}
public abstract sealed class Renderer {
- method public abstract void dump(java.io.PrintWriter writer);
method public final java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> getAdditionalContentDescriptionLabels();
method public final float getCenterX();
method public final float getCenterY();
@@ -185,6 +184,7 @@
method public final android.view.SurfaceHolder getSurfaceHolder();
method @UiThread public final void invalidate();
method @UiThread public void onDestroy();
+ method @UiThread public abstract void onDump(java.io.PrintWriter writer);
method @UiThread protected void onRenderParametersChanged(androidx.wear.watchface.RenderParameters renderParameters);
method public final void postInvalidate();
method public final void setAdditionalContentDescriptionLabels(java.util.Collection<kotlin.Pair<java.lang.Integer,androidx.wear.watchface.ContentDescriptionLabel>> value);
@@ -201,8 +201,8 @@
public abstract static class Renderer.CanvasRenderer extends androidx.wear.watchface.Renderer {
ctor @WorkerThread public Renderer.CanvasRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, int canvasType, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis);
- method public void dump(java.io.PrintWriter writer);
method @UiThread public suspend Object? init(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void onDump(java.io.PrintWriter writer);
method @UiThread public abstract void render(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
method @UiThread public abstract void renderHighlightLayer(android.graphics.Canvas canvas, android.graphics.Rect bounds, java.time.ZonedDateTime zonedDateTime);
}
@@ -211,12 +211,12 @@
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList, optional int[] eglSurfaceAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis, optional int[] eglConfigAttribList) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
ctor @WorkerThread @kotlin.jvm.Throws(exceptionClasses=GlesException::class) public Renderer.GlesRenderer(android.view.SurfaceHolder surfaceHolder, androidx.wear.watchface.style.CurrentUserStyleRepository currentUserStyleRepository, androidx.wear.watchface.WatchState watchState, @IntRange(from=0, to=60000) long interactiveDrawModeUpdateDelayMillis) throws androidx.wear.watchface.Renderer.GlesRenderer.GlesException;
- method public void dump(java.io.PrintWriter writer);
method public final android.opengl.EGLContext getEglBackgroundThreadContext();
method public final android.opengl.EGLConfig getEglConfig();
method public final android.opengl.EGLDisplay getEglDisplay();
method public final android.opengl.EGLContext getEglUiThreadContext();
method @WorkerThread public suspend Object? onBackgroundThreadGlContextCreated(kotlin.coroutines.Continuation<? super kotlin.Unit> p);
+ method public void onDump(java.io.PrintWriter writer);
method @UiThread public suspend Object? onUiThreadGlSurfaceCreated(@Px int width, @Px int height, kotlin.coroutines.Continuation<? super kotlin.Unit> p);
method @UiThread public abstract void render(java.time.ZonedDateTime zonedDateTime);
method @UiThread public abstract void renderHighlightLayer(java.time.ZonedDateTime zonedDateTime);
@@ -288,7 +288,7 @@
}
public static interface WatchFace.TapListener {
- method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent);
+ method @UiThread public void onTapEvent(int tapType, androidx.wear.watchface.TapEvent tapEvent, androidx.wear.watchface.ComplicationSlot? complicationSlot);
}
public final class WatchFaceKt {
diff --git a/wear/watchface/watchface/build.gradle b/wear/watchface/watchface/build.gradle
index 8fb3261..49f809b 100644
--- a/wear/watchface/watchface/build.gradle
+++ b/wear/watchface/watchface/build.gradle
@@ -54,6 +54,8 @@
testImplementation(libs.robolectric)
testImplementation(libs.truth)
testImplementation(libs.kotlinTest)
+
+ samples(project(":wear:watchface:watchface-samples"))
}
android {
diff --git a/wear/watchface/watchface/lint-baseline.xml b/wear/watchface/watchface/lint-baseline.xml
index d18e470..6c2fe63 100644
--- a/wear/watchface/watchface/lint-baseline.xml
+++ b/wear/watchface/watchface/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-dev" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-dev)" variant="all" version="7.1.0-dev">
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
<issue
id="MissingClass"
@@ -57,17 +57,6 @@
</issue>
<issue
- id="NewApi"
- message="Call requires API level 27 (current min is 26): `dump`"
- errorLine1=" HeadlessWatchFaceImpl.dump(indentingPrintWriter)"
- errorLine2=" ~~~~">
- <location
- file="src/main/java/androidx/wear/watchface/WatchFaceService.kt"
- line="1845"
- column="31"/>
- </issue>
-
- <issue
id="WrongThread"
message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
errorLine1=" complicationSlotsManager.addTapListener("
@@ -85,7 +74,7 @@
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/watchface/WatchFace.kt"
- line="601"
+ line="606"
column="44"/>
</issue>
diff --git a/wear/watchface/watchface/samples/app/lint-baseline.xml b/wear/watchface/watchface/samples/app/lint-baseline.xml
new file mode 100644
index 0000000..68653f9
--- /dev/null
+++ b/wear/watchface/watchface/samples/app/lint-baseline.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/complication_config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="11"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="10"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
+ errorLine1=" complicationSlotsManager.addTapListener("
+ errorLine2=" ^">
+ <location
+ file="src/test/java/androidx/wear/watchface/TestCommon.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 30; however, the containing class androidx.wear.watchface.WatchFaceImpl is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" renderer.surfaceHolder.surface.setFrameRate("
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/watchface/WatchFace.kt"
+ line="606"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/wear/watchface/watchface/samples/lint-baseline.xml b/wear/watchface/watchface/samples/lint-baseline.xml
new file mode 100644
index 0000000..68653f9
--- /dev/null
+++ b/wear/watchface/watchface/samples/lint-baseline.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/complication_config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="11"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="10"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
+ errorLine1=" complicationSlotsManager.addTapListener("
+ errorLine2=" ^">
+ <location
+ file="src/test/java/androidx/wear/watchface/TestCommon.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 30; however, the containing class androidx.wear.watchface.WatchFaceImpl is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" renderer.surfaceHolder.surface.setFrameRate("
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/watchface/WatchFace.kt"
+ line="606"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/wear/watchface/watchface/samples/minimal/lint-baseline.xml b/wear/watchface/watchface/samples/minimal/lint-baseline.xml
new file mode 100644
index 0000000..68653f9
--- /dev/null
+++ b/wear/watchface/watchface/samples/minimal/lint-baseline.xml
@@ -0,0 +1,213 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/complication_config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/config_layout.xml"
+ line="11"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.SwipeDismissFrameLayout`, was not found in the project or the libraries"
+ errorLine1="<androidx.wear.widget.SwipeDismissFrameLayout"
+ errorLine2="^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="2"
+ column="1"/>
+ </issue>
+
+ <issue
+ id="MissingClass"
+ message="Class referenced in the layout file, `androidx.wear.widget.WearableRecyclerView`, was not found in the project or the libraries"
+ errorLine1=" <androidx.wear.widget.WearableRecyclerView"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/layout/style_options_layout.xml"
+ line="10"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="WrongThread"
+ message="Method addTapListener must be called from the UI thread, currently inferred thread is worker thread"
+ errorLine1=" complicationSlotsManager.addTapListener("
+ errorLine2=" ^">
+ <location
+ file="src/test/java/androidx/wear/watchface/TestCommon.kt"
+ line="91"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="ClassVerificationFailure"
+ message="This call references a method added in API level 30; however, the containing class androidx.wear.watchface.WatchFaceImpl is reachable from earlier API levels and will fail run-time class verification."
+ errorLine1=" renderer.surfaceHolder.surface.setFrameRate("
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/watchface/WatchFace.kt"
+ line="606"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_days" formatted="false" msgid="3878057769320887026">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="4"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_hours" formatted="false" msgid="6016687406802669982">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="8"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_short_minutes" formatted="false" msgid="6752732458902810711">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="12"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_days" formatted="false" msgid="5109682345086392533">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="18"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_hours" formatted="false" msgid="3172220157267000186">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="22"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr-rCA/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+ <issue
+ id="MissingQuantity"
+ message="For locale "fr" (French) the following quantities should also be defined: `many`"
+ errorLine1=" <plurals name="time_difference_words_minutes" formatted="false" msgid="529404827937478243">"
+ errorLine2=" ^">
+ <location
+ file="src/main/res/values-fr/complication_strings.xml"
+ line="26"
+ column="5"/>
+ </issue>
+
+</issues>
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
index 5e4e80a9..e2c5865 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/Renderer.kt
@@ -296,8 +296,12 @@
@UiThread
internal abstract fun dumpInternal(writer: IndentingPrintWriter)
- /** Called when adb shell dumpsys is invoked for the WatchFaceService. */
- public abstract fun dump(writer: PrintWriter)
+ /**
+ * Called when adb shell dumpsys is invoked for the WatchFaceService, allowing the renderer to
+ * optionally record state for debugging purposes.
+ */
+ @UiThread
+ public abstract fun onDump(writer: PrintWriter)
/**
* Perform UiThread specific initialization. Will be called once during initialization before
@@ -470,11 +474,11 @@
)
writer.println("shouldAnimate=${shouldAnimate()}")
renderParameters.dump(writer)
- dump(writer.writer)
+ onDump(writer.writer)
writer.decreaseIndent()
}
- override fun dump(writer: PrintWriter) {}
+ override fun onDump(writer: PrintWriter) {}
}
/**
@@ -1047,10 +1051,10 @@
)
writer.println("shouldAnimate=${shouldAnimate()}")
renderParameters.dump(writer)
- dump(writer.writer)
+ onDump(writer.writer)
writer.decreaseIndent()
}
- override fun dump(writer: PrintWriter) {}
+ override fun onDump(writer: PrintWriter) {}
}
}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
index d503ae6..ee44604 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFace.kt
@@ -260,10 +260,10 @@
public fun getSystemTimeZoneId(): ZoneId
}
- /** Listens for taps on the watchface which didn't land on [ComplicationSlot]s. */
+ /** Listens for taps on the watchface. */
public interface TapListener {
/**
- * Called whenever the user taps on the watchface but doesn't hit a [ComplicationSlot].
+ * Called whenever the user taps on the watchface.
*
* The watch face receives three different types of touch events:
* - [TapType.DOWN] when the user puts the finger down on the touchscreen
@@ -283,11 +283,16 @@
* If the watch face receives a [TapType.CANCEL] event, it should not trigger any action, as
* the system is already processing the gesture.
*
- * @param tapType the type of touch event sent to the watch face
- * @param tapEvent the received [TapEvent]
+ * @param tapType The type of touch event sent to the watch face
+ * @param tapEvent The received [TapEvent]
+ * @param complicationSlot The [ComplicationSlot] tapped if any or `null` otherwise
*/
@UiThread
- public fun onTapEvent(@TapType tapType: Int, tapEvent: TapEvent)
+ public fun onTapEvent(
+ @TapType tapType: Int,
+ tapEvent: TapEvent,
+ complicationSlot: ComplicationSlot?
+ )
}
/**
@@ -369,8 +374,8 @@
}
/**
- * Sets an optional [TapListener] which if not `null` gets called on the ui thread whenever
- * the user taps on the watchface but doesn't hit a [ComplicationSlot].
+ * Sets an optional [TapListener] which if not `null` gets called on the ui thread whenever the
+ * user taps on the watchface.
*/
@SuppressWarnings("ExecutorRegistration")
public fun setTapListener(tapListener: TapListener?): WatchFace = apply {
@@ -898,10 +903,9 @@
internal fun onTapCommand(@TapType tapType: Int, tapEvent: TapEvent) {
val tappedComplication =
complicationSlotsManager.getComplicationSlotAt(tapEvent.xPos, tapEvent.yPos)
+ tapListener?.onTapEvent(tapType, tapEvent, tappedComplication)
if (tappedComplication == null) {
- // The event does not belong to any of the complicationSlots, pass to the listener.
lastTappedComplicationId = null
- tapListener?.onTapEvent(tapType, tapEvent)
return
}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index 16fe806..3af5a79 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -252,10 +252,9 @@
): ComplicationSlotsManager = ComplicationSlotsManager(emptyList(), currentUserStyleRepository)
/**
- * Override this factory method to create your [WatchFace]. This method will be called by the
- * library on the UiThread. If possible any expensive initialization should be done on a
- * background thread to avoid blocking the UiThread. This will be called from a background
- * thread but the [WatchFace] and its [Renderer] should be accessed exclusively from the
+ * Override this factory method to create your WatchFaceImpl. This method will be called by the
+ * library on a background thread, if possible any expensive initialization should be done
+ * asynchronously. The [WatchFace] and its [Renderer] should be accessed exclusively from the
* UiThread afterwards. There is a memory barrier between construction and rendering so no
* special threading primitives are required.
*
@@ -701,6 +700,7 @@
internal var allowWatchfaceToAnimate = allowWatchFaceToAnimate()
internal var destroyed = false
+ internal var surfaceDestroyed = false
internal lateinit var ambientUpdateWakelock: PowerManager.WakeLock
@@ -929,11 +929,10 @@
}
/** This can be called on any thread. */
- internal fun addWatchfaceReadyListener(listener: IWatchfaceReadyListener) {
- uiThreadCoroutineScope.launch {
- deferredWatchFaceImpl.await()
- listener.onWatchfaceReady()
- }
+ @UiThread
+ internal suspend fun addWatchfaceReadyListener(listener: IWatchfaceReadyListener) {
+ deferredWatchFaceImpl.await()
+ listener.onWatchfaceReady()
}
@UiThread
@@ -1096,6 +1095,10 @@
super.onDestroy()
}
+ override fun onSurfaceDestroyed(holder: SurfaceHolder) {
+ surfaceDestroyed = true
+ }
+
override fun onCommand(
action: String?,
x: Int,
@@ -1495,7 +1498,9 @@
)
// Perform UI thread render init.
- watchFaceImpl.renderer.uiThreadInitInternal(uiThreadCoroutineScope)
+ if (!surfaceDestroyed) {
+ watchFaceImpl.renderer.uiThreadInitInternal(uiThreadCoroutineScope)
+ }
// Make sure no UI thread rendering (a consequence of completing
// deferredWatchFaceImpl) occurs before initStyleAndComplications has
@@ -1519,7 +1524,9 @@
// to draw this expedited first frame.
if (!watchState.isHeadless && allowWatchFaceToAnimate()) {
TraceEvent("WatchFace.drawFirstFrame").use {
- watchFaceImpl.onDraw()
+ if (!surfaceDestroyed) {
+ watchFaceImpl.onDraw()
+ }
}
}
}
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
index a8447bb5..362edee 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/control/InteractiveWatchFaceImpl.kt
@@ -38,6 +38,7 @@
internal var engine: WatchFaceService.EngineWrapper?,
internal var instanceId: String
) : IInteractiveWatchFace.Stub() {
+ private val uiThreadCoroutineScope = engine!!.uiThreadCoroutineScope
private companion object {
const val TAG = "InteractiveWatchFaceImpl"
@@ -51,10 +52,10 @@
): R = TraceEvent(traceName).use {
runBlocking {
try {
- val watchFaceImpl = engine!!.deferredWatchFaceImpl.await()
- withContext(engine!!.uiThreadCoroutineScope.coroutineContext) {
- task(watchFaceImpl)
- }
+ val engineCopy = engine
+ require(engineCopy != null) { "Task $traceName posted after close()" }
+ val watchFaceImpl = engineCopy.deferredWatchFaceImpl.await()
+ withContext(uiThreadCoroutineScope.coroutineContext) { task(watchFaceImpl) }
} catch (e: Exception) {
Log.e(TAG, "Operation failed", e)
throw e
@@ -94,22 +95,22 @@
"InteractiveWatchFaceImpl.getPreviewReferenceTimeMillis"
) { watchFaceImpl -> watchFaceImpl.previewReferenceInstant.toEpochMilli() }
- override fun setWatchUiState(watchUiState: WatchUiState) =
+ override fun setWatchUiState(watchUiState: WatchUiState): Unit =
awaitDeferredWatchFaceImplThenRunOnUiThreadBlocking(
"InteractiveWatchFaceImpl.setWatchUiState"
- ) { engine!!.setWatchUiState(watchUiState) }
+ ) { engine?.setWatchUiState(watchUiState) }
override fun getInstanceId(): String = instanceId
override fun ambientTickUpdate() {
- engine!!.uiThreadCoroutineScope.runBlockingWithTracing(
+ uiThreadCoroutineScope.runBlockingWithTracing(
"InteractiveWatchFaceImpl.ambientTickUpdate"
- ) { engine!!.ambientTickUpdate() }
+ ) { engine?.ambientTickUpdate() }
}
override fun release(): Unit = TraceEvent("InteractiveWatchFaceImpl.release").use {
- engine?.let {
- it.uiThreadCoroutineScope.launch {
+ uiThreadCoroutineScope.launch {
+ engine?.let {
try {
it.deferredWatchFaceImpl.await()
} catch (e: Exception) {
@@ -123,9 +124,9 @@
override fun updateComplicationData(
complicationDatumWireFormats: MutableList<IdAndComplicationDataWireFormat>
- ) = engine!!.uiThreadCoroutineScope.runBlockingWithTracing(
+ ): Unit = uiThreadCoroutineScope.runBlockingWithTracing(
"InteractiveWatchFaceImpl.updateComplicationData"
- ) { engine!!.setComplicationDataList(complicationDatumWireFormats) }
+ ) { engine?.setComplicationDataList(complicationDatumWireFormats) }
override fun updateWatchfaceInstance(
newInstanceId: String,
@@ -135,7 +136,7 @@
* This is blocking to ensure ordering with respect to any subsequent [getInstanceId] and
* [getPreviewReferenceTimeMillis] calls.
*/
- engine!!.uiThreadCoroutineScope.runBlockingWithTracing(
+ uiThreadCoroutineScope.runBlockingWithTracing(
"InteractiveWatchFaceImpl.updateWatchfaceInstance"
) {
if (instanceId != newInstanceId) {
@@ -163,7 +164,9 @@
}
override fun addWatchfaceReadyListener(listener: IWatchfaceReadyListener) {
- engine!!.addWatchfaceReadyListener(listener)
+ uiThreadCoroutineScope.launch {
+ engine?.addWatchfaceReadyListener(listener)
+ }
}
fun onDestroy() {
diff --git a/wear/watchface/watchface/src/main/res/values-af/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-af/watchface_strings.xml
index 799d162..4673e14 100644
--- a/wear/watchface/watchface/src/main/res/values-af/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-af/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Stel horlosieskermverwikkelinge op"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Stel horlosieskerminstellings op"</string>
- <string name="style_config" msgid="2987895585951859981">"Stel horlosieskermstyle op"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Geen"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Agtergrondprent"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Style"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Stel horlosieskermverwikkelinge op"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Stel horlosieskerminstellings op"</string>
+ <string name="style_config" msgid="7270818527618953542">"Stel horlosieskermstyle op"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Geen"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Agtergrondprent"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Style"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-am/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-am/watchface_strings.xml
index 595404e..feb8621 100644
--- a/wear/watchface/watchface/src/main/res/values-am/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-am/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"የሰዓት መልክ ተጨማሪ ባህሪዎችን ያዋቅሩ"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"የሰዓት መልክ ቅንብሮችን ያዋቅሩ"</string>
- <string name="style_config" msgid="2987895585951859981">"የሰዓት መልክ ቅጦችን ያዋቅሩ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ምንም"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ውሂብ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"የዳራ ምስል"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ቅጦች"</string>
+ <string name="complication_config" msgid="3090406830927670356">"የሰዓት መልክ ተጨማሪ ባህሪዎችን ያዋቅሩ"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"የሰዓት መልክ ቅንብሮችን ያዋቅሩ"</string>
+ <string name="style_config" msgid="7270818527618953542">"የሰዓት መልክ ቅጦችን ያዋቅሩ"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ምንም"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ውሂብ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"የዳራ ምስል"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ቅጦች"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ar/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ar/watchface_strings.xml
index 81c97bc..3e555eb 100644
--- a/wear/watchface/watchface/src/main/res/values-ar/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ar/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"إعداد إضافات خلفية شاشة الساعة"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ضبط إعدادات خلفية شاشة الساعة"</string>
- <string name="style_config" msgid="2987895585951859981">"إعداد أنماط شاشة الساعة"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"بلا خلفية"</string>
- <string name="settings_complications" msgid="7688669266180209514">"البيانات"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"صورة الخلفية"</string>
- <string name="settings_styles" msgid="5609438460443634575">"الأنماط"</string>
+ <string name="complication_config" msgid="3090406830927670356">"إعداد إضافات خلفية شاشة الساعة"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ضبط إعدادات خلفية شاشة الساعة"</string>
+ <string name="style_config" msgid="7270818527618953542">"إعداد أنماط شاشة الساعة"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"بدون خلفية"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"البيانات"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"صورة الخلفية"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"الأنماط"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-as/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-as/watchface_strings.xml
index d6fe073..b4da968 100644
--- a/wear/watchface/watchface/src/main/res/values-as/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-as/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"watchfaceৰ বিস্তাৰিত সুবিধাসমূহ কনফিগাৰ কৰক"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"watchfaceৰ ছেটিং কনফিগাৰ কৰক"</string>
- <string name="style_config" msgid="2987895585951859981">"watchfaceৰ শৈলীসমূহ কনফিগাৰ কৰক"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"নাই"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ডেটা"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"নেপথ্যৰ প্ৰতিচ্ছবি"</string>
- <string name="settings_styles" msgid="5609438460443634575">"শৈলীসমূহ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"watchfaceৰ বিস্তাৰিত সুবিধাসমূহ কনফিগাৰ কৰক"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"watchfaceৰ ছেটিং কনফিগাৰ কৰক"</string>
+ <string name="style_config" msgid="7270818527618953542">"watchfaceৰ শৈলীসমূহ কনফিগাৰ কৰক"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"নাই"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ডেটা"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"নেপথ্যৰ প্ৰতিচ্ছবি"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"শৈলী"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-az/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-az/watchface_strings.xml
index 1167043..16ffb43 100644
--- a/wear/watchface/watchface/src/main/res/values-az/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-az/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Siferblat Komplikasiyalarını konfiqurasiya edin"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Siferblat Ayarlarını konfiqurasiya edin"</string>
- <string name="style_config" msgid="2987895585951859981">"Siferblat Üslublarını konfiqurasiya edin"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Yoxdur"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Arxa fon şəkli"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Üslublar"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Siferblat Komplikasiyalarını konfiqurasiya edin"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Siferblat Ayarlarını konfiqurasiya edin"</string>
+ <string name="style_config" msgid="7270818527618953542">"Siferblat Üslublarını konfiqurasiya edin"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Heç bir"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Arxa fon şəkli"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Üslublar"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-b+sr+Latn/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-b+sr+Latn/watchface_strings.xml
index 78276f6..8d2c418 100644
--- a/wear/watchface/watchface/src/main/res/values-b+sr+Latn/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-b+sr+Latn/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurišite pokazatelje na brojčaniku"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurišite podešavanja brojčanika"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurišite stilove brojčanika"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nema"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Podaci"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Slika u pozadini"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stilovi"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurišite pokazatelje na brojčaniku"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurišite podešavanja brojčanika"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurišite stilove brojčanika"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ništa"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Podaci"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Slika u pozadini"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stilovi"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-be/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-be/watchface_strings.xml
index 89d64d1..4abcee6 100644
--- a/wear/watchface/watchface/src/main/res/values-be/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-be/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Наладзіць ускладненне цыферблата"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Наладзіць параметры цыферблата"</string>
- <string name="style_config" msgid="2987895585951859981">"Наладзіць стылі цыферблата"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Няма"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Даныя"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Фонавы відарыс"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стылі"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Наладзіць ускладненне цыферблата"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Наладзіць параметры цыферблата"</string>
+ <string name="style_config" msgid="7270818527618953542">"Наладзіць стылі цыферблата"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Няма"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Даныя"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Фонавы відарыс"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стылі"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-bg/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-bg/watchface_strings.xml
index fff6399..28fc71e 100644
--- a/wear/watchface/watchface/src/main/res/values-bg/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-bg/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Конфигуриране на допълненията на циферблата"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Конфигуриране на настройките на циферблата"</string>
- <string name="style_config" msgid="2987895585951859981">"Конфигуриране на стиловете на циферблата"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Няма"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Данни"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Фоново изображение"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стилове"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Конфигуриране на допълненията на циферблата"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Конфигуриране на настройките на циферблата"</string>
+ <string name="style_config" msgid="7270818527618953542">"Конфигуриране на стиловете на циферблата"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Няма"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Данни"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Фоново изображение"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стилове"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-bn/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-bn/watchface_strings.xml
index 649b897..7a9403a 100644
--- a/wear/watchface/watchface/src/main/res/values-bn/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-bn/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"\'ওয়াচফেস কমপ্লিকেশন\' কনফিগার করুন"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"\'ওয়াচফেস সেটিংস\' কনফিগার করুন"</string>
- <string name="style_config" msgid="2987895585951859981">"\'ওয়াচফেস স্টাইল\' কনফিগার করুন"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"কোনওটিই নয়"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ডেটা"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ব্যাকগ্রাউন্ডের ছবি"</string>
- <string name="settings_styles" msgid="5609438460443634575">"স্টাইল"</string>
+ <string name="complication_config" msgid="3090406830927670356">"\'ওয়াচফেস কমপ্লিকেশন\' কনফিগার করুন"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"\'ওয়াচফেস সেটিংস\' কনফিগার করুন"</string>
+ <string name="style_config" msgid="7270818527618953542">"\'ওয়াচফেস স্টাইল\' কনফিগার করুন"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"কোনওটিই নয়"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ডেটা"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ব্যাকগ্রাউন্ড ছবি"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"স্টাইল"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-bs/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-bs/watchface_strings.xml
index 97e113f..e418fe1 100644
--- a/wear/watchface/watchface/src/main/res/values-bs/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-bs/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfiguracija spletova watch facea"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfiguracija postavki watch facea"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfiguracija stilova watch facea"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ništa"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Podaci"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Slika pozadine"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stilovi"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfiguracija spletova brojčanika"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfiguracija postavki brojčanika"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfiguracija stilova brojčanika"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ništa"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Podaci"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Slika pozadine"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stilovi"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ca/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ca/watchface_strings.xml
index 43cafaa..d31dc23 100644
--- a/wear/watchface/watchface/src/main/res/values-ca/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ca/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configura les funcions especials de l\'esfera del rellotge"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Ajusta la configuració de l\'esfera del rellotge"</string>
- <string name="style_config" msgid="2987895585951859981">"Configura els estils de l\'esfera del rellotge"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Cap"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dades"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imatge de fons"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estils"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configura les complicacions de l\'esfera del rellotge"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Ajusta la configuració de l\'esfera del rellotge"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configura els estils de l\'esfera del rellotge"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Cap"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dades"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imatge de fons"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estils"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-cs/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-cs/watchface_strings.xml
index 36ae905..5ab7ae2 100644
--- a/wear/watchface/watchface/src/main/res/values-cs/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-cs/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurace komplikací na ciferníku"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurace nastavení ciferníku"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurace stylů ciferníku"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ne"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Obrázek na pozadí"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styly"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurace komplikací na ciferníku"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurace nastavení ciferníku"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurace stylů ciferníku"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Žádný"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Obrázek na pozadí"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styly"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-da/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-da/watchface_strings.xml
index 4beecb4..0491ca3 100644
--- a/wear/watchface/watchface/src/main/res/values-da/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-da/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurer widgets på urskiven"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurer indstillinger for urskiven"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurer urskivens udseende"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ingen"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Baggrundsbillede"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Udseende"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurer widgets på urskiven"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurer indstillinger for urskiven"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurer urskivens udseende"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ingen"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Baggrundsbillede"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stilarter"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-de/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-de/watchface_strings.xml
index 724f0c2..2b93808 100644
--- a/wear/watchface/watchface/src/main/res/values-de/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-de/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Zifferblatt-Zusatzfunktionen konfigurieren"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Zifferblatt-Einstellungen konfigurieren"</string>
- <string name="style_config" msgid="2987895585951859981">"Zifferblatt-Stile konfigurieren"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Keine"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Daten"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Hintergrundbild"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stile"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Zifferblatt-Zusatzfunktionen konfigurieren"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Zifferblatt-Einstellungen konfigurieren"</string>
+ <string name="style_config" msgid="7270818527618953542">"Zifferblatt-Stile konfigurieren"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Keine"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Daten"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Hintergrundbild"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stile"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-el/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-el/watchface_strings.xml
index 4ad59f4..64f28de 100644
--- a/wear/watchface/watchface/src/main/res/values-el/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-el/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Διαμόρφωση ενδείξεων πρόσοψης ρολογιού"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Διαμόρφωση ρυθμίσεων πρόσοψης ρολογιού"</string>
- <string name="style_config" msgid="2987895585951859981">"Διαμόρφωση στιλ πρόσοψης ρολογιού"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Καμία"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Δεδομένα"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Εικόνα φόντου"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Στιλ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Διαμόρφωση ενδείξεων πρόσοψης ρολογιού"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Διαμόρφωση ρυθμίσεων πρόσοψης ρολογιού"</string>
+ <string name="style_config" msgid="7270818527618953542">"Διαμόρφωση στιλ πρόσοψης ρολογιού"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Καμία"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Δεδομένα"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Εικόνα φόντου"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Στιλ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-en-rAU/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-en-rAU/watchface_strings.xml
index 0f72e2d..fb00cf0 100644
--- a/wear/watchface/watchface/src/main/res/values-en-rAU/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-en-rAU/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configure watch face complications"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configure watch face settings"</string>
- <string name="style_config" msgid="2987895585951859981">"Configure watch face styles"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"None"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Background image"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configure watch face complications"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configure watch face settings"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configure watch face styles"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"None"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Background image"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-en-rCA/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-en-rCA/watchface_strings.xml
index 0f72e2d..fb00cf0 100644
--- a/wear/watchface/watchface/src/main/res/values-en-rCA/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-en-rCA/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configure watch face complications"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configure watch face settings"</string>
- <string name="style_config" msgid="2987895585951859981">"Configure watch face styles"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"None"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Background image"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configure watch face complications"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configure watch face settings"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configure watch face styles"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"None"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Background image"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-en-rGB/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-en-rGB/watchface_strings.xml
index 0f72e2d..fb00cf0 100644
--- a/wear/watchface/watchface/src/main/res/values-en-rGB/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-en-rGB/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configure watch face complications"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configure watch face settings"</string>
- <string name="style_config" msgid="2987895585951859981">"Configure watch face styles"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"None"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Background image"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configure watch face complications"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configure watch face settings"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configure watch face styles"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"None"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Background image"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-en-rIN/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-en-rIN/watchface_strings.xml
index 0f72e2d..fb00cf0 100644
--- a/wear/watchface/watchface/src/main/res/values-en-rIN/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-en-rIN/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configure watch face complications"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configure watch face settings"</string>
- <string name="style_config" msgid="2987895585951859981">"Configure watch face styles"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"None"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Background image"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configure watch face complications"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configure watch face settings"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configure watch face styles"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"None"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Background image"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-en-rXC/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-en-rXC/watchface_strings.xml
index f671fd5..e95ec81 100644
--- a/wear/watchface/watchface/src/main/res/values-en-rXC/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-en-rXC/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configure Watchface Complications"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configure Watchface Settings"</string>
- <string name="style_config" msgid="2987895585951859981">"Configure Watchface Styles"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"None"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Background image"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configure Watchface Complications"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configure Watchface Settings"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configure Watchface Styles"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"None"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Background image"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-es-rUS/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-es-rUS/watchface_strings.xml
index fcabc61..a411ed0 100644
--- a/wear/watchface/watchface/src/main/res/values-es-rUS/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-es-rUS/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurar complicaciones de cara de reloj"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configurar cara de reloj"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurar estilos de caras de reloj"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ninguno"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Datos"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imagen de fondo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estilos"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurar complicaciones de cara de reloj"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configurar cara de reloj"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurar estilos de caras de reloj"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ninguno"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Datos"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imagen de fondo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estilos"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-es/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-es/watchface_strings.xml
index 53fdb59..045b79d 100644
--- a/wear/watchface/watchface/src/main/res/values-es/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-es/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurar complicaciones de esfera de reloj"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configurar ajustes de esfera de reloj"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurar estilos de esfera de reloj"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ninguna"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Datos"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imagen de fondo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estilos"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurar complicaciones de esfera de reloj"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configurar ajustes de esfera de reloj"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurar estilos de esfera de reloj"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ninguna"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Datos"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imagen de fondo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estilos"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-et/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-et/watchface_strings.xml
index ba7e6ba..e0de0f4 100644
--- a/wear/watchface/watchface/src/main/res/values-et/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-et/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Kelladisaini funktsioonide seadistamine"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Kelladisaini seadete seadistamine"</string>
- <string name="style_config" msgid="2987895585951859981">"Kelladisaini stiilide seadistamine"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Puudub"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Andmed"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Taustapilt"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stiilid"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Kelladisaini funktsioonide seadistamine"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Kelladisaini seadete määramine"</string>
+ <string name="style_config" msgid="7270818527618953542">"Kelladisaini stiilide seadistamine"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Pole"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Andmed"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Taustapilt"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stiilid"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-eu/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-eu/watchface_strings.xml
index df20b30..377bae6 100644
--- a/wear/watchface/watchface/src/main/res/values-eu/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-eu/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfiguratu erloju-esferaren ezaugarri bereziak"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfiguratu erloju-esferaren ezarpenak"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfiguratu erloju-esferaren estiloak"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Bat ere ez"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Datuak"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Atzeko planoko irudia"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estiloak"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfiguratu erloju-esferaren ezaugarri bereziak"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfiguratu erloju-esferaren ezarpenak"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfiguratu erloju-esferaren estiloak"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Bat ere ez"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Datuak"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Atzeko planoko irudia"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estiloak"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-fa/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-fa/watchface_strings.xml
index 4e31daf..a6c6d01 100644
--- a/wear/watchface/watchface/src/main/res/values-fa/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-fa/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"پیکربندی چیدمانهای صفحه ساعت"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"پیکربندی تنظیمات صفحه ساعت"</string>
- <string name="style_config" msgid="2987895585951859981">"پیکربندی سبکهای صفحه ساعت"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"هیچکدام"</string>
- <string name="settings_complications" msgid="7688669266180209514">"دادهها"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"تصویر پسزمینه"</string>
- <string name="settings_styles" msgid="5609438460443634575">"سبکها"</string>
+ <string name="complication_config" msgid="3090406830927670356">"پیکربندی چیدمانهای صفحه ساعت"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"پیکربندی تنظیمات صفحه ساعت"</string>
+ <string name="style_config" msgid="7270818527618953542">"پیکربندی سبکهای صفحه ساعت"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"خالی"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"داده"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"تصویر پسزمینه"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"سبکها"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-fi/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-fi/watchface_strings.xml
index 2ed83e1..e783cf0 100644
--- a/wear/watchface/watchface/src/main/res/values-fi/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-fi/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Määritä kellotaulun lisäominaisuudet"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Määritä kellotaulun asetukset"</string>
- <string name="style_config" msgid="2987895585951859981">"Määritä kellotaulun tyylit"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ei mitään"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Taustakuva"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Tyylit"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Määritä kellotaulun lisäominaisuudet"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Määritä kellotaulun asetukset"</string>
+ <string name="style_config" msgid="7270818527618953542">"Määritä kellotaulun tyylit"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"–"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Taustakuva"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Tyylit"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-fr-rCA/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-fr-rCA/watchface_strings.xml
index afbb5dd..5209036 100644
--- a/wear/watchface/watchface/src/main/res/values-fr-rCA/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-fr-rCA/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurer les complications du cadran"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configurer les paramètres du cadran"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurer les styles du cadran"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Aucune"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Données"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Image d\'arrière-plan"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurer les complications du cadran"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configurer les paramètres du cadran"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurer les styles du cadran"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Aucun"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Données"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Image d\'arrière-plan"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-fr/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-fr/watchface_strings.xml
index e2d1524..9b56f33 100644
--- a/wear/watchface/watchface/src/main/res/values-fr/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-fr/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurer les complications du cadran"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configurer les paramètres du cadran"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurer les styles du cadran"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Aucun"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Données"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Image de fond"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Styles"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurer les complications du cadran"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configurer les paramètres du cadran"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurer les styles du cadran"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Aucun"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Données"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Image de fond"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Styles"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-gl/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-gl/watchface_strings.xml
index e3c101a..e391dc1 100644
--- a/wear/watchface/watchface/src/main/res/values-gl/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-gl/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurar complicacións de esfera de reloxo"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configurar axustes de esfera de reloxo"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurar estilos de esfera de reloxo"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ningunha"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Datos"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imaxe de fondo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estilos"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurar complicacións da esfera do reloxo"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configurar axustes da esfera do reloxo"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurar estilos da esfera do reloxo"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ningún"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Datos"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imaxe de fondo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estilos"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-gu/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-gu/watchface_strings.xml
index 999c6db..f6e11ed 100644
--- a/wear/watchface/watchface/src/main/res/values-gu/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-gu/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ઘડિયાળના કૉમ્પ્લિકેશન ગોઠવો"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ઘડિયાળના સેટિંગ ગોઠવો"</string>
- <string name="style_config" msgid="2987895585951859981">"ઘડિયાળની શૈલીઓ ગોઠવો"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"એકપણ નહીં"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ડેટા"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"બૅકગ્રાઉન્ડની છબી"</string>
- <string name="settings_styles" msgid="5609438460443634575">"શૈલીઓ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"વૉચફેસના કૉમ્પ્લિકેશન ગોઠવો"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"વૉચફેસના સેટિંગ ગોઠવો"</string>
+ <string name="style_config" msgid="7270818527618953542">"વૉચફેસની શૈલીઓ ગોઠવો"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"એકપણ નહીં"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ડેટા"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"બૅકગ્રાઉન્ડની છબી"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"શૈલીઓ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-hi/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-hi/watchface_strings.xml
index 85cb49b..d5cd60ee 100644
--- a/wear/watchface/watchface/src/main/res/values-hi/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-hi/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"स्मार्ट वॉच के फ़ेस को, Android घड़ी के संकेत की सुविधा के साथ कॉन्फ़िगर करें"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"स्मार्ट वॉच के फ़ेस की सेटिंग को कॉन्फ़िगर करें"</string>
- <string name="style_config" msgid="2987895585951859981">"स्मार्ट वॉच के फ़ेस स्टाइल को कॉन्फ़िगर करें"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"कोई नहीं"</string>
- <string name="settings_complications" msgid="7688669266180209514">"डेटा"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"बैकग्राउंड की इमेज"</string>
- <string name="settings_styles" msgid="5609438460443634575">"स्टाइल"</string>
+ <string name="complication_config" msgid="3090406830927670356">"स्मार्ट वॉच के फ़ेस को, Android घड़ी के संकेत की सुविधा के साथ कॉन्फ़िगर करें"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"स्मार्ट वॉच के फ़ेस की सेटिंग कॉन्फ़िगर करें"</string>
+ <string name="style_config" msgid="7270818527618953542">"स्मार्ट वॉच के फ़ेस के स्टाइल कॉन्फ़िगर करें"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"कोई नहीं"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"डेटा"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"बैकग्राउंड की इमेज"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"स्टाइल"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-hr/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-hr/watchface_strings.xml
index 9e77b5a..176299d 100644
--- a/wear/watchface/watchface/src/main/res/values-hr/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-hr/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfiguriranje komplikacija brojčanika"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfiguriranje postavki brojčanika"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfiguriranje stilova brojčanika"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nema"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Podaci"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Pozadinska slika"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stilovi"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfiguriranje komplikacija brojčanika"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfiguriranje postavki brojčanika"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfiguriranje stilova brojčanika"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nema"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Podaci"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Pozadinska slika"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stilovi"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-hu/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-hu/watchface_strings.xml
index 33a25f2..c5f62d27 100644
--- a/wear/watchface/watchface/src/main/res/values-hu/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-hu/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Óralap-komplikációk konfigurálása"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Óralap-beállítások konfigurálása"</string>
- <string name="style_config" msgid="2987895585951859981">"Óralapstílusok konfigurálása"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nincs"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Adatok"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Háttérkép"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stílusok"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Óralap-komplikációk konfigurálása"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Óralap-beállítások konfigurálása"</string>
+ <string name="style_config" msgid="7270818527618953542">"Óralapstílusok konfigurálása"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nincs"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Adatok"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Háttérkép"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stílusok"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-hy/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-hy/watchface_strings.xml
index b3c0156..531fe5f 100644
--- a/wear/watchface/watchface/src/main/res/values-hy/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-hy/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Թվատախտակի լրացումների կարգավորում"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Թվատախտակի պարամետրերի կարգավորում"</string>
- <string name="style_config" msgid="2987895585951859981">"Թվատախտակի ոճերի կարգավորում"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Չկա"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Տվյալներ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Ֆոնային պատկեր"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Ոճեր"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Թվատախտակի լրացումների կարգավորում"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Թվատախտակի պարամետրերի կարգավորում"</string>
+ <string name="style_config" msgid="7270818527618953542">"Թվատախտակի ոճերի կարգավորում"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Չկա"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Տվյալներ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Ֆոնային պատկեր"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Ոճեր"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-in/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-in/watchface_strings.xml
index b6cb535..92f9d51 100644
--- a/wear/watchface/watchface/src/main/res/values-in/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-in/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurasi Detail Tampilan Jam"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurasi Setelan Tampilan Jam"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurasi Gaya Tampilan Jam"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Tidak ada"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Gambar latar"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Gaya"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurasi Detail Tampilan Jam"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurasi Setelan Tampilan Jam"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurasi Gaya Tampilan Jam"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Tidak ada"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Gambar latar"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Gaya"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-is/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-is/watchface_strings.xml
index 89c0ec3..2d49226 100644
--- a/wear/watchface/watchface/src/main/res/values-is/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-is/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Stilla úrskífugræjur"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Velja úrskífustillingar"</string>
- <string name="style_config" msgid="2987895585951859981">"Stilla úrskífustíla"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Engin"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Gögn"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Bakgrunnsmynd"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stílar"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Stilla úrskífugræjur"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Velja úrskífustillingar"</string>
+ <string name="style_config" msgid="7270818527618953542">"Stilla úrskífustíla"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ekkert"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Gögn"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Bakgrunnsmynd"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stílar"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-it/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-it/watchface_strings.xml
index 13e678a..ae96472 100644
--- a/wear/watchface/watchface/src/main/res/values-it/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-it/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configura le complicazioni del quadrante"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configura le impostazioni del quadrante"</string>
- <string name="style_config" msgid="2987895585951859981">"Configura gli stili del quadrante"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nessuno"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dati"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Immagine di sfondo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stili"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configura le complicazioni del quadrante"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configura le impostazioni del quadrante"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configura gli stili del quadrante"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nessuna"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dati"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Immagine di sfondo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stili"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-iw/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-iw/watchface_strings.xml
index f4a668c..b8a0c57 100644
--- a/wear/watchface/watchface/src/main/res/values-iw/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-iw/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"הגדרת תכונות נוספות בתצוגת השעון"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"קביעת הגדרות בתצוגת השעון"</string>
- <string name="style_config" msgid="2987895585951859981">"הגדרת סגנונות בתצוגת השעון"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ללא"</string>
- <string name="settings_complications" msgid="7688669266180209514">"נתונים"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"תמונת רקע"</string>
- <string name="settings_styles" msgid="5609438460443634575">"סגנונות"</string>
+ <string name="complication_config" msgid="3090406830927670356">"הגדרת תכונות נוספות בתצוגת השעון"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"קביעת הגדרות בתצוגת השעון"</string>
+ <string name="style_config" msgid="7270818527618953542">"הגדרת סגנונות בתצוגת השעון"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ללא"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"נתונים"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"תמונת רקע"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"סגנונות"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ja/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ja/watchface_strings.xml
index 34b0a79..187b23e 100644
--- a/wear/watchface/watchface/src/main/res/values-ja/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ja/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ウォッチフェイスの追加機能の設定"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ウォッチフェイスの設定の指定"</string>
- <string name="style_config" msgid="2987895585951859981">"ウォッチフェイスのスタイルの設定"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"なし"</string>
- <string name="settings_complications" msgid="7688669266180209514">"データ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"背景画像"</string>
- <string name="settings_styles" msgid="5609438460443634575">"スタイル"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ウォッチフェイスの追加機能の設定"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ウォッチフェイスの設定の指定"</string>
+ <string name="style_config" msgid="7270818527618953542">"ウォッチフェイスのスタイルの設定"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"なし"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"データ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"背景画像"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"スタイル"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ka/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ka/watchface_strings.xml
index 76d425a..d00606c4 100644
--- a/wear/watchface/watchface/src/main/res/values-ka/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ka/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ციფერბლატის გართულებების კონფიგურაცია"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ციფერბლატის პარამეტრების კონფიგურაცია"</string>
- <string name="style_config" msgid="2987895585951859981">"ციფერბლატის სტილების კონფიგურაცია"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"არცერთი"</string>
- <string name="settings_complications" msgid="7688669266180209514">"მონაცემები"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ფონური სურათი"</string>
- <string name="settings_styles" msgid="5609438460443634575">"სტილები"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ციფერბლატის გართულებების კონფიგურაცია"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ციფერბლატის პარამეტრების კონფიგურაცია"</string>
+ <string name="style_config" msgid="7270818527618953542">"ციფერბლატის სტილების კონფიგურაცია"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"არცერთი"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"მონაცემები"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ფონური სურათი"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"სტილები"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-kk/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-kk/watchface_strings.xml
index 29b5b61..df4cace 100644
--- a/wear/watchface/watchface/src/main/res/values-kk/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-kk/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Циферблат қосымша деректерін конфигурациялау"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Циферблат параметрлерін конфигурациялау"</string>
- <string name="style_config" msgid="2987895585951859981">"Циферблат стильдерін конфигурациялау"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Жоқ"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Деректер"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Фондық кескін"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стильдер"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Циферблат қосымша деректерін конфигурациялау"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Циферблат параметрлерін конфигурациялау"</string>
+ <string name="style_config" msgid="7270818527618953542">"Циферблат стильдерін конфигурациялау"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Жоқ"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Дерек"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Фондық кескін"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стильдер"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-km/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-km/watchface_strings.xml
index d07af49..3994255 100644
--- a/wear/watchface/watchface/src/main/res/values-km/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-km/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"កំណត់រចនាសម្ព័ន្ធភាពស្មុគស្មាញមុខនាឡិកា"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"កំណត់រចនាសម្ព័ន្ធការកំណត់មុខនាឡិកា"</string>
- <string name="style_config" msgid="2987895585951859981">"កំណត់រចនាសម្ព័ន្ធរចនាប័ទ្មមុខនាឡិកា"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"គ្មាន"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ទិន្នន័យ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"រូបភាពផ្ទៃខាងក្រោយ"</string>
- <string name="settings_styles" msgid="5609438460443634575">"រចនាប័ទ្ម"</string>
+ <string name="complication_config" msgid="3090406830927670356">"កំណត់រចនាសម្ព័ន្ធភាពស្មុគស្មាញនៃមុខនាឡិកា"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"កំណត់រចនាសម្ព័ន្ធការកំណត់មុខនាឡិកា"</string>
+ <string name="style_config" msgid="7270818527618953542">"កំណត់រចនាសម្ព័ន្ធរចនាប័ទ្មមុខនាឡិកា"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"គ្មាន"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ទិន្នន័យ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"រូបភាពផ្ទៃខាងក្រោយ"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"រចនាប័ទ្ម"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-kn/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-kn/watchface_strings.xml
index 04ee90d..60f865f 100644
--- a/wear/watchface/watchface/src/main/res/values-kn/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-kn/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ವಾಚ್ಫೇಸ್ ತೊಡಕುಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ವಾಚ್ಫೇಸ್ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
- <string name="style_config" msgid="2987895585951859981">"ವಾಚ್ಫೇಸ್ ಶೈಲಿಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ಯಾವುದೂ ಅಲ್ಲ"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ಡೇಟಾ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ಹಿನ್ನೆಲೆ ಚಿತ್ರ"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ಶೈಲಿಗಳು"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ಗಡಿಯಾರದ ಮುಖಭಾಗದ ತೊಡಕುಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ಗಡಿಯಾರದ ಮುಖಭಾಗದ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
+ <string name="style_config" msgid="7270818527618953542">"ಗಡಿಯಾರದ ಮುಖಭಾಗದ ಶೈಲಿಗಳನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ಯಾವುದೂ ಅಲ್ಲ"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ಡೇಟಾ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ಹಿನ್ನೆಲೆಯ ಚಿತ್ರ"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ಶೈಲಿಗಳು"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ko/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ko/watchface_strings.xml
index 7209b0e..c100608 100644
--- a/wear/watchface/watchface/src/main/res/values-ko/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ko/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"시계 화면 정보 표시 구성"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"시계 화면 설정 구성"</string>
- <string name="style_config" msgid="2987895585951859981">"시계 화면 스타일 구성"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"없음"</string>
- <string name="settings_complications" msgid="7688669266180209514">"데이터"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"배경 이미지"</string>
- <string name="settings_styles" msgid="5609438460443634575">"스타일"</string>
+ <string name="complication_config" msgid="3090406830927670356">"시계 화면 정보 표시 구성"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"시계 화면 설정 구성"</string>
+ <string name="style_config" msgid="7270818527618953542">"시계 화면 스타일 구성"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"없음"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"데이터"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"배경 이미지"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"스타일"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ky/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ky/watchface_strings.xml
index 80cf03a..617bf0e 100644
--- a/wear/watchface/watchface/src/main/res/values-ky/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ky/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Циферблаттын кошумчаларын конфигурациялоо"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Циферблаттын жөндөөлөрүн конфигурациялоо"</string>
- <string name="style_config" msgid="2987895585951859981">"Циферблаттын стилдерин конфигурациялоо"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Жок"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Маалымат"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Фондогу сүрөт"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стилдер"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Циферблаттын кошумчаларын конфигурациялоо"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Циферблаттын жөндөөлөрүн конфигурациялоо"</string>
+ <string name="style_config" msgid="7270818527618953542">"Циферблаттын стилдерин конфигурациялоо"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Жок"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Маалымат"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Фондогу сүрөт"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стилдер"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-lo/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-lo/watchface_strings.xml
index eb51002..0da109d 100644
--- a/wear/watchface/watchface/src/main/res/values-lo/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-lo/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ຕັ້ງຄ່າ Watchface Complications"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ຕັ້ງຄ່າໜ້າປັດໂມງ"</string>
- <string name="style_config" msgid="2987895585951859981">"ຕັ້ງຄ່າຮູບແບບໜ້າປັດໂມງ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ບໍ່ມີ"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ຂໍ້ມູນ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ພາບພື້ນຫຼັງ"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ຮູບແບບ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ຕັ້ງຄ່າຂໍ້ມູນແຊກຢູ່ໜ້າປັດໂມງ"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ຕັ້ງຄ່າໜ້າປັດໂມງ"</string>
+ <string name="style_config" msgid="7270818527618953542">"ຕັ້ງຄ່າຮູບແບບໜ້າປັດໂມງ"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ບໍ່ມີ"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ຂໍ້ມູນ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ພາບພື້ນຫຼັງ"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ຮູບແບບ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-lt/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-lt/watchface_strings.xml
index eae26cb..0296ff5 100644
--- a/wear/watchface/watchface/src/main/res/values-lt/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-lt/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Ciferblato funkcijų konfigūravimas"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Ciferblato nustatymų konfigūravimas"</string>
- <string name="style_config" msgid="2987895585951859981">"Ciferblato stilių konfigūravimas"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nėra"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Duomenys"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Fono vaizdas"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stiliai"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Ciferblato funkcijų konfigūravimas"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Ciferblato nustatymų konfigūravimas"</string>
+ <string name="style_config" msgid="7270818527618953542">"Ciferblato stilių konfigūravimas"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nėra"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Duomenys"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Fono vaizdas"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stiliai"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-lv/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-lv/watchface_strings.xml
index 4ce5615..169efde 100644
--- a/wear/watchface/watchface/src/main/res/values-lv/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-lv/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Pulksteņa ekrāna papildinājumu konfigurēšana"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Pulksteņa ekrāna iestatījumu konfigurēšana"</string>
- <string name="style_config" msgid="2987895585951859981">"Pulksteņa ekrāna stilu konfigurēšana"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nav"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dati"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Fona attēls"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stili"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Pulksteņa ekrāna papildinājumu konfigurēšana"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Pulksteņa ekrāna iestatījumu konfigurēšana"</string>
+ <string name="style_config" msgid="7270818527618953542">"Pulksteņa ekrāna stilu konfigurēšana"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nav"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dati"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Fona attēls"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stili"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-mk/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-mk/watchface_strings.xml
index 3f53bda..c17366f 100644
--- a/wear/watchface/watchface/src/main/res/values-mk/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-mk/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Конфигурирајте ги компликациите на маската за часовникот"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Конфигурирајте ги поставките на маската за часовникот"</string>
- <string name="style_config" msgid="2987895585951859981">"Конфигурирајте ги стиловите на маската за часовникот"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Нема"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Податоци"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Слика во заднина"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стилови"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Конфигурирајте ги компликациите за екранот на часовникот"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Конфигурирајте ги поставките за екранот на часовникот"</string>
+ <string name="style_config" msgid="7270818527618953542">"Конфигурирајте ги стиловите за екранот на часовникот"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Нема"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Податоци"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Слика во заднина"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стилови"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ml/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ml/watchface_strings.xml
index 3e59d19..40f6fc1 100644
--- a/wear/watchface/watchface/src/main/res/values-ml/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ml/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"വാച്ച് ഫെയ്സ് സങ്കീർണ്ണത കോൺഫിഗർ ചെയ്യുക"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"വാച്ച് ഫെയ്സ് ക്രമീകരണം കോൺഫിഗർ ചെയ്യുക"</string>
- <string name="style_config" msgid="2987895585951859981">"വാച്ച് ഫെയ്സ് സ്റ്റൈലുകൾ കോൺഫിഗർ ചെയ്യുക"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ഒന്നുമില്ല"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ഡാറ്റ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"പശ്ചാത്തല ചിത്രം"</string>
- <string name="settings_styles" msgid="5609438460443634575">"സ്റ്റൈലുകൾ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"വാച്ച് ഫെയ്സ് സങ്കീർണ്ണതകൾ കോൺഫിഗർ ചെയ്യുക"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"വാച്ച് ഫെയ്സ് ക്രമീകരണം കോൺഫിഗർ ചെയ്യുക"</string>
+ <string name="style_config" msgid="7270818527618953542">"വാച്ച് ഫെയ്സ് സ്റ്റൈലുകൾ കോൺഫിഗർ ചെയ്യുക"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ഒന്നുമില്ല"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ഡാറ്റ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"പശ്ചാത്തല ചിത്രം"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"സ്റ്റൈലുകൾ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-mn/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-mn/watchface_strings.xml
index 9e98b22..84d8089 100644
--- a/wear/watchface/watchface/src/main/res/values-mn/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-mn/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Цагийн нүүрний хүндрэлийг тохируулах"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Цагийн нүүрний тохиргоог тохируулах"</string>
- <string name="style_config" msgid="2987895585951859981">"Цагийн нүүрний хэв маягийг тохируулах"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Байхгүй"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Өгөгдөл"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Дэвсгэр зураг"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Хэв маяг"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Цагийн нүүрний хүндрэлийг тохируулах"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Цагийн нүүрийн тохиргоог тохируулах"</string>
+ <string name="style_config" msgid="7270818527618953542">"Цагийн нүүрийн загварыг тохируулах"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Хоосон"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Өгөгдөл"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Дэвсгэр зураг"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Загвар"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-mr/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-mr/watchface_strings.xml
index 6c70c4a..0138cc4 100644
--- a/wear/watchface/watchface/src/main/res/values-mr/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-mr/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"वॉचफेसवरील अडथळे कॉंफिगर करणे"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"वॉचफेस सेटिंग्ज कॉंफिगर करणे"</string>
- <string name="style_config" msgid="2987895585951859981">"वॉचफेसच्या शैली कॉंफिगर करणे"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"कोणतीही नाही"</string>
- <string name="settings_complications" msgid="7688669266180209514">"डेटा"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"बॅकग्राउंड इमेज"</string>
- <string name="settings_styles" msgid="5609438460443634575">"शैली"</string>
+ <string name="complication_config" msgid="3090406830927670356">"वॉचफेस वरील अडथळे कॉंफिगर करणे"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"वॉचफेस सेटिंग्ज कॉंफिगर करणे"</string>
+ <string name="style_config" msgid="7270818527618953542">"वॉचफेस च्या शैली कॉंफिगर करणे"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"काहीही नाही"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"डेटा"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"बॅकग्राउंड इमेज"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"शैली"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ms/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ms/watchface_strings.xml
index c25ada9..916d983 100644
--- a/wear/watchface/watchface/src/main/res/values-ms/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ms/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurasikan Kerumitan Muka Jam"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurasikan Tetapan Muka Jam"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurasikan Gaya Muka Jam"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Tiada"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imej latar belakang"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Gaya"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurasikan Kerumitan Muka Jam"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurasikan Tetapan Muka Jam"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurasikan Gaya Muka Jam"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Tiada"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imej latar belakang"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Gaya"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-my/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-my/watchface_strings.xml
index 39b5bbd..2c563f8 100644
--- a/wear/watchface/watchface/src/main/res/values-my/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-my/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"နာရီဒိုင်ခွက် ဝန်ဆောင်မှုများကို စီစဉ်သတ်မှတ်ပါ"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"\'နာရီဒိုင်ခွက် ဆက်တင်များ\' ကို စီစဉ်သတ်မှတ်ပါ"</string>
- <string name="style_config" msgid="2987895585951859981">"\'နာရီဒိုင်ခွက် ပုံစံများ\' ကို စီစဉ်သတ်မှတ်ပါ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"မရှိ"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ဒေတာ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"နောက်ခံပုံရိပ်"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ပုံစံများ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"နာရီဒိုင်ခွက်ဝန်ဆောင်မှုများ စီစဉ်သတ်မှတ်ခြင်း"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"နာရီဒိုင်ခွက်ဆက်တင်များ စီစဉ်သတ်မှတ်ခြင်း"</string>
+ <string name="style_config" msgid="7270818527618953542">"နာရီဒိုင်ခွက်ပုံစံများ စီစဉ်သတ်မှတ်ခြင်း"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"မရှိ"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ဒေတာ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"နောက်ခံပုံရိပ်"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ပုံစံများ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-nb/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-nb/watchface_strings.xml
index 6ef030c..58b882d 100644
--- a/wear/watchface/watchface/src/main/res/values-nb/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-nb/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurer tilleggsfunksjoner i klokkebakgrunnen"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurer innstillinger for klokkebakgrunnen"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurer stiler for klokkebakgrunnen"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ingen"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Bakgrunnsbilde"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stiler"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurer tilleggsfunksjoner i klokkebakgrunnen"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurer innstillinger for klokkebakgrunnen"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurer stiler for klokkebakgrunnen"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ingen"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Bakgrunnsbilde"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stiler"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ne/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ne/watchface_strings.xml
index 1df803a..e852395 100644
--- a/wear/watchface/watchface/src/main/res/values-ne/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ne/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"वाचफेसमा देखिने जानकारी कन्फिगर गर्नुहोस्"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"वाचफेसका सेटिङ कन्फिगर गर्नुहोस्"</string>
- <string name="style_config" msgid="2987895585951859981">"वाचफेसका शैलीहरू कन्फिगर गर्नुहोस्"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"कुनै पनि होइन"</string>
- <string name="settings_complications" msgid="7688669266180209514">"डेटा"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ब्याकग्राउन्ड फोटो"</string>
- <string name="settings_styles" msgid="5609438460443634575">"शैलीहरू"</string>
+ <string name="complication_config" msgid="3090406830927670356">"वाचफेसमा देखिने थप विशेषताहरू कन्फिगर गर्नुहोस्"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"वाचफेसका सेटिङ कन्फिगर गर्नुहोस्"</string>
+ <string name="style_config" msgid="7270818527618953542">"वाचफेसका शैलीहरू कन्फिगर गर्नुहोस्"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"कुनै पनि होइन"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"डेटा"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ब्याकग्राउन्ड फोटो"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"शैलीहरू"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-nl/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-nl/watchface_strings.xml
index a6b6a0e..f494706 100644
--- a/wear/watchface/watchface/src/main/res/values-nl/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-nl/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Wijzerplaatcomplicaties instellen"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Wijzerplaatinstellingen instellen"</string>
- <string name="style_config" msgid="2987895585951859981">"Wijzerplaatstijlen instellen"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Geen"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Gegevens"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Achtergrondafbeelding"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stijlen"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Wijzerplaatcomplicaties instellen"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Wijzerplaatinstellingen instellen"</string>
+ <string name="style_config" msgid="7270818527618953542">"Wijzerplaatstijlen instellen"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Geen"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Gegevens"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Achtergrondafbeelding"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stijlen"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-or/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-or/watchface_strings.xml
index cc60bd0..911b92b 100644
--- a/wear/watchface/watchface/src/main/res/values-or/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-or/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ୱାଚଫେସ୍ କମ୍ପ୍ଲିକେସନ୍ସ କନଫିଗର୍ କରନ୍ତୁ"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ୱାଚଫେସ୍ ସେଟିଂସ୍ କନଫିଗର୍ କରନ୍ତୁ"</string>
- <string name="style_config" msgid="2987895585951859981">"ୱାଚଫେସ୍ ଷ୍ଟାଇଲଗୁଡ଼ିକ କନଫିଗର୍ କରନ୍ତୁ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"କିଛି ନାହିଁ"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ଡାଟା"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ପୃଷ୍ଠପଟ ଛବି"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ଷ୍ଟାଇଲଗୁଡ଼ିକ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ୱାଚଫେସ କମ୍ପ୍ଲିକେସନ୍ସ କନଫିଗର କରନ୍ତୁ"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ୱାଚଫେସ ସେଟିଂସ କନଫିଗର କରନ୍ତୁ"</string>
+ <string name="style_config" msgid="7270818527618953542">"ୱାଚଫେସ ଷ୍ଟାଇଲଗୁଡ଼ିକ କନଫିଗର କରନ୍ତୁ"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"କିଛି ନାହିଁ"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ଡାଟା"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ପୃଷ୍ଠପଟ ଇମେଜ"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ଷ୍ଟାଇଲଗୁଡ଼ିକ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-pa/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-pa/watchface_strings.xml
index 128d0f2..d5efaee 100644
--- a/wear/watchface/watchface/src/main/res/values-pa/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-pa/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ਵਾਚ ਫੇਸ ਪੇਚੀਦਗੀਆਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ਵਾਚ ਫੇਸ ਸੈਟਿੰਗਾਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
- <string name="style_config" msgid="2987895585951859981">"ਵਾਚ ਫੇਸ ਸਟਾਈਲਾਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ਕੋਈ ਨਹੀਂ"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ਡਾਟਾ"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ਬੈਕਗ੍ਰਾਊਂਡ ਚਿੱਤਰ"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ਸਟਾਈਲ"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ਵਾਚ ਫ਼ੇਸ ਪੇਚੀਦਗੀਆਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ਵਾਚ ਫ਼ੇਸ ਸੈਟਿੰਗਾਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
+ <string name="style_config" msgid="7270818527618953542">"ਵਾਚ ਫ਼ੇਸ ਸਟਾਈਲਾਂ ਦਾ ਸੰਰੂਪਣ ਕਰੋ"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ਕੋਈ ਨਹੀਂ"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ਡਾਟਾ"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"ਬੈਕਗ੍ਰਾਊਂਡ ਚਿੱਤਰ"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ਸਟਾਈਲ"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-pl/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-pl/watchface_strings.xml
index 4280b65..4a99df1 100644
--- a/wear/watchface/watchface/src/main/res/values-pl/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-pl/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Skonfiguruj widżety na tarczę zegarka"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Skonfiguruj ustawienia tarczy zegarka"</string>
- <string name="style_config" msgid="2987895585951859981">"Skonfiguruj style tarczy zegarka"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Brak"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dane"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Obraz tła"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Style"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Skonfiguruj widżety na tarczę zegarka"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Skonfiguruj ustawienia tarczy zegarka"</string>
+ <string name="style_config" msgid="7270818527618953542">"Skonfiguruj style tarczy zegarka"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Brak"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dane"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Obraz tła"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Style"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-pt-rBR/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-pt-rBR/watchface_strings.xml
index d1cd758..3fd8dba 100644
--- a/wear/watchface/watchface/src/main/res/values-pt-rBR/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-pt-rBR/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurar complicações do mostrador do relógio"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Definir configurações do mostrador do relógio"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurar estilos do mostrador do relógio"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nenhuma"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dados"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imagem de plano de fundo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estilos"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurar complicações do mostrador do relógio"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Definir configurações do mostrador do relógio"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurar estilos do mostrador do relógio"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nenhum"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dados"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imagem de plano de fundo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estilos"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-pt-rPT/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-pt-rPT/watchface_strings.xml
index 6dbe858..498ee82 100644
--- a/wear/watchface/watchface/src/main/res/values-pt-rPT/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-pt-rPT/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configure complicações do mostrador"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configure definições do mostrador"</string>
- <string name="style_config" msgid="2987895585951859981">"Configure estilos do mostrador"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nenhum"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dados"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imagem de fundo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estilos"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configure complicações do mostrador"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configure definições do mostrador"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configure estilos do mostrador"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nenhum"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dados"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imagem de fundo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estilos"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-pt/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-pt/watchface_strings.xml
index d1cd758..3fd8dba 100644
--- a/wear/watchface/watchface/src/main/res/values-pt/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-pt/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurar complicações do mostrador do relógio"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Definir configurações do mostrador do relógio"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurar estilos do mostrador do relógio"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Nenhuma"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dados"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imagem de plano de fundo"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Estilos"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurar complicações do mostrador do relógio"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Definir configurações do mostrador do relógio"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurar estilos do mostrador do relógio"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Nenhum"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dados"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imagem de plano de fundo"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Estilos"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ro/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ro/watchface_strings.xml
index c13dfe6..c792a27 100644
--- a/wear/watchface/watchface/src/main/res/values-ro/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ro/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Configurați funcțiile suplimentare ale ecranului principal al ceasului"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Configurați setările ecranului principal al ceasului"</string>
- <string name="style_config" msgid="2987895585951859981">"Configurați stilurile ecranului principal al ceasului"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Fără"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Date"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imagine de fundal"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stiluri"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Configurați funcțiile suplimentare ale ecranului principal al ceasului"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Configurați setările ecranului principal al ceasului"</string>
+ <string name="style_config" msgid="7270818527618953542">"Configurați stilurile ecranului principal al ceasului"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Fără"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Date"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imagine de fundal"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stiluri"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ru/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ru/watchface_strings.xml
index 5663ccf..036beb9 100644
--- a/wear/watchface/watchface/src/main/res/values-ru/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ru/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Настройка дополнений для циферблата"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Настройка параметров циферблата"</string>
- <string name="style_config" msgid="2987895585951859981">"Настройка стилей циферблата"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Нет"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Данные"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Фоновое изображение"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стили"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Настройка дополнений для циферблата"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Настройка параметров циферблата"</string>
+ <string name="style_config" msgid="7270818527618953542">"Настройка стилей циферблата"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Нет"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Данные"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Фоновое изображение"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стили"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-si/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-si/watchface_strings.xml
index a0461fa..9594f8b 100644
--- a/wear/watchface/watchface/src/main/res/values-si/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-si/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"ඔරලෝසු මුහුණත් සංකූලතා වින්යාස කරන්න"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"ඔරලෝසු මුහුණත් සැකසීම් වින්යාස කරන්න"</string>
- <string name="style_config" msgid="2987895585951859981">"ඔරලෝසු මුහුණත් විලාස වින්යාස කරන්න"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"කිසිවක් නැත"</string>
- <string name="settings_complications" msgid="7688669266180209514">"දත්ත"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"පසුබිම් රූපය"</string>
- <string name="settings_styles" msgid="5609438460443634575">"විලාස"</string>
+ <string name="complication_config" msgid="3090406830927670356">"ඔරලෝසු මුහුණත් සංකූලතා වින්යාස කරන්න"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"ඔරලෝසු මුහුණත් සැකසීම් වින්යාස කරන්න"</string>
+ <string name="style_config" msgid="7270818527618953542">"ඔරලෝසු මුහුණත් මෝස්තර වින්යාස කරන්න"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"කිසිවක් නැත"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"දත්ත"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"පසුබිම් රූපය"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"මෝස්තර"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-sk/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-sk/watchface_strings.xml
index 98325e0..b0c1e98b 100644
--- a/wear/watchface/watchface/src/main/res/values-sk/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-sk/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurácia súčiastok vzhľadu"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurácia nastavení vzhľadu"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurácia štýlov vzhľadu"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Žiadne"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Údaje"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Obrázok na pozadí"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Štýly"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurácia súčiastok ciferníka"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurácia nastavení ciferníka"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurácia štýlov ciferníka"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Žiadne"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Údaje"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Obrázok na pozadí"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Štýly"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-sl/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-sl/watchface_strings.xml
index 40e7cd8..6b4b551 100644
--- a/wear/watchface/watchface/src/main/res/values-sl/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-sl/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfiguriranje obogatitev številčnice"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfiguriranje nastavitev številčnice"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfiguriranje slogov številčnice"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Brez"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Podatki"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Slika ozadja"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Slogi"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfiguriranje obogatitev številčnice"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfiguriranje nastavitev številčnice"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfiguriranje slogov številčnice"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Brez"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Podatki"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Slika ozadja"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Slogi"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-sq/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-sq/watchface_strings.xml
index 35384cc..d89d3f2 100644
--- a/wear/watchface/watchface/src/main/res/values-sq/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-sq/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfiguro ndërlikimet e fushave të orës"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfiguro cilësimet e fushave të orës"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfiguro stilet e fushave të orës"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Asnjë"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Të dhënat"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Imazh në sfond"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stilet"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfiguro ndërlikimet e fushës së orës"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfiguro cilësimet e fushë së orës"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfiguro stilet e fushës së orës"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Asnjë"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Të dhënat"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imazhi i sfondit"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stilet"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-sr/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-sr/watchface_strings.xml
index aa3a72d..53b4f506 100644
--- a/wear/watchface/watchface/src/main/res/values-sr/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-sr/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Конфигуришите показатеље на бројчанику"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Конфигуришите подешавања бројчаника"</string>
- <string name="style_config" msgid="2987895585951859981">"Конфигуришите стилове бројчаника"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Нема"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Подаци"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Слика у позадини"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стилови"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Конфигуришите показатеље на бројчанику"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Конфигуришите подешавања бројчаника"</string>
+ <string name="style_config" msgid="7270818527618953542">"Конфигуришите стилове бројчаника"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Ништа"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Подаци"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Слика у позадини"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стилови"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-sv/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-sv/watchface_strings.xml
index de8c594..9e6ded92 100644
--- a/wear/watchface/watchface/src/main/res/values-sv/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-sv/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Konfigurera komplikationer för urtavlan"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Konfigurera inställningar för urtavlan"</string>
- <string name="style_config" msgid="2987895585951859981">"Konfigurera modeller för urtavlan"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Ingen"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Bakgrundsbild"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Modeller"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Konfigurera komplikationer för urtavlan"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Konfigurera inställningar för urtavlan"</string>
+ <string name="style_config" msgid="7270818527618953542">"Konfigurera modeller för urtavlan"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Inga"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Bakgrundsbild"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Modeller"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-sw/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-sw/watchface_strings.xml
index b234fa2..05d5ae9 100644
--- a/wear/watchface/watchface/src/main/res/values-sw/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-sw/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Weka Mipangilio ya Madoido ya Sura ya Saa"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Weka Mipangilio ya Sura ya Saa"</string>
- <string name="style_config" msgid="2987895585951859981">"Weka Mipangilio ya Miundo ya Sura ya Saa"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Hamna"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Picha ya mandharinyuma"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Miundo"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Weka Mipangilio ya Madoido ya Sura ya Saa"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Weka Mipangilio ya Sura ya Saa"</string>
+ <string name="style_config" msgid="7270818527618953542">"Weka Mipangilio ya Miundo ya Sura ya Saa"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Hamna"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Picha ya mandharinyuma"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Miundo"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ta/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ta/watchface_strings.xml
index 8edf9bd..dcb8302 100644
--- a/wear/watchface/watchface/src/main/res/values-ta/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ta/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"வாட்ச் முகப்புக் காட்சிப்பகுதிகளை உள்ளமைத்தல்"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"வாட்ச் முகப்பு அமைப்புகளை உள்ளமைத்தல்"</string>
- <string name="style_config" msgid="2987895585951859981">"வாட்ச் முகப்பு ஸ்டைல்களை உள்ளமைத்தல்"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"எதுவுமில்லை"</string>
- <string name="settings_complications" msgid="7688669266180209514">"தரவு"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"பின்புலப் படம்"</string>
- <string name="settings_styles" msgid="5609438460443634575">"ஸ்டைல்கள்"</string>
+ <string name="complication_config" msgid="3090406830927670356">"வாட்ச் முகப்புக் காட்சிப்பகுதிகளை உள்ளமைத்தல்"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"வாட்ச் முகப்பு அமைப்புகளை உள்ளமைத்தல்"</string>
+ <string name="style_config" msgid="7270818527618953542">"வாட்ச் முகப்பு ஸ்டைல்களை உள்ளமைத்தல்"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ஏதுமில்லை"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"தரவு"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"பின்புலப் படம்"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"ஸ்டைல்கள்"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-te/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-te/watchface_strings.xml
index 17033b0..bb77d8b 100644
--- a/wear/watchface/watchface/src/main/res/values-te/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-te/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"వాచ్ లుక్ సంక్లిష్టతలను కాన్ఫిగర్ చేయండి"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"వాచ్ లుక్ సెట్టింగ్లను కాన్ఫిగర్ చేయండి"</string>
- <string name="style_config" msgid="2987895585951859981">"వాచ్ లుక్ స్టయిల్లను కాన్ఫిగర్ చేయండి"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ఏదీ లేదు"</string>
- <string name="settings_complications" msgid="7688669266180209514">"డేటా"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"బ్యాక్గ్రౌండ్ ఇమేజ్"</string>
- <string name="settings_styles" msgid="5609438460443634575">"స్టయిల్లు"</string>
+ <string name="complication_config" msgid="3090406830927670356">"వాచ్ లుక్ సంక్లిష్టతలను కాన్ఫిగర్ చేయండి"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"వాచ్ లుక్ సెట్టింగ్లను కాన్ఫిగర్ చేయండి"</string>
+ <string name="style_config" msgid="7270818527618953542">"వాచ్ లుక్ స్టయిల్స్ను కాన్ఫిగర్ చేయండి"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ఏదీ లేదు"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"డేటా"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"బ్యాక్గ్రౌండ్ ఇమేజ్"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"స్టయిల్స్"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-th/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-th/watchface_strings.xml
index 78683f0..a1c5bab 100644
--- a/wear/watchface/watchface/src/main/res/values-th/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-th/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"กำหนดค่าข้อมูลแทรกบนหน้าปัด"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"กำหนดค่าหน้าปัด"</string>
- <string name="style_config" msgid="2987895585951859981">"กำหนดค่าสไตล์หน้าปัด"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"ไม่มี"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ข้อมูล"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"ภาพพื้นหลัง"</string>
- <string name="settings_styles" msgid="5609438460443634575">"สไตล์"</string>
+ <string name="complication_config" msgid="3090406830927670356">"กำหนดค่าข้อมูลแทรกบนหน้าปัด"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"กำหนดค่าหน้าปัด"</string>
+ <string name="style_config" msgid="7270818527618953542">"กำหนดค่าสไตล์หน้าปัด"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"ไม่มี"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ข้อมูล"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"รูปภาพพื้นหลัง"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"สไตล์"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-tl/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-tl/watchface_strings.xml
index ec317b6..5f2c388 100644
--- a/wear/watchface/watchface/src/main/res/values-tl/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-tl/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"I-configure ang Mga Complication sa Watchface"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"I-configure ang Mga Setting ng Watchface"</string>
- <string name="style_config" msgid="2987895585951859981">"I-configure ang Mga Istilo ng Watchface"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Wala"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Data"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Larawan sa background"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Mga Istilo"</string>
+ <string name="complication_config" msgid="3090406830927670356">"I-configure ang Mga Complication sa Watchface"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"I-configure ang Mga Setting ng Watchface"</string>
+ <string name="style_config" msgid="7270818527618953542">"I-configure ang Mga Istilo ng Watchface"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Wala"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Data"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Imahe sa background"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Mga Istilo"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-tr/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-tr/watchface_strings.xml
index ba4c45d..1906492 100644
--- a/wear/watchface/watchface/src/main/res/values-tr/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-tr/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Kadran Özelliklerini Yapılandırma"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Kadran Ayarlarını Yapılandırma"</string>
- <string name="style_config" msgid="2987895585951859981">"Kadran Stillerini Yapılandırma"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Yok"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Veriler"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Arka plan resmi"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Stiller"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Kadran Özelliklerini Yapılandırma"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Kadran Ayarlarını Yapılandırma"</string>
+ <string name="style_config" msgid="7270818527618953542">"Kadran Stillerini Yapılandırma"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Yok"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Veriler"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Arka plan resmi"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Stiller"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-uk/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-uk/watchface_strings.xml
index b7882e5..60dbfe9 100644
--- a/wear/watchface/watchface/src/main/res/values-uk/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-uk/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Налаштувати додаткові функції циферблата"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Налаштувати параметри циферблата"</string>
- <string name="style_config" msgid="2987895585951859981">"Налаштувати стилі циферблата"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Немає"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Дані"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Фонове зображення"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Стилі"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Налаштувати додаткові функції циферблата"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Налаштувати параметри циферблата"</string>
+ <string name="style_config" msgid="7270818527618953542">"Налаштувати стилі циферблата"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Немає"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Дані"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Фонове зображення"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Стилі"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-ur/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-ur/watchface_strings.xml
index 56c1fd88..a291007 100644
--- a/wear/watchface/watchface/src/main/res/values-ur/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-ur/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"واچ فیس کمپلیکیشنز ترتیب دیں"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"واچ فیس ترتیبات کو ترتیب کریں"</string>
- <string name="style_config" msgid="2987895585951859981">"واچ فیس طرزوں کو ترتیب دیں"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"کوئی نہیں"</string>
- <string name="settings_complications" msgid="7688669266180209514">"ڈیٹا"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"پس منظر کی تصویر"</string>
- <string name="settings_styles" msgid="5609438460443634575">"طرزیں"</string>
+ <string name="complication_config" msgid="3090406830927670356">"واچ فیس کمپلیکیشنز کنفیگر کریں"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"واچ فیس کی ترتیبات کو کنفیگر کریں"</string>
+ <string name="style_config" msgid="7270818527618953542">"واچ فیس کے اسٹائلز کو کنفیگر کریں"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"کوئی نہیں"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"ڈیٹا"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"پس منظر کی تصویر"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"اسٹائلز"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-uz/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-uz/watchface_strings.xml
index c0036de..5b57cb2 100644
--- a/wear/watchface/watchface/src/main/res/values-uz/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-uz/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Watchface Complications parametrlarini sozlash"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Watchface sozlamalarini tahrirlash"</string>
- <string name="style_config" msgid="2987895585951859981">"Watchface dizaynini sozlash"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Hech qanday"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Axborot"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Fon rasmi"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Uslublar"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Soat yuzi uchun vidjet parametrlarini sozlash"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Soat yuzi sozlamalarini tahrirlash"</string>
+ <string name="style_config" msgid="7270818527618953542">"Soat yuzi dizaynini sozlash"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Hech qanday"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Maʼlumotlar"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Fon rasmi"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Uslublar"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-vi/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-vi/watchface_strings.xml
index a29c94b..2d2fd77 100644
--- a/wear/watchface/watchface/src/main/res/values-vi/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-vi/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Định cấu hình tiện ích hiển thị nhiều nội dung trên mặt đồng hồ"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Định cấu hình tùy chọn cài đặt mặt đồng hồ"</string>
- <string name="style_config" msgid="2987895585951859981">"Định cấu hình kiểu mặt đồng hồ"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Không"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Dữ liệu"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Hình nền"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Kiểu"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Định cấu hình các chức năng trên mặt đồng hồ"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Định cấu hình chế độ cài đặt mặt đồng hồ"</string>
+ <string name="style_config" msgid="7270818527618953542">"Định cấu hình kiểu mặt đồng hồ"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Không có"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Dữ liệu"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Hình nền"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Kiểu"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-zh-rCN/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-zh-rCN/watchface_strings.xml
index f02f9be..777a619 100644
--- a/wear/watchface/watchface/src/main/res/values-zh-rCN/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-zh-rCN/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"配置表盘主题复杂功能"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"配置表盘主题设置"</string>
- <string name="style_config" msgid="2987895585951859981">"配置表盘主题样式"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"无"</string>
- <string name="settings_complications" msgid="7688669266180209514">"数据"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"背景图片"</string>
- <string name="settings_styles" msgid="5609438460443634575">"样式"</string>
+ <string name="complication_config" msgid="3090406830927670356">"配置表盘主题复杂功能"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"配置表盘主题设置"</string>
+ <string name="style_config" msgid="7270818527618953542">"配置表盘主题样式"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"无"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"数据"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"背景图片"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"样式"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-zh-rHK/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-zh-rHK/watchface_strings.xml
index ceaf022..a2f1bc1 100644
--- a/wear/watchface/watchface/src/main/res/values-zh-rHK/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-zh-rHK/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"設定錶面進階功能"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"調整錶面設定"</string>
- <string name="style_config" msgid="2987895585951859981">"設定錶面樣式"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"無"</string>
- <string name="settings_complications" msgid="7688669266180209514">"資料"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"背景圖片"</string>
- <string name="settings_styles" msgid="5609438460443634575">"樣式"</string>
+ <string name="complication_config" msgid="3090406830927670356">"設定錶面進階功能"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"調整錶面設定"</string>
+ <string name="style_config" msgid="7270818527618953542">"設定錶面樣式"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"無"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"資料"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"背景圖片"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"樣式"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-zh-rTW/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-zh-rTW/watchface_strings.xml
index e3627b79d..adfedd1 100644
--- a/wear/watchface/watchface/src/main/res/values-zh-rTW/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-zh-rTW/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"設定錶面資料顯示區"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"調整錶面設定"</string>
- <string name="style_config" msgid="2987895585951859981">"設定錶面樣式"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"無"</string>
- <string name="settings_complications" msgid="7688669266180209514">"資料"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"背景圖片"</string>
- <string name="settings_styles" msgid="5609438460443634575">"樣式"</string>
+ <string name="complication_config" msgid="3090406830927670356">"設定錶面小工具"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"調整錶面設定"</string>
+ <string name="style_config" msgid="7270818527618953542">"設定錶面樣式"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"無"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"資料"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"背景圖片"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"樣式"</string>
</resources>
diff --git a/wear/watchface/watchface/src/main/res/values-zu/watchface_strings.xml b/wear/watchface/watchface/src/main/res/values-zu/watchface_strings.xml
index f626cb0..8061dc9 100644
--- a/wear/watchface/watchface/src/main/res/values-zu/watchface_strings.xml
+++ b/wear/watchface/watchface/src/main/res/values-zu/watchface_strings.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
- <string name="complication_config" msgid="292306201243482945">"Lungiselela Izinkinga Zobuso Bewashi"</string>
- <string name="watchface_settings" msgid="4785773105440577595">"Lungiselela Amasethingi Wobuso Bewashi"</string>
- <string name="style_config" msgid="2987895585951859981">"Lungiselela Izitayela Zobuso Bewashi"</string>
- <string name="none_background_image_provider" msgid="2326408635673026310">"Lutho"</string>
- <string name="settings_complications" msgid="7688669266180209514">"Idatha"</string>
- <string name="settings_background_image" msgid="4866968289579187727">"Umfanekiso ongemuva"</string>
- <string name="settings_styles" msgid="5609438460443634575">"Izitayela"</string>
+ <string name="complication_config" msgid="3090406830927670356">"Lungiselela Izingxube Zobuso Bewashi"</string>
+ <string name="watchface_settings" msgid="9086980313887663299">"Lungiselela Amasethingi Wobuso Bewashi"</string>
+ <string name="style_config" msgid="7270818527618953542">"Lungiselela Izitayela Zobuso Bewashi"</string>
+ <string name="none_background_image_provider" msgid="2763799590544856080">"Lutho"</string>
+ <string name="settings_complications" msgid="1425815384891476600">"Idatha"</string>
+ <string name="settings_background_image" msgid="496585675676995765">"Umfanekiso ongemuva"</string>
+ <string name="settings_styles" msgid="3243144642316786428">"Izitayela"</string>
</resources>
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index be7c6d3..2c5c851 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -905,11 +905,13 @@
verify(tapListener).onTapEvent(
TapType.DOWN,
- TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis))
+ TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis)),
+ null
)
verify(tapListener).onTapEvent(
TapType.UP,
- TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis))
+ TapEvent(1, 1, Instant.ofEpochMilli(looperTimeMillis)),
+ null
)
}
@@ -953,11 +955,13 @@
verify(tapListener).onTapEvent(
TapType.DOWN,
- TapEvent(10, 20, Instant.ofEpochMilli(looperTimeMillis))
+ TapEvent(10, 20, Instant.ofEpochMilli(looperTimeMillis)),
+ null
)
verify(tapListener).onTapEvent(
TapType.UP,
- TapEvent(10, 20, Instant.ofEpochMilli(looperTimeMillis))
+ TapEvent(10, 20, Instant.ofEpochMilli(looperTimeMillis)),
+ null
)
}
@@ -973,13 +977,15 @@
// Tap right complication.
tapAt(70, 50)
- verify(tapListener, times(0)).onTapEvent(
+ verify(tapListener).onTapEvent(
TapType.DOWN,
- TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis))
+ TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis)),
+ rightComplication
)
- verify(tapListener, times(0)).onTapEvent(
+ verify(tapListener).onTapEvent(
TapType.UP,
- TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis))
+ TapEvent(70, 50, Instant.ofEpochMilli(looperTimeMillis)),
+ rightComplication
)
}
diff --git a/wear/wear-input/build.gradle b/wear/wear-input/build.gradle
index aa5dc2e..47cd1be 100644
--- a/wear/wear-input/build.gradle
+++ b/wear/wear-input/build.gradle
@@ -38,6 +38,8 @@
compileOnly(fileTree(dir: "../wear_stubs", include: ["com.google.android.wearable-stubs.jar"]))
compileOnly(project(":annotation:annotation-sampled"))
+
+ samples(project(":wear:wear-input-samples"))
}
android {
diff --git a/wear/wear-ongoing/lint-baseline.xml b/wear/wear-ongoing/lint-baseline.xml
index f5983a5..0a89a85 100644
--- a/wear/wear-ongoing/lint-baseline.xml
+++ b/wear/wear-ongoing/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
<issue
id="NewApi"
diff --git a/wear/wear-phone-interactions/lint-baseline.xml b/wear/wear-phone-interactions/lint-baseline.xml
deleted file mode 100644
index 6a5a99f..0000000
--- a/wear/wear-phone-interactions/lint-baseline.xml
+++ /dev/null
@@ -1,906 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val verifier = CodeVerifier()"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="29"
- column="24"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" assertEquals(43, verifier.getValue().length)"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="30"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val verifier = CodeVerifier(96)"
- errorLine2=" ~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="35"
- column="24"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" assertEquals(128, verifier.getValue().length)"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="36"
- column="36"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" CodeVerifier(100)"
- errorLine2=" ~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="42"
- column="13"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val verifier = CodeVerifier()"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="51"
- column="24"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertTrue(verifier.equals(CodeVerifier(verifier.getValue())))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="52"
- column="36"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" assertTrue(verifier.equals(CodeVerifier(verifier.getValue())))"
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="52"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" assertTrue(verifier.equals(CodeVerifier(verifier.getValue())))"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="52"
- column="58"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeVerifier().equals(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="57"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeVerifier().equals(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="57"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" assertFalse(CodeVerifier().equals(CodeVerifier()))"
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="57"
- column="36"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeVerifier(50).equals(CodeVerifier(50)))"
- errorLine2=" ~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="58"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeVerifier(50).equals(CodeVerifier(50)))"
- errorLine2=" ~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="58"
- column="45"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" assertFalse(CodeVerifier(50).equals(CodeVerifier(50)))"
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="58"
- column="38"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeVerifier().equals(null))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="59"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" assertFalse(CodeVerifier().equals(null))"
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="59"
- column="36"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val verifier = CodeVerifier("dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk")"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="65"
- column="24"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val challenge = CodeChallenge(verifier)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="66"
- column="25"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" assertEquals("E9Melhoa2OwvFrEMTJguCHaoeK1t8URWbuGJSstw-cM", challenge.getValue())"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="67"
- column="79"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" CodeChallenge(CodeVerifier(verifierValue)).equals("
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="74"
- column="13"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" CodeChallenge(CodeVerifier(verifierValue)).equals("
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="74"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" CodeChallenge(CodeVerifier(verifierValue)).equals("
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="74"
- column="56"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" CodeChallenge(CodeVerifier(verifierValue))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="75"
- column="17"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" CodeChallenge(CodeVerifier(verifierValue))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="75"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(CodeChallenge(CodeVerifier())))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="82"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(CodeChallenge(CodeVerifier())))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="82"
- column="58"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(CodeChallenge(CodeVerifier())))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="82"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(CodeChallenge(CodeVerifier())))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="82"
- column="72"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(CodeChallenge(CodeVerifier())))"
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="82"
- column="51"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(null))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="83"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(null))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="83"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `equals`"
- errorLine1=" assertFalse(CodeChallenge(CodeVerifier()).equals(null))"
- errorLine2=" ~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/CodeVerifierCodeChallengeTest.kt"
- line="83"
- column="51"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `build`"
- errorLine1=" request = builder.build()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="51"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `build`"
- errorLine1=" builder.build()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="67"
- column="21"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="76"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="76"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="87"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="93"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="93"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="105"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="111"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="111"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" "&code_challenge=${codeChallenge.getValue()}" +"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="118"
- column="58"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="128"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="136"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="136"
- column="45"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="148"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="148"
- column="45"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="164"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="164"
- column="45"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="177"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="177"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="190"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="209"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="209"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" "expect to have the value of '${codeChallenge.getValue()}', but " +"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="220"
- column="63"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="228"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="228"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" Uri.parse("$authProviderUrl?code_challenge=${codeChallenge.getValue()}")"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="231"
- column="76"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="241"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="252"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="252"
- column="45"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="265"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="265"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="278"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="289"
- column="31"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="289"
- column="45"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="302"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="302"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `getValue`"
- errorLine1=" codeChallenge.getValue()"
- errorLine2=" ~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="315"
- column="27"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="321"
- column="29"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" val codeChallenge = CodeChallenge(CodeVerifier())"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/OAuthRequestResponseTest.kt"
- line="321"
- column="43"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="50"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="50"
- column="49"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `build`"
- errorLine1=" .build()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="51"
- column="18"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="55"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="55"
- column="49"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `build`"
- errorLine1=" .build()"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="56"
- column="18"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeChallenge`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="87"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `CodeVerifier`"
- errorLine1=" .setCodeChallenge(CodeChallenge(CodeVerifier()))"
- errorLine2=" ~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="87"
- column="49"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 26 (current min is 25): `build`"
- errorLine1=" .build(),"
- errorLine2=" ~~~~~">
- <location
- file="src/test/java/androidx/wear/phone/interactions/authentication/RemoteAuthTest.kt"
- line="88"
- column="18"/>
- </issue>
-
-</issues>
diff --git a/wear/wear-remote-interactions/lint-baseline.xml b/wear/wear-remote-interactions/lint-baseline.xml
deleted file mode 100644
index c7d664e..0000000
--- a/wear/wear-remote-interactions/lint-baseline.xml
+++ /dev/null
@@ -1,92 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `SETTINGS_AUTHORITY_URI`"
- errorLine1=" PlayStoreAvailability.SETTINGS_AUTHORITY_URI,"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="51"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `SYSTEM_FEATURE_WATCH`"
- errorLine1=" shadowPackageManager?.setSystemFeature(PlayStoreAvailability.SYSTEM_FEATURE_WATCH, true)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="57"
- column="70"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `PLAY_STORE_AVAILABLE`"
- errorLine1=" createFakePlayStoreAvailabilityQuery(PlayStoreAvailability.PLAY_STORE_AVAILABLE)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="63"
- column="68"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `PLAY_STORE_AVAILABLE`"
- errorLine1=" PlayStoreAvailability.PLAY_STORE_AVAILABLE"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="68"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `PLAY_STORE_UNAVAILABLE`"
- errorLine1=" createFakePlayStoreAvailabilityQuery(PlayStoreAvailability.PLAY_STORE_UNAVAILABLE)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="75"
- column="68"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `PLAY_STORE_UNAVAILABLE`"
- errorLine1=" PlayStoreAvailability.PLAY_STORE_UNAVAILABLE"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="80"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `PLAY_STORE_ERROR_UNKNOWN`"
- errorLine1=" PlayStoreAvailability.PLAY_STORE_ERROR_UNKNOWN"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="91"
- column="35"/>
- </issue>
-
- <issue
- id="NewApi"
- message="Call requires API level 24 (current min is 23): `KEY_PLAY_STORE_AVAILABILITY`"
- errorLine1=" arrayOf<Any>(PlayStoreAvailability.KEY_PLAY_STORE_AVAILABILITY, availability)"
- errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
- <location
- file="src/test/java/androidx/wear/remote/interactions/PlayStoreAvailabilityTest.kt"
- line="104"
- column="52"/>
- </issue>
-
-</issues>
diff --git a/wear/wear-samples-ambient/lint-baseline.xml b/wear/wear-samples-ambient/lint-baseline.xml
new file mode 100644
index 0000000..5a9edfb
--- /dev/null
+++ b/wear/wear-samples-ambient/lint-baseline.xml
@@ -0,0 +1,2510 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="true" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `getCircleColor` such that `circleColor` can be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public int getDefaultCircleColor() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="544"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`int[]`) and setter parameter type (`int...`) getter and setter methods for property `colorSchemeColors` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public int[] getColorSchemeColors() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="348"
+ column="18"/>
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="339"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`float`) and setter parameter type (`int`) getter and setter methods for property `dotSpacing` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public float getDotSpacing() {"
+ errorLine2=" ~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="208"
+ column="18"/>
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="217"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`float`) and setter parameter type (`int`) getter and setter methods for property `dotRadius` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public float getDotRadius() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="229"
+ column="18"/>
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="238"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="The getter return type (`float`) and setter parameter type (`int`) getter and setter methods for property `dotRadiusSelected` should have exactly the same type to allow be accessed as a property from Kotlin; see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public float getDotRadiusSelected() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="251"
+ column="18"/>
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="260"
+ column="17"
+ message="Setter here"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `setAutoPeekEnabled` such that (along with the `isAutoPeekEnabled` getter) Kotlin code can access it as a property (`autoPeekEnabled`); see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public void setIsAutoPeekEnabled(boolean canAutoPeek) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="394"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="KotlinPropertyAccess"
+ message="This method should be called `setLocked` such that (along with the `isLocked` getter) Kotlin code can access it as a property (`locked`); see https://android.github.io/kotlin-guides/interop.html#property-prefixes"
+ errorLine1=" public void setIsLocked(boolean locked) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="413"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AmbientCallback getAmbientCallback();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="100"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onEnterAmbient(Bundle ambientDetails) {}"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="116"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAttach(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="181"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCreate(Bundle savedInstanceState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="194"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static <T extends Activity> AmbientController attachAmbientSupport(T activity) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="250"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="265"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="265"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="265"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientMode.java"
+ line="265"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" AmbientCallback getAmbientCallback();"
+ errorLine2=" ~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="127"
+ column="9"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onEnterAmbient(Bundle ambientDetails) {}"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="144"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAttach(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="211"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCreate(Bundle savedInstanceState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="224"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static <T extends FragmentActivity> AmbientController attach(T activity) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="280"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="296"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="296"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="296"
+ column="56"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/AmbientModeSupport.java"
+ line="296"
+ column="76"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setForeground(Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/BoxInsetLayout.java"
+ line="114"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/BoxInsetLayout.java"
+ line="126"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public LayoutParams generateLayoutParams(AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/BoxInsetLayout.java"
+ line="126"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/BoxInsetLayout.java"
+ line="291"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/BoxInsetLayout.java"
+ line="296"
+ column="15"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/BoxInsetLayout.java"
+ line="296"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircledImageView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="119"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircledImageView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="123"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircledImageView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="123"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircledImageView(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="127"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircledImageView(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="127"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onDraw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="225"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ColorStateList getCircleColorStateList() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="530"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCircleColorStateList(ColorStateList circleColor) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="535"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onVisibilityChanged(View changedView, int visibility) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="566"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setCircleBorderCap(Paint.Cap circleBorderCap) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="625"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getImageDrawable() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="665"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setImageDrawable(Drawable drawable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircledImageView.java"
+ line="670"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void onTimerFinished(CircularProgressLayout layout);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="95"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="98"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="102"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="102"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="106"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="106"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context, AttributeSet attrs, int defStyleAttr,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="110"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CircularProgressLayout(Context context, AttributeSet attrs, int defStyleAttr,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="110"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setColorSchemeColors(int... colors) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="339"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public int[] getColorSchemeColors() {"
+ errorLine2=" ~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CircularProgressLayout.java"
+ line="348"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onCreate(Bundle savedInstanceState) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/activity/ConfirmationActivity.java"
+ line="102"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CurvingLayoutCallback(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CurvingLayoutCallback.java"
+ line="52"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onLayoutFinished(View child, RecyclerView parent) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CurvingLayoutCallback.java"
+ line="61"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onLayoutFinished(View child, RecyclerView parent) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CurvingLayoutCallback.java"
+ line="61"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void adjustAnchorOffsetXY(View child, float[] anchorOffsetXY) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CurvingLayoutCallback.java"
+ line="115"
+ column="38"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void adjustAnchorOffsetXY(View child, float[] anchorOffsetXY) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/CurvingLayoutCallback.java"
+ line="115"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isStandalone(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/utils/MetadataConstants.java"
+ line="133"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static boolean isNotificationBridgingEnabled(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/utils/MetadataConstants.java"
+ line="153"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getPreviewDrawableResourceId(Context context, boolean circular) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/utils/MetadataConstants.java"
+ line="176"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void initialize(WearableNavigationDrawerView drawer,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPagePresenter.java"
+ line="47"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WearableNavigationDrawerPresenter presenter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPagePresenter.java"
+ line="48"
+ column="17"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setNavigationPagerAdapter(WearableNavigationDrawerAdapter adapter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPagePresenter.java"
+ line="63"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MultiPagePresenter(WearableNavigationDrawerView drawer, Ui ui,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPagePresenter.java"
+ line="71"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MultiPagePresenter(WearableNavigationDrawerView drawer, Ui ui,"
+ errorLine2=" ~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPagePresenter.java"
+ line="71"
+ column="68"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onNewAdapter(WearableNavigationDrawerAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPagePresenter.java"
+ line="92"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WearableNavigationDrawerView drawer, WearableNavigationDrawerPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPageUi.java"
+ line="55"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" WearableNavigationDrawerView drawer, WearableNavigationDrawerPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPageUi.java"
+ line="55"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setNavigationPagerAdapter(final WearableNavigationDrawerAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/MultiPageUi.java"
+ line="75"
+ column="49"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PageIndicatorView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="82"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PageIndicatorView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="86"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PageIndicatorView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="86"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PageIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="90"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public PageIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="90"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPager(ViewPager pager) {"
+ errorLine2=" ~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="194"
+ column="26"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setDotFadeOutDuration(int duration, TimeUnit unit) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="345"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setDotFadeInDuration(int duration, TimeUnit unit) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="363"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPagerAdapter(PagerAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="558"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onDraw(Canvas canvas) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/PageIndicatorView.java"
+ line="593"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getScreenWidthPx(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/ResourcesUtil.java"
+ line="36"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getScreenHeightPx(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/ResourcesUtil.java"
+ line="43"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public static int getFractionOfScreenPx(Context context, int screenPx, @FractionRes int resId) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/ResourcesUtil.java"
+ line="51"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" protected void onBoundsChange(Rect bounds) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/RoundedDrawable.java"
+ line="190"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setColorFilter(ColorFilter cf) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/RoundedDrawable.java"
+ line="248"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationCancel(Animator animator) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SimpleAnimatorListener.java"
+ line="36"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationEnd(Animator animator) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SimpleAnimatorListener.java"
+ line="41"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationRepeat(Animator animator) {}"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SimpleAnimatorListener.java"
+ line="48"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationStart(Animator animator) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SimpleAnimatorListener.java"
+ line="51"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onAnimationComplete(Animator animator) {}"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SimpleAnimatorListener.java"
+ line="58"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setPresenter(WearableNavigationDrawerPresenter presenter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePagePresenter.java"
+ line="53"
+ column="27"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setIcon(int index, Drawable drawable, CharSequence contentDescription);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePagePresenter.java"
+ line="63"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setIcon(int index, Drawable drawable, CharSequence contentDescription);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePagePresenter.java"
+ line="63"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" void setText(CharSequence itemText, boolean showToastIfNoTextView);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePagePresenter.java"
+ line="70"
+ column="22"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SinglePagePresenter(Ui ui, boolean isAccessibilityEnabled) {"
+ errorLine2=" ~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePagePresenter.java"
+ line="93"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onNewAdapter(WearableNavigationDrawerAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePagePresenter.java"
+ line="124"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SinglePageUi(WearableNavigationDrawerView navigationDrawer) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePageUi.java"
+ line="88"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPresenter(WearableNavigationDrawerPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePageUi.java"
+ line="96"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(int index, Drawable drawable, CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePageUi.java"
+ line="129"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setIcon(int index, Drawable drawable, CharSequence contentDescription) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePageUi.java"
+ line="129"
+ column="55"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setText(CharSequence itemText, boolean showToastIfNoTextView) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/SinglePageUi.java"
+ line="135"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSwipeStarted(SwipeDismissFrameLayout layout) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="54"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onSwipeCanceled(SwipeDismissFrameLayout layout) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="62"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDismissed(SwipeDismissFrameLayout layout) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="69"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="81"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="99"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="99"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="114"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context, AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="114"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context, AttributeSet attrs, int defStyle,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="130"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SwipeDismissFrameLayout(Context context, AttributeSet attrs, int defStyle,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="130"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addCallback(Callback callback) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="136"
+ column="29"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeCallback(Callback callback) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/SwipeDismissFrameLayout.java"
+ line="145"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="252"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="252"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitle(int title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="261"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitle() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="266"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="271"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(Drawable icon) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="271"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIcon(int iconRes) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="280"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Drawable getIcon() {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="285"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="290"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="290"
+ column="52"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="306"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setTitleCondensed(CharSequence title) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="306"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public CharSequence getTitleCondensed() {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="311"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="316"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setIntent(Intent intent) {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="316"
+ column="35"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Intent getIntent() {"
+ errorLine2=" ~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="321"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShortcut(char numericChar, char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="326"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setNumericShortcut(char numericChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="331"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setAlphabeticShortcut(char alphaChar) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="341"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setCheckable(boolean checkable) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="351"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setChecked(boolean checked) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="361"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setVisible(boolean visible) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="371"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setEnabled(boolean enabled) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="381"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public SubMenu getSubMenu() {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="396"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ContextMenu.ContextMenuInfo getMenuInfo() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="401"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setShowAsActionFlags(int actionEnum) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="411"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionView(View view) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="416"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionView(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="416"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionView(int resId) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="421"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public View getActionView() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="426"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="431"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setActionProvider(ActionProvider actionProvider) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="431"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public ActionProvider getActionProvider() {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="436"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="456"
+ column="16"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerMenu.java"
+ line="456"
+ column="51"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActionDrawerView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="98"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActionDrawerView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="102"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActionDrawerView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="102"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActionDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="106"
+ column="37"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActionDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="106"
+ column="54"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="111"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="111"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPeekContainerClicked(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="222"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setOnMenuItemClickListener(OnMenuItemClickListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="238"
+ column="44"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public Menu getMenu() {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableActionDrawerView.java"
+ line="320"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActivityController getWearableController(Activity activity,"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/WearableControllerProvider.java"
+ line="46"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableActivityController getWearableController(Activity activity,"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/WearableControllerProvider.java"
+ line="46"
+ column="61"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" final AmbientDelegate.AmbientCallback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/ambient/WearableControllerProvider.java"
+ line="47"
+ column="19"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerLayout(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="221"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="225"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerLayout(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="225"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerLayout(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="229"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerLayout(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="229"
+ column="50"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="235"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="235"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WindowInsets onApplyWindowInsets(WindowInsets insets) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="324"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WindowInsets onApplyWindowInsets(WindowInsets insets) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="324"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onInterceptTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="498"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="517"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="540"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="540"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" View v,"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="574"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setDrawerStateCallback(DrawerStateCallback callback) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="601"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onFlingComplete(View view) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="639"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerOpened(WearableDrawerLayout layout, WearableDrawerView drawerView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="926"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerOpened(WearableDrawerLayout layout, WearableDrawerView drawerView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="926"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerClosed(WearableDrawerLayout layout, WearableDrawerView drawerView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="932"
+ column="36"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerClosed(WearableDrawerLayout layout, WearableDrawerView drawerView) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="932"
+ column="65"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onDrawerStateChanged(WearableDrawerLayout layout, @DrawerState int newState) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
+ line="940"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="136"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="140"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="140"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="144"
+ column="31"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="144"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="149"
+ column="13"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="149"
+ column="30"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onPeekContainerClicked(View v) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="198"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="228"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addView(View child, int index, ViewGroup.LayoutParams params) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="228"
+ column="48"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPeekContent(View content) {"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="280"
+ column="32"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableDrawerController getController() {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableDrawerView.java"
+ line="435"
+ column="12"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onLayoutFinished(View child, RecyclerView parent);"
+ errorLine2=" ~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="52"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onLayoutFinished(View child, RecyclerView parent);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="52"
+ column="59"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableLinearLayoutManager(Context context, LayoutCallback layoutCallback) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="61"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableLinearLayoutManager(Context context, LayoutCallback layoutCallback) {"
+ errorLine2=" ~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="61"
+ column="57"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableLinearLayoutManager(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="71"
+ column="40"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="96"
+ column="21"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="96"
+ column="53"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="104"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableLinearLayoutManager.java"
+ line="104"
+ column="66"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract void onNewAdapter(WearableNavigationDrawerAdapter adapter);"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java"
+ line="48"
+ column="39"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemSelectedListenerAdded(OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java"
+ line="74"
+ column="45"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void onItemSelectedListenerRemoved(OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/internal/widget/drawer/WearableNavigationDrawerPresenter.java"
+ line="82"
+ column="47"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="122"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="125"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context, AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="125"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="129"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="129"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context, AttributeSet attrs, int defStyleAttr,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="133"
+ column="41"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableNavigationDrawerView(Context context, AttributeSet attrs, int defStyleAttr,"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="133"
+ column="58"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setAdapter(final WearableNavigationDrawerAdapter adapter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="177"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void addOnItemSelectedListener(OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="184"
+ column="43"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void removeOnItemSelectedListener(OnItemSelectedListener listener) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="191"
+ column="46"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onInterceptTouchEvent(MotionEvent ev) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="213"
+ column="42"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract CharSequence getItemText(int pos);"
+ errorLine2=" ~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="258"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public abstract Drawable getItemDrawable(int pos);"
+ errorLine2=" ~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="263"
+ column="25"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public void setPresenter(WearableNavigationDrawerPresenter presenter) {"
+ errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/drawer/WearableNavigationDrawerView.java"
+ line="289"
+ column="34"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableRecyclerView(Context context) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableRecyclerView.java"
+ line="64"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableRecyclerView(Context context, @Nullable AttributeSet attrs) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableRecyclerView.java"
+ line="68"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableRecyclerView.java"
+ line="72"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public WearableRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle,"
+ errorLine2=" ~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableRecyclerView.java"
+ line="76"
+ column="33"/>
+ </issue>
+
+ <issue
+ id="UnknownNullness"
+ message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://android.github.io/kotlin-guides/interop.html#nullability-annotations"
+ errorLine1=" public boolean onTouchEvent(MotionEvent event) {"
+ errorLine2=" ~~~~~~~~~~~">
+ <location
+ file="src/main/java/androidx/wear/widget/WearableRecyclerView.java"
+ line="144"
+ column="33"/>
+ </issue>
+
+</issues>
diff --git a/wear/wear/lint-baseline.xml b/wear/wear/lint-baseline.xml
index 8d62f0c..5e14682 100644
--- a/wear/wear/lint-baseline.xml
+++ b/wear/wear/lint-baseline.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.1.0-alpha02" type="baseline" client="cli" name="Lint" variant="all" version="7.1.0-alpha02">
+<issues format="6" by="lint 7.1.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.1.0-alpha08)" variant="all" version="7.1.0-alpha08">
<issue
id="KotlinPropertyAccess"
@@ -1810,7 +1810,7 @@
errorLine2=" ~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="220"
+ line="221"
column="33"/>
</issue>
@@ -1821,7 +1821,7 @@
errorLine2=" ~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="224"
+ line="225"
column="33"/>
</issue>
@@ -1832,7 +1832,7 @@
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="224"
+ line="225"
column="50"/>
</issue>
@@ -1843,7 +1843,7 @@
errorLine2=" ~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="228"
+ line="229"
column="33"/>
</issue>
@@ -1854,7 +1854,7 @@
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="228"
+ line="229"
column="50"/>
</issue>
@@ -1865,7 +1865,7 @@
errorLine2=" ~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="234"
+ line="235"
column="13"/>
</issue>
@@ -1876,7 +1876,7 @@
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="234"
+ line="235"
column="30"/>
</issue>
@@ -1887,7 +1887,7 @@
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="323"
+ line="324"
column="12"/>
</issue>
@@ -1898,7 +1898,7 @@
errorLine2=" ~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="323"
+ line="324"
column="45"/>
</issue>
@@ -1909,7 +1909,7 @@
errorLine2=" ~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="497"
+ line="498"
column="42"/>
</issue>
@@ -1920,7 +1920,7 @@
errorLine2=" ~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="516"
+ line="517"
column="33"/>
</issue>
@@ -1931,7 +1931,7 @@
errorLine2=" ~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="539"
+ line="540"
column="25"/>
</issue>
@@ -1942,7 +1942,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="539"
+ line="540"
column="48"/>
</issue>
@@ -1953,7 +1953,7 @@
errorLine2=" ~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="573"
+ line="574"
column="13"/>
</issue>
@@ -1964,7 +1964,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="600"
+ line="601"
column="40"/>
</issue>
@@ -1975,7 +1975,7 @@
errorLine2=" ~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="638"
+ line="639"
column="33"/>
</issue>
@@ -1986,7 +1986,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="918"
+ line="926"
column="36"/>
</issue>
@@ -1997,7 +1997,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="918"
+ line="926"
column="65"/>
</issue>
@@ -2008,7 +2008,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="924"
+ line="932"
column="36"/>
</issue>
@@ -2019,7 +2019,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="924"
+ line="932"
column="65"/>
</issue>
@@ -2030,7 +2030,7 @@
errorLine2=" ~~~~~~~~~~~~~~~~~~~~">
<location
file="src/main/java/androidx/wear/widget/drawer/WearableDrawerLayout.java"
- line="932"
+ line="940"
column="42"/>
</issue>
diff --git a/webkit/integration-tests/testapp/README.md b/webkit/integration-tests/testapp/README.md
index 735a7990..b9a3c7f 100644
--- a/webkit/integration-tests/testapp/README.md
+++ b/webkit/integration-tests/testapp/README.md
@@ -29,7 +29,7 @@
./gradlew :webkit:integration-tests:testapp:installDebug
# Check for Lint warnings
-./gradlew :webkit:integration-tests:testapp:lintRelease
+./gradlew :webkit:integration-tests:testapp:lintDebug
# Run automated espresso tests
./gradlew :webkit:integration-tests:testapp:connectedAndroidTest
diff --git a/webkit/integration-tests/testapp/build.gradle b/webkit/integration-tests/testapp/build.gradle
index b25f021..edcf35d 100644
--- a/webkit/integration-tests/testapp/build.gradle
+++ b/webkit/integration-tests/testapp/build.gradle
@@ -51,12 +51,13 @@
}
}
task.include("*.apk")
+ String projectPath = project.path
task.rename { fileName ->
- "${project.path.substring(1).replace(':', '-')}_$fileName"
+ "${projectPath.substring(1).replace(':', '-')}_$fileName"
}
task.destinationDir =
new File(BuildServerConfigurationKt.getDistributionDirectory(project), "apks")
- task.dependsOn(project.path + ":assembleRelease")
+ task.dependsOn(projectPath + ":assembleRelease")
}
BuildOnServerKt.addToBuildOnServer(project, copyReleaseApk)
diff --git a/window/window-extensions/api/current.txt b/window/window-extensions/api/current.txt
index 95519f1..096d5d7 100644
--- a/window/window-extensions/api/current.txt
+++ b/window/window-extensions/api/current.txt
@@ -1,9 +1,14 @@
// Signature format: 4.0
package androidx.window.extensions {
- public class WindowLibraryInfo {
- method public static androidx.window.extensions.WindowLibraryInfo getInstance(android.content.Context);
- method public int getVendorApiLevel();
+ public interface WindowExtensions {
+ method public default int getVendorApiLevel();
+ method public androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent();
+ method public boolean isWindowLayoutComponentAvailable();
+ }
+
+ public class WindowExtensionsProvider {
+ method public static androidx.window.extensions.WindowExtensions getWindowExtensions();
}
}
@@ -27,15 +32,9 @@
public interface WindowLayoutComponent {
method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
- method public static androidx.window.extensions.layout.WindowLayoutComponent? getInstance(android.content.Context);
method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
}
- public class WindowLayoutComponentProvider {
- method public static androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent(android.content.Context);
- method public static boolean isWindowLayoutComponentAvailable();
- }
-
public class WindowLayoutInfo {
ctor public WindowLayoutInfo(java.util.List<androidx.window.extensions.layout.DisplayFeature!>);
method public java.util.List<androidx.window.extensions.layout.DisplayFeature!> getDisplayFeatures();
diff --git a/window/window-extensions/api/public_plus_experimental_current.txt b/window/window-extensions/api/public_plus_experimental_current.txt
index 95519f1..392eca6 100644
--- a/window/window-extensions/api/public_plus_experimental_current.txt
+++ b/window/window-extensions/api/public_plus_experimental_current.txt
@@ -1,9 +1,92 @@
// Signature format: 4.0
package androidx.window.extensions {
- public class WindowLibraryInfo {
- method public static androidx.window.extensions.WindowLibraryInfo getInstance(android.content.Context);
- method public int getVendorApiLevel();
+ @RequiresOptIn @java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.CLASS) public @interface ExperimentalWindowExtensionsApi {
+ }
+
+ public interface WindowExtensions {
+ method @androidx.window.extensions.ExperimentalWindowExtensionsApi public androidx.window.extensions.embedding.ActivityEmbeddingComponent getActivityEmbeddingComponent();
+ method public default int getVendorApiLevel();
+ method public androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent();
+ method @androidx.window.extensions.ExperimentalWindowExtensionsApi public boolean isEmbeddingComponentAvailable();
+ method public boolean isWindowLayoutComponentAvailable();
+ }
+
+ public class WindowExtensionsProvider {
+ method public static androidx.window.extensions.WindowExtensions getWindowExtensions();
+ }
+
+}
+
+package androidx.window.extensions.embedding {
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public interface ActivityEmbeddingComponent {
+ method public void setEmbeddingRules(java.util.Set<androidx.window.extensions.embedding.EmbeddingRule!>);
+ method public void setSplitInfoCallback(java.util.function.Consumer<java.util.List<androidx.window.extensions.embedding.SplitInfo!>!>);
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public class ActivityRule extends androidx.window.extensions.embedding.EmbeddingRule {
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean matchesActivity(android.app.Activity);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean matchesIntent(android.content.Intent);
+ method public boolean shouldAlwaysExpand();
+ }
+
+ public static final class ActivityRule.Builder {
+ ctor public ActivityRule.Builder(java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>);
+ method public androidx.window.extensions.embedding.ActivityRule build();
+ method public androidx.window.extensions.embedding.ActivityRule.Builder setShouldAlwaysExpand(boolean);
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public class ActivityStack {
+ ctor public ActivityStack(java.util.List<android.app.Activity!>);
+ method public java.util.List<android.app.Activity!> getActivities();
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public abstract class EmbeddingRule {
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public class SplitInfo {
+ ctor public SplitInfo(androidx.window.extensions.embedding.ActivityStack, androidx.window.extensions.embedding.ActivityStack, float);
+ method public androidx.window.extensions.embedding.ActivityStack getPrimaryActivityStack();
+ method public androidx.window.extensions.embedding.ActivityStack getSecondaryActivityStack();
+ method public float getSplitRatio();
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public class SplitPairRule extends androidx.window.extensions.embedding.SplitRule {
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean matchesActivityIntentPair(android.app.Activity, android.content.Intent);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean matchesActivityPair(android.app.Activity, android.app.Activity);
+ method public boolean shouldClearTop();
+ method public boolean shouldFinishPrimaryWithSecondary();
+ method public boolean shouldFinishSecondaryWithPrimary();
+ }
+
+ public static final class SplitPairRule.Builder {
+ ctor public SplitPairRule.Builder(java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.app.Activity!>!>, java.util.function.Predicate<android.util.Pair<android.app.Activity!,android.content.Intent!>!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+ method public androidx.window.extensions.embedding.SplitPairRule build();
+ method public androidx.window.extensions.embedding.SplitPairRule.Builder setLayoutDirection(int);
+ method public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldClearTop(boolean);
+ method public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishPrimaryWithSecondary(boolean);
+ method public androidx.window.extensions.embedding.SplitPairRule.Builder setShouldFinishSecondaryWithPrimary(boolean);
+ method public androidx.window.extensions.embedding.SplitPairRule.Builder setSplitRatio(float);
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public class SplitPlaceholderRule extends androidx.window.extensions.embedding.SplitRule {
+ method public android.content.Intent getPlaceholderIntent();
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean matchesActivity(android.app.Activity);
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean matchesIntent(android.content.Intent);
+ }
+
+ public static final class SplitPlaceholderRule.Builder {
+ ctor public SplitPlaceholderRule.Builder(android.content.Intent, java.util.function.Predicate<android.app.Activity!>, java.util.function.Predicate<android.content.Intent!>, java.util.function.Predicate<android.view.WindowMetrics!>);
+ method public androidx.window.extensions.embedding.SplitPlaceholderRule build();
+ method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setLayoutDirection(int);
+ method public androidx.window.extensions.embedding.SplitPlaceholderRule.Builder setSplitRatio(float);
+ }
+
+ @androidx.window.extensions.ExperimentalWindowExtensionsApi public abstract class SplitRule extends androidx.window.extensions.embedding.EmbeddingRule {
+ method @RequiresApi(api=android.os.Build.VERSION_CODES.N) public boolean checkParentMetrics(android.view.WindowMetrics);
+ method public int getLayoutDirection();
+ method public float getSplitRatio();
}
}
@@ -27,15 +110,9 @@
public interface WindowLayoutComponent {
method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
- method public static androidx.window.extensions.layout.WindowLayoutComponent? getInstance(android.content.Context);
method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
}
- public class WindowLayoutComponentProvider {
- method public static androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent(android.content.Context);
- method public static boolean isWindowLayoutComponentAvailable();
- }
-
public class WindowLayoutInfo {
ctor public WindowLayoutInfo(java.util.List<androidx.window.extensions.layout.DisplayFeature!>);
method public java.util.List<androidx.window.extensions.layout.DisplayFeature!> getDisplayFeatures();
diff --git a/window/window-extensions/api/restricted_current.txt b/window/window-extensions/api/restricted_current.txt
index 95519f1..096d5d7 100644
--- a/window/window-extensions/api/restricted_current.txt
+++ b/window/window-extensions/api/restricted_current.txt
@@ -1,9 +1,14 @@
// Signature format: 4.0
package androidx.window.extensions {
- public class WindowLibraryInfo {
- method public static androidx.window.extensions.WindowLibraryInfo getInstance(android.content.Context);
- method public int getVendorApiLevel();
+ public interface WindowExtensions {
+ method public default int getVendorApiLevel();
+ method public androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent();
+ method public boolean isWindowLayoutComponentAvailable();
+ }
+
+ public class WindowExtensionsProvider {
+ method public static androidx.window.extensions.WindowExtensions getWindowExtensions();
}
}
@@ -27,15 +32,9 @@
public interface WindowLayoutComponent {
method public void addWindowLayoutInfoListener(android.app.Activity, java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
- method public static androidx.window.extensions.layout.WindowLayoutComponent? getInstance(android.content.Context);
method public void removeWindowLayoutInfoListener(java.util.function.Consumer<androidx.window.extensions.layout.WindowLayoutInfo!>);
}
- public class WindowLayoutComponentProvider {
- method public static androidx.window.extensions.layout.WindowLayoutComponent getWindowLayoutComponent(android.content.Context);
- method public static boolean isWindowLayoutComponentAvailable();
- }
-
public class WindowLayoutInfo {
ctor public WindowLayoutInfo(java.util.List<androidx.window.extensions.layout.DisplayFeature!>);
method public java.util.List<androidx.window.extensions.layout.DisplayFeature!> getDisplayFeatures();
diff --git a/window/window-extensions/build.gradle b/window/window-extensions/build.gradle
index f0431c0..975e1df 100644
--- a/window/window-extensions/build.gradle
+++ b/window/window-extensions/build.gradle
@@ -25,7 +25,9 @@
}
dependencies {
+ api(libs.kotlinStdlib)
implementation("androidx.annotation:annotation:1.1.0")
+ implementation("androidx.annotation:annotation-experimental:1.1.0")
androidTestImplementation(libs.testExtJunit)
androidTestImplementation(libs.testRunner)
diff --git a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt b/window/window-extensions/src/main/java/androidx/window/extensions/ExperimentalWindowExtensionsApi.java
similarity index 72%
copy from compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
copy to window/window-extensions/src/main/java/androidx/window/extensions/ExperimentalWindowExtensionsApi.java
index 2ab52fb..0da12db 100644
--- a/compose/foundation/foundation/src/desktopMain/kotlin/androidx/compose/foundation/ExperimentalDesktopApi.desktop.kt
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/ExperimentalWindowExtensionsApi.java
@@ -14,7 +14,13 @@
* limitations under the License.
*/
-package androidx.compose.foundation
+package androidx.window.extensions;
-@RequiresOptIn("This API is experimental and is likely to change in the future.")
-annotation class ExperimentalDesktopApi
\ No newline at end of file
+import androidx.annotation.RequiresOptIn;
+
+/**
+ * Denotes that the API uses experimental WindowManager extension APIs.
+ */
+@RequiresOptIn
+public @interface ExperimentalWindowExtensionsApi {
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/WindowExtensions.java b/window/window-extensions/src/main/java/androidx/window/extensions/WindowExtensions.java
new file mode 100644
index 0000000..9e301e3
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/WindowExtensions.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions;
+
+import androidx.annotation.NonNull;
+import androidx.window.extensions.embedding.ActivityEmbeddingComponent;
+import androidx.window.extensions.layout.WindowLayoutComponent;
+
+/**
+ * A class to provide instances of different WindowManager Jetpack extension components. An OEM must
+ * implement all the availability methods to state which WindowManager Jetpack extension
+ * can be used. If a component is not available then the check must return {@code false}. Trying to
+ * get a component that is not available will throw an {@link UnsupportedOperationException}.
+ * All components must support the API level returned in
+ * {@link WindowExtensions#getVendorApiLevel()}.
+ */
+public interface WindowExtensions {
+ /**
+ * Returns the API level of the vendor library on the device. If the returned version is not
+ * supported by the WindowManager library, then some functions may not be available or replaced
+ * with stub implementations.
+ *
+ * The expected use case is for the WindowManager library to determine which APIs are
+ * available and wrap the API so that app developers do not need to deal with the complexity.
+ * @return the API level supported by the library.
+ */
+ default int getVendorApiLevel() {
+ return 1;
+ }
+
+ /**
+ * Returns {@code true} if {@link WindowLayoutComponent} is present on the device,
+ * {@code false} otherwise.
+ */
+ boolean isWindowLayoutComponentAvailable();
+
+ /**
+ * Returns the OEM implementation of {@link WindowLayoutComponent} if it is supported on the
+ * device. The implementation must match the API level reported in
+ * {@link WindowExtensions}. Use {@link WindowExtensions#isWindowLayoutComponentAvailable()} to
+ * determine if {@link WindowLayoutComponent} is present.
+ * @return the OEM implementation of {@link WindowLayoutComponent}
+ * @throws UnsupportedOperationException if the device does not support
+ */
+ @NonNull
+ WindowLayoutComponent getWindowLayoutComponent();
+
+
+ /**
+ * Returns {@code true} if {@link ActivityEmbeddingComponent} is present on the device,
+ * {@code false} otherwise. If the component is not available the developer will receive a
+ * single callback with empty data or default values where possible.
+ */
+ @ExperimentalWindowExtensionsApi
+ boolean isEmbeddingComponentAvailable();
+
+ /**
+ * Returns the OEM implementation of {@link ActivityEmbeddingComponent} if it is supported on
+ * the device. The implementation must match the API level reported in
+ * {@link WindowExtensions}. An
+ * {@link UnsupportedOperationException} will be thrown if the device does not support
+ * Activity Embedding. Use
+ * {@link WindowExtensions#isEmbeddingComponentAvailable()} to determine if
+ * {@link ActivityEmbeddingComponent} is present.
+ * @return the OEM implementation of {@link ActivityEmbeddingComponent}
+ */
+ @NonNull
+ @ExperimentalWindowExtensionsApi
+ ActivityEmbeddingComponent getActivityEmbeddingComponent();
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/WindowExtensionsProvider.java b/window/window-extensions/src/main/java/androidx/window/extensions/WindowExtensionsProvider.java
new file mode 100644
index 0000000..1f3aefd
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/WindowExtensionsProvider.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions;
+
+import androidx.annotation.NonNull;
+
+/**
+ * Provides the OEM implementation of {@link WindowExtensions}.
+ */
+public class WindowExtensionsProvider {
+
+ private WindowExtensionsProvider() {}
+
+ /**
+ * Returns the OEM implementation of {@link WindowExtensions}. This method must be
+ * implemented by the OEM also.
+ * @return the OEM implementation of {@link WindowExtensions}
+ */
+ @NonNull
+ public static WindowExtensions getWindowExtensions() {
+ throw new UnsupportedOperationException("Stub, replace with implementation");
+ }
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java b/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java
deleted file mode 100644
index 0404625c..0000000
--- a/window/window-extensions/src/main/java/androidx/window/extensions/WindowLibraryInfo.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.window.extensions;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-
-/**
- * A class to return global information about the library. From this class you can get the
- * API level supported by the library.
- *
- * @see WindowLibraryInfo#getVendorApiLevel() ()
- */
-public class WindowLibraryInfo {
-
- private WindowLibraryInfo() {}
-
- /**
- * Returns the API level of the vendor library on the device. If the returned version is not
- * supported by the WindowManager library, then some functions may not be available or replaced
- * with stub implementations.
- *
- * The expected use case is for the WindowManager library to determine which APIs are
- * available and wrap the API so that app developers do not need to deal with the complexity.
- * @return the API level supported by the library.
- */
- public int getVendorApiLevel() {
- return 1;
- }
-
- @NonNull
- public static WindowLibraryInfo getInstance(@NonNull Context context) {
- return new WindowLibraryInfo();
- }
-}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
new file mode 100644
index 0000000..811d0b3
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityEmbeddingComponent.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import androidx.annotation.NonNull;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
+
+/**
+ * Extension component definition that is used by the WindowManager library to trigger custom
+ * OEM-provided methods for organizing activities that isn't covered by platform APIs.
+ *
+ * <p>This interface should be implemented by OEM and deployed to the target devices.
+ * @see androidx.window.extensions.WindowExtensions
+ */
+@ExperimentalWindowExtensionsApi
+public interface ActivityEmbeddingComponent {
+
+ /**
+ * Updates the rules of embedding activities that are started in the client process.
+ */
+ void setEmbeddingRules(@NonNull Set<EmbeddingRule> splitRules);
+
+ /**
+ * Sets the callback that notifies WM Jetpack about changes in split states from the Extensions
+ * Sidecar implementation. The callback is registered for the lifetime of the process.
+ */
+ @SuppressWarnings("ExecutorRegistration") // Jetpack will post it on the app-provided executor.
+ void setSplitInfoCallback(@NonNull Consumer<List<SplitInfo>> consumer);
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
new file mode 100644
index 0000000..dbf8233
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityRule.java
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+import java.util.function.Predicate;
+
+/**
+ * Split configuration rule for individual activities.
+ */
+@ExperimentalWindowExtensionsApi
+public class ActivityRule extends EmbeddingRule {
+ @NonNull
+ private final Predicate<Activity> mActivityPredicate;
+ @NonNull
+ private final Predicate<Intent> mIntentPredicate;
+ private final boolean mShouldAlwaysExpand;
+
+ ActivityRule(@NonNull Predicate<Activity> activityPredicate,
+ @NonNull Predicate<Intent> intentPredicate, boolean shouldAlwaysExpand) {
+ mActivityPredicate = activityPredicate;
+ mIntentPredicate = intentPredicate;
+ mShouldAlwaysExpand = shouldAlwaysExpand;
+ }
+
+ /**
+ * Checks if the rule is applicable to the provided activity.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean matchesActivity(@NonNull Activity activity) {
+ return mActivityPredicate.test(activity);
+ }
+
+ /**
+ * Checks if the rule is applicable to the provided activity intent.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean matchesIntent(@NonNull Intent intent) {
+ return mIntentPredicate.test(intent);
+ }
+
+ /**
+ * Indicates whether the activity or activities that are covered by this rule should always be
+ * launched in an expanded state and avoid the splits.
+ */
+ public boolean shouldAlwaysExpand() {
+ return mShouldAlwaysExpand;
+ }
+
+ /**
+ * Builder for {@link ActivityRule}.
+ */
+ public static final class Builder {
+ @NonNull
+ private final Predicate<Activity> mActivityPredicate;
+ @NonNull
+ private final Predicate<Intent> mIntentPredicate;
+ private boolean mAlwaysExpand;
+
+ public Builder(@NonNull Predicate<Activity> activityPredicate,
+ @NonNull Predicate<Intent> intentPredicate) {
+ mActivityPredicate = activityPredicate;
+ mIntentPredicate = intentPredicate;
+ }
+
+ /** @see ActivityRule#shouldAlwaysExpand() */
+ @NonNull
+ public Builder setShouldAlwaysExpand(boolean alwaysExpand) {
+ mAlwaysExpand = alwaysExpand;
+ return this;
+ }
+
+ /** Builds a new instance of {@link ActivityRule}. */
+ @NonNull
+ public ActivityRule build() {
+ return new ActivityRule(mActivityPredicate, mIntentPredicate, mAlwaysExpand);
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof ActivityRule)) return false;
+ ActivityRule that = (ActivityRule) o;
+ return mShouldAlwaysExpand == that.mShouldAlwaysExpand
+ && mActivityPredicate.equals(that.mActivityPredicate)
+ && mIntentPredicate.equals(that.mIntentPredicate);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mActivityPredicate.hashCode();
+ result = 31 * result + mIntentPredicate.hashCode();
+ result = 31 * result + (mShouldAlwaysExpand ? 1 : 0);
+ return result;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "ActivityRule{" + "mShouldAlwaysExpand=" + mShouldAlwaysExpand + '}';
+ }
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java
new file mode 100644
index 0000000..d805f9e
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/ActivityStack.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import android.app.Activity;
+
+import androidx.annotation.NonNull;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Description of a group of activities stacked on top of each other and shown as a single
+ * container, all within the same task.
+ */
+@ExperimentalWindowExtensionsApi
+public class ActivityStack {
+ @NonNull
+ private final List<Activity> mActivities;
+
+ public ActivityStack(@NonNull List<Activity> activities) {
+ mActivities = new ArrayList<>(activities);
+ }
+
+ @NonNull
+ public List<Activity> getActivities() {
+ return new ArrayList<>(mActivities);
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof ActivityStack)) return false;
+ ActivityStack that = (ActivityStack) o;
+ return mActivities.equals(that.mActivities);
+ }
+
+ @Override
+ public int hashCode() {
+ return mActivities.hashCode();
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "ActivityStack{" + "mActivities=" + mActivities + '}';
+ }
+}
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java
similarity index 63%
copy from compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
copy to window/window-extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java
index 7d09b6d..beac689 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/EmbeddingRule.java
@@ -13,15 +13,16 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-// GENERATED CODE - DO NOT MODIFY BY HAND
-package androidx.compose.material3.tokens
+package androidx.window.extensions.embedding;
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.unit.dp
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
-internal object Shape {
- val Large = RoundedCornerShape(8.0.dp)
- val Medium = RoundedCornerShape(8.0.dp)
- val Small = RoundedCornerShape(4.0.dp)
+/**
+ * Base interface for activity embedding rules. Used to group different types of rules together when
+ * updating from the core library.
+ */
+@ExperimentalWindowExtensionsApi
+public abstract class EmbeddingRule {
+ EmbeddingRule() {}
}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java
new file mode 100644
index 0000000..351fd1b
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitInfo.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import androidx.annotation.NonNull;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+/** Describes a split of two containers with activities. */
+@ExperimentalWindowExtensionsApi
+public class SplitInfo {
+ @NonNull
+ private final ActivityStack mPrimaryActivityStack;
+ @NonNull
+ private final ActivityStack mSecondaryActivityStack;
+ private final float mSplitRatio;
+
+ public SplitInfo(@NonNull ActivityStack primaryActivityStack,
+ @NonNull ActivityStack secondaryActivityStack, float splitRatio) {
+ mPrimaryActivityStack = primaryActivityStack;
+ mSecondaryActivityStack = secondaryActivityStack;
+ mSplitRatio = splitRatio;
+ }
+
+ @NonNull
+ public ActivityStack getPrimaryActivityStack() {
+ return mPrimaryActivityStack;
+ }
+
+ @NonNull
+ public ActivityStack getSecondaryActivityStack() {
+ return mSecondaryActivityStack;
+ }
+
+ public float getSplitRatio() {
+ return mSplitRatio;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SplitInfo)) return false;
+ SplitInfo that = (SplitInfo) o;
+ return Float.compare(that.mSplitRatio, mSplitRatio) == 0 && mPrimaryActivityStack.equals(
+ that.mPrimaryActivityStack) && mSecondaryActivityStack.equals(
+ that.mSecondaryActivityStack);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = mPrimaryActivityStack.hashCode();
+ result = result * 31 + mSecondaryActivityStack.hashCode();
+ result = result * 31 + (int) (mSplitRatio * 17);
+ return result;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "SplitInfo{"
+ + "mPrimaryActivityStack=" + mPrimaryActivityStack
+ + ", mSecondaryActivityStack=" + mSecondaryActivityStack
+ + ", mSplitRatio=" + mSplitRatio
+ + '}';
+ }
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java
new file mode 100644
index 0000000..8367cee
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitPairRule.java
@@ -0,0 +1,208 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.util.Pair;
+import android.view.WindowMetrics;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+import java.util.function.Predicate;
+
+/**
+ * Split configuration rules for activity pairs.
+ */
+@ExperimentalWindowExtensionsApi
+public class SplitPairRule extends SplitRule {
+ @NonNull
+ private final Predicate<Pair<Activity, Activity>> mActivityPairPredicate;
+ @NonNull
+ private final Predicate<Pair<Activity, Intent>> mActivityIntentPredicate;
+ private final boolean mFinishPrimaryWithSecondary;
+ private final boolean mFinishSecondaryWithPrimary;
+ private final boolean mClearTop;
+
+ SplitPairRule(float splitRatio, @LayoutDir int layoutDirection,
+ boolean finishPrimaryWithSecondary, boolean finishSecondaryWithPrimary,
+ boolean clearTop, @NonNull Predicate<Pair<Activity, Activity>> activityPairPredicate,
+ @NonNull Predicate<Pair<Activity, Intent>> activityIntentPredicate,
+ @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
+ super(parentWindowMetricsPredicate, splitRatio, layoutDirection);
+ mActivityPairPredicate = activityPairPredicate;
+ mActivityIntentPredicate = activityIntentPredicate;
+ mFinishPrimaryWithSecondary = finishPrimaryWithSecondary;
+ mFinishSecondaryWithPrimary = finishSecondaryWithPrimary;
+ mClearTop = clearTop;
+ }
+
+ /**
+ * Checks if the rule is applicable to the provided activities.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean matchesActivityPair(@NonNull Activity primaryActivity,
+ @NonNull Activity secondaryActivity) {
+ return mActivityPairPredicate.test(new Pair<>(primaryActivity, secondaryActivity));
+ }
+
+ /**
+ * Checks if the rule is applicable to the provided primary activity and secondary activity
+ * intent.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean matchesActivityIntentPair(@NonNull Activity primaryActivity,
+ @NonNull Intent secondaryActivityIntent) {
+ return mActivityIntentPredicate.test(new Pair<>(primaryActivity, secondaryActivityIntent));
+ }
+
+ /**
+ * When all activities are finished in the secondary container, the activity in the primary
+ * container that created the split should also be finished.
+ */
+ public boolean shouldFinishPrimaryWithSecondary() {
+ return mFinishPrimaryWithSecondary;
+ }
+
+ /**
+ * When all activities are finished in the primary container, the activities in the secondary
+ * container in the split should also be finished.
+ */
+ public boolean shouldFinishSecondaryWithPrimary() {
+ return mFinishSecondaryWithPrimary;
+ }
+
+ /**
+ * If there is an existing split with the same primary container, indicates whether the
+ * existing secondary container and all activities in it should be destroyed. Otherwise the new
+ * secondary will appear on top. Defaults to "true".
+ */
+ public boolean shouldClearTop() {
+ return mClearTop;
+ }
+
+ /**
+ * Builder for {@link SplitPairRule}.
+ */
+ public static final class Builder {
+ @NonNull
+ private final Predicate<Pair<Activity, Activity>> mActivityPairPredicate;
+ @NonNull
+ private final Predicate<Pair<Activity, Intent>> mActivityIntentPredicate;
+ @NonNull
+ private final Predicate<WindowMetrics> mParentWindowMetricsPredicate;
+ private float mSplitRatio;
+ @LayoutDir
+ private int mLayoutDirection;
+ private boolean mFinishPrimaryWithSecondary;
+ private boolean mFinishSecondaryWithPrimary;
+ private boolean mClearTop;
+
+ public Builder(@NonNull Predicate<Pair<Activity, Activity>> activityPairPredicate,
+ @NonNull Predicate<Pair<Activity, Intent>> activityIntentPredicate,
+ @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
+ mActivityPairPredicate = activityPairPredicate;
+ mActivityIntentPredicate = activityIntentPredicate;
+ mParentWindowMetricsPredicate = parentWindowMetricsPredicate;
+ }
+
+ /** @see SplitRule#getSplitRatio() */
+ @NonNull
+ public Builder setSplitRatio(float splitRatio) {
+ mSplitRatio = splitRatio;
+ return this;
+ }
+
+ /** @see SplitRule#getLayoutDirection() */
+ @NonNull
+ public Builder setLayoutDirection(@LayoutDir int layoutDirection) {
+ mLayoutDirection = layoutDirection;
+ return this;
+ }
+
+ /** @see SplitPairRule#shouldFinishPrimaryWithSecondary() */
+ @NonNull
+ public Builder setShouldFinishPrimaryWithSecondary(
+ boolean finishPrimaryWithSecondary) {
+ mFinishPrimaryWithSecondary = finishPrimaryWithSecondary;
+ return this;
+ }
+
+ /** @see SplitPairRule#shouldFinishSecondaryWithPrimary() */
+ @NonNull
+ public Builder setShouldFinishSecondaryWithPrimary(boolean finishSecondaryWithPrimary) {
+ mFinishSecondaryWithPrimary = finishSecondaryWithPrimary;
+ return this;
+ }
+
+ /** @see SplitPairRule#shouldClearTop() */
+ @NonNull
+ public Builder setShouldClearTop(boolean shouldClearTop) {
+ mClearTop = shouldClearTop;
+ return this;
+ }
+
+ /** Builds a new instance of {@link SplitPairRule}. */
+ @NonNull
+ public SplitPairRule build() {
+ return new SplitPairRule(mSplitRatio, mLayoutDirection,
+ mFinishPrimaryWithSecondary, mFinishSecondaryWithPrimary,
+ mClearTop, mActivityPairPredicate, mActivityIntentPredicate,
+ mParentWindowMetricsPredicate);
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SplitPairRule)) return false;
+ SplitPairRule that = (SplitPairRule) o;
+ return super.equals(o)
+ && mActivityPairPredicate.equals(that.mActivityPairPredicate)
+ && mActivityIntentPredicate.equals(that.mActivityIntentPredicate)
+ && mFinishPrimaryWithSecondary == that.mFinishPrimaryWithSecondary
+ && mFinishSecondaryWithPrimary == that.mFinishSecondaryWithPrimary
+ && mClearTop == that.mClearTop;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = super.hashCode();
+ result = 31 * result + mActivityPairPredicate.hashCode();
+ result = 31 * result + mActivityIntentPredicate.hashCode();
+ result = 31 * result + (mFinishPrimaryWithSecondary ? 1 : 0);
+ result = 31 * result + (mFinishSecondaryWithPrimary ? 1 : 0);
+ result = 31 * result + (mClearTop ? 1 : 0);
+ return result;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "SplitPairRule{"
+ + "mFinishPrimaryWithSecondary=" + mFinishPrimaryWithSecondary
+ + ", mFinishSecondaryWithPrimary=" + mFinishSecondaryWithPrimary
+ + ", mClearTop=" + mClearTop
+ + '}';
+ }
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java
new file mode 100644
index 0000000..df7407c
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitPlaceholderRule.java
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.content.Intent;
+import android.os.Build;
+import android.view.WindowMetrics;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+import java.util.function.Predicate;
+
+/**
+ * Split configuration rules for split placeholders - activities used to occupy additional
+ * available space on the side before the user selects content to show.
+ */
+@ExperimentalWindowExtensionsApi
+public class SplitPlaceholderRule extends SplitRule {
+ @NonNull
+ private final Predicate<Activity> mActivityPredicate;
+ @NonNull
+ private final Predicate<Intent> mIntentPredicate;
+ @NonNull
+ private final Intent mPlaceholderIntent;
+
+ SplitPlaceholderRule(@NonNull Intent placeholderIntent,
+ float splitRatio, @LayoutDir int layoutDirection,
+ @NonNull Predicate<Activity> activityPredicate,
+ @NonNull Predicate<Intent> intentPredicate,
+ @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
+ super(parentWindowMetricsPredicate, splitRatio, layoutDirection);
+ mActivityPredicate = activityPredicate;
+ mIntentPredicate = intentPredicate;
+ mPlaceholderIntent = placeholderIntent;
+ }
+
+ /**
+ * Checks if the rule is applicable to the provided activity.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean matchesActivity(@NonNull Activity activity) {
+ return mActivityPredicate.test(activity);
+ }
+
+ /**
+ * Checks if the rule is applicable to the provided activity intent.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean matchesIntent(@NonNull Intent intent) {
+ return mIntentPredicate.test(intent);
+ }
+
+ /**
+ * An {@link Intent} used by Extensions Sidecar to launch the placeholder when the space allows.
+ */
+ @NonNull
+ public Intent getPlaceholderIntent() {
+ return mPlaceholderIntent;
+ }
+
+ /**
+ * Builder for {@link SplitPlaceholderRule}.
+ */
+ public static final class Builder {
+ @NonNull
+ private final Predicate<Activity> mActivityPredicate;
+ @NonNull
+ private final Predicate<Intent> mIntentPredicate;
+ @NonNull
+ private final Predicate<WindowMetrics> mParentWindowMetricsPredicate;
+ @NonNull
+ private final Intent mPlaceholderIntent;
+ private float mSplitRatio;
+ @LayoutDir
+ private int mLayoutDirection;
+
+ public Builder(@NonNull Intent placeholderIntent,
+ @NonNull Predicate<Activity> activityPredicate,
+ @NonNull Predicate<Intent> intentPredicate,
+ @NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate) {
+ mActivityPredicate = activityPredicate;
+ mIntentPredicate = intentPredicate;
+ mPlaceholderIntent = placeholderIntent;
+ mParentWindowMetricsPredicate = parentWindowMetricsPredicate;
+ }
+
+ /** @see SplitRule#getSplitRatio() */
+ @NonNull
+ public Builder setSplitRatio(float splitRatio) {
+ mSplitRatio = splitRatio;
+ return this;
+ }
+
+ /** @see SplitRule#getLayoutDirection() */
+ @NonNull
+ public Builder setLayoutDirection(@LayoutDir int layoutDirection) {
+ mLayoutDirection = layoutDirection;
+ return this;
+ }
+
+ /** Builds a new instance of {@link SplitPlaceholderRule}. */
+ @NonNull
+ public SplitPlaceholderRule build() {
+ return new SplitPlaceholderRule(mPlaceholderIntent, mSplitRatio,
+ mLayoutDirection, mActivityPredicate, mIntentPredicate,
+ mParentWindowMetricsPredicate);
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SplitPlaceholderRule)) return false;
+ SplitPlaceholderRule that = (SplitPlaceholderRule) o;
+ return super.equals(o)
+ && mActivityPredicate.equals(that.mActivityPredicate)
+ && mIntentPredicate.equals(that.mIntentPredicate)
+ && mPlaceholderIntent.equals(that.mPlaceholderIntent);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = super.hashCode();
+ result = 31 * result + mActivityPredicate.hashCode();
+ result = 31 * result + mIntentPredicate.hashCode();
+ result = 31 * result + mPlaceholderIntent.hashCode();
+ return result;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "SplitPlaceholderRule{" + "mPlaceholderIntent=" + mPlaceholderIntent + '}';
+ }
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java
new file mode 100644
index 0000000..5fbe7ef
--- /dev/null
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/embedding/SplitRule.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.extensions.embedding;
+
+import android.annotation.SuppressLint;
+import android.os.Build;
+import android.util.LayoutDirection;
+import android.view.WindowMetrics;
+
+import androidx.annotation.IntDef;
+import androidx.annotation.NonNull;
+import androidx.annotation.RequiresApi;
+import androidx.window.extensions.ExperimentalWindowExtensionsApi;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.util.function.Predicate;
+
+/**
+ * Split configuration rules for activities that are launched to side in a split. Define when an
+ * activity that was launched in a side container from another activity should be shown
+ * side-by-side or on top of it, as well as the visual properties of the split. Can be applied to
+ * new activities started from the same process automatically by the embedding implementation on
+ * the device.
+ */
+@ExperimentalWindowExtensionsApi
+public abstract class SplitRule extends EmbeddingRule {
+ @NonNull
+ private final Predicate<WindowMetrics> mParentWindowMetricsPredicate;
+ private final float mSplitRatio;
+ @LayoutDir
+ private final int mLayoutDirection;
+
+ @IntDef({
+ LayoutDirection.LTR,
+ LayoutDirection.RTL,
+ LayoutDirection.LOCALE
+ })
+ @Retention(RetentionPolicy.SOURCE)
+ // Not called LayoutDirection to avoid conflict with android.util.LayoutDirection
+ @interface LayoutDir {}
+
+ SplitRule(@NonNull Predicate<WindowMetrics> parentWindowMetricsPredicate, float splitRatio,
+ @LayoutDir int layoutDirection) {
+ mParentWindowMetricsPredicate = parentWindowMetricsPredicate;
+ mSplitRatio = splitRatio;
+ mLayoutDirection = layoutDirection;
+ }
+
+ /**
+ * Verifies if the provided parent bounds allow to show the split containers side by side.
+ */
+ @SuppressLint("ClassVerificationFailure") // Only called by Extensions implementation on device.
+ @RequiresApi(api = Build.VERSION_CODES.N)
+ public boolean checkParentMetrics(@NonNull WindowMetrics parentMetrics) {
+ return mParentWindowMetricsPredicate.test(parentMetrics);
+ }
+
+ public float getSplitRatio() {
+ return mSplitRatio;
+ }
+
+ @LayoutDir
+ public int getLayoutDirection() {
+ return mLayoutDirection;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (!(o instanceof SplitRule)) return false;
+ SplitRule that = (SplitRule) o;
+ return Float.compare(that.mSplitRatio, mSplitRatio) == 0
+ && mParentWindowMetricsPredicate.equals(that.mParentWindowMetricsPredicate)
+ && mLayoutDirection == that.mLayoutDirection;
+ }
+
+ @Override
+ public int hashCode() {
+ int result = (int) (mSplitRatio * 17);
+ result = 31 * result + mParentWindowMetricsPredicate.hashCode();
+ result = 31 * result + mLayoutDirection;
+ return result;
+ }
+
+ @NonNull
+ @Override
+ public String toString() {
+ return "SplitRule{"
+ + "mSplitRatio=" + mSplitRatio
+ + ", mLayoutDirection=" + mLayoutDirection
+ + '}';
+ }
+}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
index dc71865..dc3d83c 100644
--- a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
+++ b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponent.java
@@ -17,10 +17,9 @@
package androidx.window.extensions.layout;
import android.app.Activity;
-import android.content.Context;
import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
+import androidx.window.extensions.WindowExtensions;
import java.util.function.Consumer;
@@ -36,7 +35,7 @@
* relevant logical areas.
*
* <p>This interface should be implemented by OEM and deployed to the target devices.
- * @see WindowLayoutComponentProvider
+ * @see WindowExtensions#getWindowLayoutComponent()
*/
public interface WindowLayoutComponent {
@@ -54,19 +53,4 @@
*/
public void removeWindowLayoutInfoListener(
@NonNull Consumer<WindowLayoutInfo> consumer);
-
- /**
- * Returns the OEM implementation of {@link WindowLayoutComponent} if it is supported on the
- * device. The implementation must match the API level reported in
- * {@link androidx.window.extensions.WindowLibraryInfo}. A {@code null} value may be returned
- * if the device does not support {@link WindowLayoutInfo}. If {@code null} is returned the
- * core library will ignore all features related to {@link WindowLayoutComponent}. Currently
- * the developer will receive a single callback with empty data where possible. For
- * synchronous methods we will return a default value or {@code null}.
- * @return the OEM implementation of {@link WindowLayoutComponent}
- */
- @Nullable
- public static WindowLayoutComponent getInstance(@NonNull Context context) {
- throw new UnsupportedOperationException("Stub, replace with implementation.");
- }
}
diff --git a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponentProvider.java b/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponentProvider.java
deleted file mode 100644
index 8e41db9..0000000
--- a/window/window-extensions/src/main/java/androidx/window/extensions/layout/WindowLayoutComponentProvider.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES 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.window.extensions.layout;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.window.extensions.WindowLibraryInfo;
-
-/**
- * A class to provide instances of {@link WindowLayoutComponent}. An OEM must implement
- * {@link WindowLayoutComponentProvider#isWindowLayoutComponentAvailable()} and
- * {@link WindowLayoutComponentProvider#getWindowLayoutComponent(Context)} for the core window
- * library to support {@link DisplayFeature}s. Any implementation of
- * {@link WindowLayoutComponent} must support the methods up to
- * {@link WindowLibraryInfo#getApiLevel()}
- */
-public class WindowLayoutComponentProvider {
-
- private WindowLayoutComponentProvider() {}
-
- /**
- * Returns {@code true} if {@link WindowLayoutComponent} is present on the device,
- * {@code false} otherwise.
- */
- public static boolean isWindowLayoutComponentAvailable() {
- throw new UnsupportedOperationException("Stub, replace with implementation.");
- }
-
- /**
- * Returns the OEM implementation of {@link WindowLayoutComponent} if it is supported on the
- * device. The implementation must match the API level reported in
- * {@link androidx.window.extensions.WindowLibraryInfo}. An
- * {@link UnsupportedOperationException} will be thrown if the device does not support
- * {@link WindowLayoutInfo}. Use
- * {@link WindowLayoutComponentProvider#isWindowLayoutComponentAvailable()} to determine if
- * {@link WindowLayoutComponent} is present.
- * @return the OEM implementation of {@link WindowLayoutComponent}
- */
- @NonNull
- public static WindowLayoutComponent getWindowLayoutComponent(@NonNull Context context) {
- throw new UnsupportedOperationException("Stub, replace with implementation.");
- }
-}
diff --git a/window/window/api/public_plus_experimental_1.0.0-beta03.txt b/window/window/api/public_plus_experimental_1.0.0-beta03.txt
index 78f1efe..983582a 100644
--- a/window/window/api/public_plus_experimental_1.0.0-beta03.txt
+++ b/window/window/api/public_plus_experimental_1.0.0-beta03.txt
@@ -6,6 +6,108 @@
}
+package androidx.window.embedding {
+
+ @androidx.window.core.ExperimentalWindowApi public final class ActivityFilter {
+ ctor public ActivityFilter(android.content.ComponentName componentName, String? intentAction);
+ method public android.content.ComponentName getComponentName();
+ method public String? getIntentAction();
+ method public boolean matchesActivity(android.app.Activity activity);
+ method public boolean matchesIntent(android.content.Intent intent);
+ property public final android.content.ComponentName componentName;
+ property public final String? intentAction;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class ActivityRule extends androidx.window.embedding.EmbeddingRule {
+ ctor public ActivityRule(java.util.Set<androidx.window.embedding.ActivityFilter> filters, optional boolean alwaysExpand);
+ method public boolean getAlwaysExpand();
+ method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
+ property public final boolean alwaysExpand;
+ property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class ActivityStack {
+ ctor public ActivityStack(java.util.List<? extends android.app.Activity> activities);
+ method public operator boolean contains(android.app.Activity activity);
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public abstract class EmbeddingRule {
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitController {
+ method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+ method public void clearRegisteredRules();
+ method public static androidx.window.embedding.SplitController getInstance();
+ method public java.util.Set<androidx.window.embedding.EmbeddingRule> getSplitRules();
+ method public static void initialize(android.content.Context context, int staticRuleResourceId);
+ method public boolean isSplitSupported();
+ method public void registerRule(androidx.window.embedding.EmbeddingRule rule);
+ method public void removeSplitListener(androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+ method public void unregisterRule(androidx.window.embedding.EmbeddingRule rule);
+ field public static final androidx.window.embedding.SplitController.Companion Companion;
+ }
+
+ public static final class SplitController.Companion {
+ method public androidx.window.embedding.SplitController getInstance();
+ method public void initialize(android.content.Context context, int staticRuleResourceId);
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitInfo {
+ method public operator boolean contains(android.app.Activity activity);
+ method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
+ method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
+ method public float getSplitRatio();
+ property public final androidx.window.embedding.ActivityStack primaryActivityStack;
+ property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
+ property public final float splitRatio;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitPairFilter {
+ ctor public SplitPairFilter(android.content.ComponentName primaryActivityName, android.content.ComponentName secondaryActivityName, String? secondaryActivityIntentAction);
+ method public android.content.ComponentName getPrimaryActivityName();
+ method public String? getSecondaryActivityIntentAction();
+ method public android.content.ComponentName getSecondaryActivityName();
+ method public boolean matchesActivityIntentPair(android.app.Activity primaryActivity, android.content.Intent secondaryActivityIntent);
+ method public boolean matchesActivityPair(android.app.Activity primaryActivity, android.app.Activity secondaryActivity);
+ property public final android.content.ComponentName primaryActivityName;
+ property public final String? secondaryActivityIntentAction;
+ property public final android.content.ComponentName secondaryActivityName;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitPairRule extends androidx.window.embedding.SplitRule {
+ ctor public SplitPairRule(java.util.Set<androidx.window.embedding.SplitPairFilter> filters, optional boolean finishPrimaryWithSecondary, optional boolean finishSecondaryWithPrimary, optional boolean clearTop, optional int minWidth, optional int minSmallestWidth, optional float splitRatio, optional int layoutDir);
+ method public boolean getClearTop();
+ method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
+ method public boolean getFinishPrimaryWithSecondary();
+ method public boolean getFinishSecondaryWithPrimary();
+ property public final boolean clearTop;
+ property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
+ property public final boolean finishPrimaryWithSecondary;
+ property public final boolean finishSecondaryWithPrimary;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
+ ctor public SplitPlaceholderRule(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent, optional int minWidth, optional int minSmallestWidth, optional float splitRatio, optional int layoutDirection);
+ method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
+ method public android.content.Intent getPlaceholderIntent();
+ property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
+ property public final android.content.Intent placeholderIntent;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public class SplitRule extends androidx.window.embedding.EmbeddingRule {
+ method public final boolean checkParentMetrics(android.view.WindowMetrics parentMetrics);
+ method public final int getLayoutDirection();
+ method public final int getMinSmallestWidth();
+ method public final int getMinWidth();
+ method public final float getSplitRatio();
+ property public final int layoutDirection;
+ property public final int minSmallestWidth;
+ property public final int minWidth;
+ property public final float splitRatio;
+ }
+
+}
+
package androidx.window.layout {
public interface DisplayFeature {
diff --git a/window/window/api/public_plus_experimental_current.txt b/window/window/api/public_plus_experimental_current.txt
index 78f1efe..983582a 100644
--- a/window/window/api/public_plus_experimental_current.txt
+++ b/window/window/api/public_plus_experimental_current.txt
@@ -6,6 +6,108 @@
}
+package androidx.window.embedding {
+
+ @androidx.window.core.ExperimentalWindowApi public final class ActivityFilter {
+ ctor public ActivityFilter(android.content.ComponentName componentName, String? intentAction);
+ method public android.content.ComponentName getComponentName();
+ method public String? getIntentAction();
+ method public boolean matchesActivity(android.app.Activity activity);
+ method public boolean matchesIntent(android.content.Intent intent);
+ property public final android.content.ComponentName componentName;
+ property public final String? intentAction;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class ActivityRule extends androidx.window.embedding.EmbeddingRule {
+ ctor public ActivityRule(java.util.Set<androidx.window.embedding.ActivityFilter> filters, optional boolean alwaysExpand);
+ method public boolean getAlwaysExpand();
+ method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
+ property public final boolean alwaysExpand;
+ property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class ActivityStack {
+ ctor public ActivityStack(java.util.List<? extends android.app.Activity> activities);
+ method public operator boolean contains(android.app.Activity activity);
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public abstract class EmbeddingRule {
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitController {
+ method public void addSplitListener(android.app.Activity activity, java.util.concurrent.Executor executor, androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+ method public void clearRegisteredRules();
+ method public static androidx.window.embedding.SplitController getInstance();
+ method public java.util.Set<androidx.window.embedding.EmbeddingRule> getSplitRules();
+ method public static void initialize(android.content.Context context, int staticRuleResourceId);
+ method public boolean isSplitSupported();
+ method public void registerRule(androidx.window.embedding.EmbeddingRule rule);
+ method public void removeSplitListener(androidx.core.util.Consumer<java.util.List<androidx.window.embedding.SplitInfo>> consumer);
+ method public void unregisterRule(androidx.window.embedding.EmbeddingRule rule);
+ field public static final androidx.window.embedding.SplitController.Companion Companion;
+ }
+
+ public static final class SplitController.Companion {
+ method public androidx.window.embedding.SplitController getInstance();
+ method public void initialize(android.content.Context context, int staticRuleResourceId);
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitInfo {
+ method public operator boolean contains(android.app.Activity activity);
+ method public androidx.window.embedding.ActivityStack getPrimaryActivityStack();
+ method public androidx.window.embedding.ActivityStack getSecondaryActivityStack();
+ method public float getSplitRatio();
+ property public final androidx.window.embedding.ActivityStack primaryActivityStack;
+ property public final androidx.window.embedding.ActivityStack secondaryActivityStack;
+ property public final float splitRatio;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitPairFilter {
+ ctor public SplitPairFilter(android.content.ComponentName primaryActivityName, android.content.ComponentName secondaryActivityName, String? secondaryActivityIntentAction);
+ method public android.content.ComponentName getPrimaryActivityName();
+ method public String? getSecondaryActivityIntentAction();
+ method public android.content.ComponentName getSecondaryActivityName();
+ method public boolean matchesActivityIntentPair(android.app.Activity primaryActivity, android.content.Intent secondaryActivityIntent);
+ method public boolean matchesActivityPair(android.app.Activity primaryActivity, android.app.Activity secondaryActivity);
+ property public final android.content.ComponentName primaryActivityName;
+ property public final String? secondaryActivityIntentAction;
+ property public final android.content.ComponentName secondaryActivityName;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitPairRule extends androidx.window.embedding.SplitRule {
+ ctor public SplitPairRule(java.util.Set<androidx.window.embedding.SplitPairFilter> filters, optional boolean finishPrimaryWithSecondary, optional boolean finishSecondaryWithPrimary, optional boolean clearTop, optional int minWidth, optional int minSmallestWidth, optional float splitRatio, optional int layoutDir);
+ method public boolean getClearTop();
+ method public java.util.Set<androidx.window.embedding.SplitPairFilter> getFilters();
+ method public boolean getFinishPrimaryWithSecondary();
+ method public boolean getFinishSecondaryWithPrimary();
+ property public final boolean clearTop;
+ property public final java.util.Set<androidx.window.embedding.SplitPairFilter> filters;
+ property public final boolean finishPrimaryWithSecondary;
+ property public final boolean finishSecondaryWithPrimary;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public final class SplitPlaceholderRule extends androidx.window.embedding.SplitRule {
+ ctor public SplitPlaceholderRule(java.util.Set<androidx.window.embedding.ActivityFilter> filters, android.content.Intent placeholderIntent, optional int minWidth, optional int minSmallestWidth, optional float splitRatio, optional int layoutDirection);
+ method public java.util.Set<androidx.window.embedding.ActivityFilter> getFilters();
+ method public android.content.Intent getPlaceholderIntent();
+ property public final java.util.Set<androidx.window.embedding.ActivityFilter> filters;
+ property public final android.content.Intent placeholderIntent;
+ }
+
+ @androidx.window.core.ExperimentalWindowApi public class SplitRule extends androidx.window.embedding.EmbeddingRule {
+ method public final boolean checkParentMetrics(android.view.WindowMetrics parentMetrics);
+ method public final int getLayoutDirection();
+ method public final int getMinSmallestWidth();
+ method public final int getMinWidth();
+ method public final float getSplitRatio();
+ property public final int layoutDirection;
+ property public final int minSmallestWidth;
+ property public final int minWidth;
+ property public final float splitRatio;
+ }
+
+}
+
package androidx.window.layout {
public interface DisplayFeature {
diff --git a/window/window/build.gradle b/window/window/build.gradle
index 77bdc9b..2cb727a 100644
--- a/window/window/build.gradle
+++ b/window/window/build.gradle
@@ -46,7 +46,7 @@
dependencies {
api(libs.kotlinStdlib)
api(libs.kotlinCoroutinesAndroid)
- implementation("androidx.annotation:annotation:1.1.0")
+ implementation("androidx.annotation:annotation:1.2.0")
implementation("androidx.collection:collection:1.1.0")
implementation("androidx.core:core:1.3.2")
@@ -74,6 +74,8 @@
androidTestImplementation(libs.truth)
androidTestImplementation(compileOnly(project(":window:window-extensions")))
androidTestImplementation(compileOnly(project(":window:window-sidecar")))
+
+ samples(project(":window:window-samples"))
}
androidx {
diff --git a/window/window/proguard-rules.pro b/window/window/proguard-rules.pro
index 63c9b44..7120349 100644
--- a/window/window/proguard-rules.pro
+++ b/window/window/proguard-rules.pro
@@ -18,6 +18,8 @@
# be tracked in b/165268619.
-keep class androidx.window.extensions.** { *; }
-dontwarn androidx.window.extensions.**
+-keep class androidx.window.extensions.embedding.** { *; }
+-dontwarn androidx.window.extensions.embedding.**
# Keep the whole library for now since there is a crash with a missing method.
# TODO(b/165268619) Make a narrow rule
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
new file mode 100644
index 0000000..f60a2b3
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityFilter.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import android.content.ComponentName
+import android.content.Intent
+import android.util.Log
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.MatcherUtils.sDebugMatchers
+import androidx.window.embedding.MatcherUtils.sMatchersTag
+
+/**
+ * Filter for [ActivityRule] that checks for component name match. Allows a wildcard symbol in the
+ * end or instead of the package name, and a wildcard symbol in the end or instead of the class
+ * name.
+ */
+@ExperimentalWindowApi
+class ActivityFilter(
+ /**
+ * Component name in the intent for the activity. Must be non-empty. Can contain a single
+ * wildcard at the end. Supported formats:
+ * <li>package/class</li>
+ * <li>package/\*</li>
+ * <li>package/suffix.\*</li>
+ * <li>\*\/\*</li>
+ */
+ val componentName: ComponentName,
+ /**
+ * Action used for activity launch intent.
+ */
+ val intentAction: String?
+) {
+ init {
+ val packageName = componentName.packageName
+ val className = componentName.className
+ require(
+ packageName.isNotEmpty()
+ ) { "Package name must not be empty" }
+ require(
+ className.isNotEmpty()
+ ) { "Activity class name must not be empty." }
+ require(
+ !(
+ packageName.contains("*") &&
+ packageName.indexOf("*") != packageName.length - 1
+ )
+ ) { "Wildcard in package name is only allowed at the end." }
+ require(
+ !(
+ className.contains("*") &&
+ className.indexOf("*") != className.length - 1
+ )
+ ) { "Wildcard in class name is only allowed at the end." }
+ }
+
+ fun matchesIntent(intent: Intent): Boolean {
+ val match =
+ if (!MatcherUtils.areComponentsMatching(intent.component, componentName)) {
+ false
+ } else {
+ intentAction == null || intentAction == intent.action
+ }
+ if (sDebugMatchers) {
+ val matchString = if (match) "MATCH" else "NO MATCH"
+ Log.w(
+ sMatchersTag,
+ "Checking filter $this against intent $intent: $matchString"
+ )
+ }
+ return match
+ }
+
+ fun matchesActivity(activity: Activity): Boolean {
+ // Check if the activity component names match
+ var match = MatcherUtils.areComponentsMatching(activity.componentName, componentName)
+ // If the intent is not empty - check that the rest of the filter fields match
+ if (activity.intent != null) {
+ match = match && matchesIntent(activity.intent)
+ }
+ if (sDebugMatchers) {
+ val matchString = if (match) "MATCH" else "NO MATCH"
+ Log.w(
+ sMatchersTag,
+ "Checking filter $this against activity $activity: $matchString"
+ )
+ }
+ return match
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is ActivityFilter) return false
+
+ if (componentName != other.componentName) return false
+ if (intentAction != other.intentAction) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = componentName.hashCode()
+ result = 31 * result + (intentAction?.hashCode() ?: 0)
+ return result
+ }
+
+ override fun toString(): String {
+ return "ActivityFilter(componentName=$componentName, intentAction=$intentAction)"
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt b/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt
new file mode 100644
index 0000000..a68e224
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityRule.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Layout configuration rules for individual activities with split layouts. Take precedence over
+ * [SplitPairRule].
+ */
+@ExperimentalWindowApi
+class ActivityRule(
+ /**
+ * Filters used to choose when to apply this rule.
+ */
+ filters: Set<ActivityFilter>,
+ /**
+ * Whether the activity should always be expanded on launch. Some activities are supposed to
+ * expand to the full task bounds, independent of the state of the split. An example is an
+ * activity that blocks all user interactions, like a warning dialog.
+ */
+ val alwaysExpand: Boolean = false
+) : EmbeddingRule() {
+ /**
+ * Read-only filters used to choose when to apply this rule.
+ */
+ val filters: Set<ActivityFilter> = filters.toSet()
+
+ /**
+ * Creates a new immutable instance by adding a filter to the set.
+ */
+ internal operator fun plus(filter: ActivityFilter): ActivityRule {
+ val newSet = mutableSetOf<ActivityFilter>()
+ newSet.addAll(filters)
+ newSet.add(filter)
+ return ActivityRule(
+ newSet.toSet(),
+ alwaysExpand
+ )
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is ActivityRule) return false
+
+ if (filters != other.filters) return false
+ if (alwaysExpand != other.alwaysExpand) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = filters.hashCode()
+ result = 31 * result + alwaysExpand.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt b/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
new file mode 100644
index 0000000..c4cd81b
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/ActivityStack.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * A container that holds a stack of activities, overlapping and bound to the same rectangle on the
+ * screen.
+ */
+@ExperimentalWindowApi
+class ActivityStack(internal val activities: List<Activity>) {
+ operator fun contains(activity: Activity): Boolean {
+ return activities.contains(activity)
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is ActivityStack) return false
+
+ if (activities != other.activities) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ return activities.hashCode()
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
new file mode 100644
index 0000000..6bc91b9
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingAdapter.kt
@@ -0,0 +1,149 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.content.Intent
+import android.util.Pair
+import android.view.WindowMetrics
+import androidx.window.core.ExperimentalWindowApi
+import java.lang.IllegalArgumentException
+import java.util.function.Predicate
+import androidx.window.extensions.embedding.ActivityRule.Builder as ActivityRuleBuilder
+import androidx.window.extensions.embedding.SplitPairRule.Builder as SplitPairRuleBuilder
+import androidx.window.extensions.embedding.SplitPlaceholderRule.Builder as SplitPlaceholderRuleBuilder
+
+/**
+ * Adapter class that translates data classes between Extension and Jetpack interfaces.
+ */
+@ExperimentalWindowApi
+internal class EmbeddingAdapter {
+ fun translate(
+ splitInfoList: List<androidx.window.extensions.embedding.SplitInfo>
+ ): List<SplitInfo> {
+ return splitInfoList.map(::translate)
+ }
+
+ private fun translate(splitInfo: androidx.window.extensions.embedding.SplitInfo): SplitInfo {
+ val primaryFragment = ActivityStack(
+ splitInfo.primaryActivityStack.activities
+ )
+ val secondaryFragment = ActivityStack(
+ splitInfo.secondaryActivityStack.activities
+ )
+ return SplitInfo(primaryFragment, secondaryFragment, splitInfo.splitRatio)
+ }
+
+ @SuppressLint("ClassVerificationFailure", "NewApi")
+ fun translateActivityPairPredicates(
+ splitPairFilters: Set<SplitPairFilter>
+ ): Predicate<Pair<Activity, Activity>> {
+ return Predicate<Pair<Activity, Activity>> {
+ (first, second) ->
+ splitPairFilters.any { filter -> filter.matchesActivityPair(first, second) }
+ }
+ }
+
+ @SuppressLint("ClassVerificationFailure", "NewApi")
+ fun translateActivityIntentPredicates(
+ splitPairFilters: Set<SplitPairFilter>
+ ): Predicate<Pair<Activity, Intent>> {
+ return Predicate<Pair<Activity, Intent>> {
+ (first, second) ->
+ splitPairFilters.any { filter -> filter.matchesActivityIntentPair(first, second) }
+ }
+ }
+
+ @SuppressLint("ClassVerificationFailure", "NewApi")
+ fun translateParentMetricsPredicate(
+ splitRule: SplitRule
+ ): Predicate<WindowMetrics> {
+ return Predicate<WindowMetrics> {
+ windowMetrics ->
+ splitRule.checkParentMetrics(windowMetrics)
+ }
+ }
+
+ @SuppressLint("ClassVerificationFailure", "NewApi")
+ fun translateActivityPredicates(
+ activityFilters: Set<ActivityFilter>
+ ): Predicate<Activity> {
+ return Predicate<Activity> {
+ activity ->
+ activityFilters.any { filter -> filter.matchesActivity(activity) }
+ }
+ }
+
+ @SuppressLint("ClassVerificationFailure", "NewApi")
+ fun translateIntentPredicates(
+ activityFilters: Set<ActivityFilter>
+ ): Predicate<Intent> {
+ return Predicate<Intent> {
+ intent ->
+ activityFilters.any { filter -> filter.matchesIntent(intent) }
+ }
+ }
+
+ fun translate(
+ rules: Set<EmbeddingRule>
+ ): Set<androidx.window.extensions.embedding.EmbeddingRule> {
+ return rules.map {
+ rule ->
+ when (rule) {
+ is SplitPairRule ->
+ SplitPairRuleBuilder(
+ translateActivityPairPredicates(rule.filters),
+ translateActivityIntentPredicates(rule.filters),
+ translateParentMetricsPredicate(rule)
+ )
+ .setSplitRatio(rule.splitRatio)
+ .setLayoutDirection(rule.layoutDirection)
+ .setShouldFinishPrimaryWithSecondary(rule.finishPrimaryWithSecondary)
+ .setShouldFinishSecondaryWithPrimary(rule.finishSecondaryWithPrimary)
+ .setShouldClearTop(rule.clearTop)
+ .build()
+ is SplitPlaceholderRule ->
+ SplitPlaceholderRuleBuilder(
+ rule.placeholderIntent,
+ translateActivityPredicates(rule.filters),
+ translateIntentPredicates(rule.filters),
+ translateParentMetricsPredicate(rule)
+ )
+ .setSplitRatio(rule.splitRatio)
+ .setLayoutDirection(rule.layoutDirection)
+ .build()
+ is ActivityRule ->
+ ActivityRuleBuilder(
+ translateActivityPredicates(rule.filters),
+ translateIntentPredicates(rule.filters)
+ )
+ .setShouldAlwaysExpand(rule.alwaysExpand)
+ .build()
+ else -> throw IllegalArgumentException("Unsupported rule type")
+ }
+ }.toSet()
+ }
+
+ private operator fun <F, S> Pair<F, S>.component1(): F {
+ return first
+ }
+
+ private operator fun <F, S> Pair<F, S>.component2(): S {
+ return second
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
new file mode 100644
index 0000000..6cfbe4a
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingBackend.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import androidx.core.util.Consumer
+import androidx.window.core.ExperimentalWindowApi
+import java.util.concurrent.Executor
+
+// TODO(b/191164045): Move to window-testing or adapt for testing otherwise.
+@ExperimentalWindowApi
+internal interface EmbeddingBackend {
+ fun setSplitRules(rules: Set<EmbeddingRule>)
+
+ fun getSplitRules(): Set<EmbeddingRule>
+
+ fun registerRule(rule: EmbeddingRule)
+
+ fun unregisterRule(rule: EmbeddingRule)
+
+ fun registerSplitListenerForActivity(
+ activity: Activity,
+ executor: Executor,
+ callback: Consumer<List<SplitInfo>>
+ )
+
+ fun unregisterSplitListenerForActivity(
+ consumer: Consumer<List<SplitInfo>>
+ )
+
+ fun isSplitSupported(): Boolean
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
new file mode 100644
index 0000000..c424280
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingCompat.kt
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.util.Log
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
+import androidx.window.extensions.WindowExtensionsProvider
+import androidx.window.extensions.embedding.ActivityEmbeddingComponent
+import androidx.window.extensions.embedding.SplitInfo
+import java.util.function.Consumer
+import androidx.window.extensions.embedding.EmbeddingRule as ExtensionsEmbeddingRule
+
+/**
+ * Adapter implementation for different historical versions of activity embedding OEM interface in
+ * [ActivityEmbeddingComponent]. Only supports the single current version in this implementation.
+ */
+@ExperimentalWindowApi
+internal class EmbeddingCompat constructor(
+ private val embeddingExtension: ActivityEmbeddingComponent,
+ private val adapter: EmbeddingAdapter
+) : EmbeddingInterfaceCompat {
+ constructor() : this(
+ if (isEmbeddingAvailable()) {
+ WindowExtensionsProvider.getWindowExtensions().getActivityEmbeddingComponent()
+ } else {
+ EmptyEmbeddingComponent()
+ },
+ EmbeddingAdapter()
+ )
+
+ override fun setSplitRules(rules: Set<EmbeddingRule>) {
+ embeddingExtension.setEmbeddingRules(adapter.translate(rules))
+ }
+
+ override fun setEmbeddingCallback(embeddingCallback: EmbeddingCallbackInterface) {
+ val translatingCallback = EmbeddingTranslatingCallback(embeddingCallback, adapter)
+ embeddingExtension.setSplitInfoCallback(translatingCallback)
+ }
+
+ companion object {
+ const val DEBUG = true
+ private const val TAG = "EmbeddingCompat"
+
+ fun getExtensionApiLevel(): Int? {
+ return try {
+ WindowExtensionsProvider.getWindowExtensions().vendorApiLevel
+ } catch (e: NoClassDefFoundError) {
+ if (DEBUG) {
+ Log.d(TAG, "Embedding extension version not found")
+ }
+ null
+ } catch (e: UnsupportedOperationException) {
+ if (DEBUG) {
+ Log.d(TAG, "Stub Extension")
+ }
+ null
+ }
+ }
+
+ fun isEmbeddingAvailable(): Boolean {
+ return try {
+ WindowExtensionsProvider.getWindowExtensions().isEmbeddingComponentAvailable
+ } catch (e: NoClassDefFoundError) {
+ if (DEBUG) {
+ Log.d(TAG, "Embedding extension version not found")
+ }
+ false
+ } catch (e: UnsupportedOperationException) {
+ if (DEBUG) {
+ Log.d(TAG, "Stub Extension")
+ }
+ false
+ }
+ }
+ }
+}
+
+// Empty implementation of the embedding component to use when the device doesn't provide one and
+// avoid null checks.
+private class EmptyEmbeddingComponent : ActivityEmbeddingComponent {
+ override fun setEmbeddingRules(splitRules: MutableSet<ExtensionsEmbeddingRule>) {
+ // empty
+ }
+
+ override fun setSplitInfoCallback(consumer: Consumer<MutableList<SplitInfo>>) {
+ // empty
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
new file mode 100644
index 0000000..8bd6d07
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingInterfaceCompat.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.extensions.embedding.ActivityEmbeddingComponent
+
+/**
+ * Adapter interface for different historical versions of activity embedding OEM interface in
+ * [ActivityEmbeddingComponent].
+ */
+@ExperimentalWindowApi
+internal interface EmbeddingInterfaceCompat {
+
+ fun setSplitRules(rules: Set<EmbeddingRule>)
+
+ fun setEmbeddingCallback(embeddingCallback: EmbeddingCallbackInterface)
+
+ interface EmbeddingCallbackInterface {
+ fun onSplitInfoChanged(splitInfo: List<SplitInfo>)
+ }
+}
\ No newline at end of file
diff --git a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt
similarity index 64%
copy from compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
copy to window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt
index 7d09b6d..6347b3a 100644
--- a/compose/material3/material3/src/commonMain/kotlin/androidx/compose/material3/tokens/Shape.kt
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingRule.kt
@@ -13,15 +13,14 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
-// GENERATED CODE - DO NOT MODIFY BY HAND
-package androidx.compose.material3.tokens
+package androidx.window.embedding
-import androidx.compose.foundation.shape.RoundedCornerShape
-import androidx.compose.ui.unit.dp
+import androidx.window.core.ExperimentalWindowApi
-internal object Shape {
- val Large = RoundedCornerShape(8.0.dp)
- val Medium = RoundedCornerShape(8.0.dp)
- val Small = RoundedCornerShape(4.0.dp)
-}
+/**
+ * Base abstract class for activity embedding presentation rules, such as [SplitPairRule] and
+ * [ActivityRule]. Allows grouping different rule types together when updating.
+ */
+@ExperimentalWindowApi
+abstract class EmbeddingRule internal constructor()
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/EmbeddingTranslatingCallback.kt b/window/window/src/main/java/androidx/window/embedding/EmbeddingTranslatingCallback.kt
new file mode 100644
index 0000000..f3ef6f6
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/EmbeddingTranslatingCallback.kt
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.annotation.SuppressLint
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
+import java.util.function.Consumer
+
+@SuppressLint("NewApi") // The callback is only used with extensions on SDK levels 30+.
+@ExperimentalWindowApi
+internal class EmbeddingTranslatingCallback(
+ private val callback: EmbeddingCallbackInterface,
+ private val adapter: EmbeddingAdapter
+) : Consumer<List<androidx.window.extensions.embedding.SplitInfo>> {
+ override fun accept(splitInfoList: List<androidx.window.extensions.embedding.SplitInfo>) {
+ callback.onSplitInfoChanged(adapter.translate(splitInfoList))
+ }
+}
diff --git a/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
new file mode 100644
index 0000000..9eb1f0e
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/ExtensionEmbeddingBackend.kt
@@ -0,0 +1,211 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import android.util.Log
+import androidx.annotation.GuardedBy
+import androidx.annotation.VisibleForTesting
+import androidx.core.util.Consumer
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.EmbeddingInterfaceCompat.EmbeddingCallbackInterface
+import java.util.concurrent.CopyOnWriteArrayList
+import java.util.concurrent.CopyOnWriteArraySet
+import java.util.concurrent.Executor
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+@ExperimentalWindowApi
+internal class ExtensionEmbeddingBackend @VisibleForTesting constructor(
+ @field:VisibleForTesting @field:GuardedBy(
+ "globalLock"
+ ) var embeddingExtension: EmbeddingInterfaceCompat?
+) : EmbeddingBackend {
+
+ @VisibleForTesting
+ val splitChangeCallbacks: CopyOnWriteArrayList<SplitListenerWrapper>
+ private val splitInfoEmbeddingCallback = EmbeddingCallbackImpl()
+
+ init {
+ splitChangeCallbacks = CopyOnWriteArrayList<SplitListenerWrapper>()
+ embeddingExtension?.setEmbeddingCallback(splitInfoEmbeddingCallback)
+ }
+
+ companion object {
+ @Volatile
+ private var globalInstance: ExtensionEmbeddingBackend? = null
+ private val globalLock = ReentrantLock()
+ private const val TAG = "EmbeddingBackend"
+
+ fun getInstance(): ExtensionEmbeddingBackend {
+ if (globalInstance == null) {
+ globalLock.withLock {
+ if (globalInstance == null) {
+ val embeddingExtension = initAndVerifyEmbeddingExtension()
+ globalInstance = ExtensionEmbeddingBackend(embeddingExtension)
+ }
+ }
+ }
+ return globalInstance!!
+ }
+
+ /**
+ * Loads an instance of [androidx.window.extensions.embedding.ActivityEmbeddingComponent]
+ * implemented by OEM if available on this device. This also verifies if the loaded
+ * implementation conforms to the declared API version.
+ */
+ private fun initAndVerifyEmbeddingExtension(): EmbeddingInterfaceCompat? {
+ var impl: EmbeddingInterfaceCompat? = null
+ try {
+ if (isExtensionVersionSupported(EmbeddingCompat.getExtensionApiLevel()) &&
+ EmbeddingCompat.isEmbeddingAvailable()
+ ) {
+ impl = EmbeddingCompat()
+ // TODO(b/190433400): Check API conformance
+ }
+ } catch (t: Throwable) {
+ if (EmbeddingCompat.DEBUG) {
+ Log.d(TAG, "Failed to load embedding extension: $t")
+ }
+ impl = null
+ }
+ if (impl == null) {
+ if (EmbeddingCompat.DEBUG) {
+ Log.d(TAG, "No supported embedding extension found")
+ }
+ }
+ return impl
+ }
+
+ /**
+ * Checks if the Extension version provided on this device is supported by the current
+ * version of the library.
+ */
+ @VisibleForTesting
+ fun isExtensionVersionSupported(extensionVersion: Int?): Boolean {
+ if (extensionVersion == null) {
+ return false
+ }
+
+ return extensionVersion >= 1
+ }
+ }
+
+ private val splitRules: CopyOnWriteArraySet<EmbeddingRule> =
+ CopyOnWriteArraySet<EmbeddingRule>()
+
+ override fun getSplitRules(): Set<EmbeddingRule> {
+ return splitRules
+ }
+
+ override fun setSplitRules(rules: Set<EmbeddingRule>) {
+ splitRules.clear()
+ splitRules.addAll(rules)
+ embeddingExtension?.setSplitRules(splitRules)
+ }
+
+ override fun registerRule(rule: EmbeddingRule) {
+ if (!splitRules.contains(rule)) {
+ splitRules.add(rule)
+ embeddingExtension?.setSplitRules(splitRules)
+ }
+ }
+
+ override fun unregisterRule(rule: EmbeddingRule) {
+ if (splitRules.contains(rule)) {
+ splitRules.remove(rule)
+ embeddingExtension?.setSplitRules(splitRules)
+ }
+ }
+
+ /**
+ * Wrapper around [Consumer<List<SplitInfo>>] that also includes the [Executor]
+ * on which the callback should run and the [Activity].
+ */
+ internal class SplitListenerWrapper(
+ private val activity: Activity,
+ private val executor: Executor,
+ val callback: Consumer<List<SplitInfo>>
+ ) {
+ private var lastValue: List<SplitInfo>? = null
+ fun accept(splitInfoList: List<SplitInfo>) {
+ val splitsWithActivity = splitInfoList.filter { splitState ->
+ splitState.contains(activity)
+ }
+ if (splitsWithActivity == lastValue) {
+ return
+ }
+ lastValue = splitsWithActivity
+ executor.execute { callback.accept(splitsWithActivity) }
+ }
+ }
+
+ override fun registerSplitListenerForActivity(
+ activity: Activity,
+ executor: Executor,
+ callback: Consumer<List<SplitInfo>>
+ ) {
+ globalLock.withLock {
+ if (embeddingExtension == null) {
+ if (EmbeddingCompat.DEBUG) {
+ Log.v(TAG, "Extension not loaded, skipping callback registration.")
+ }
+ callback.accept(emptyList())
+ return
+ }
+
+ val callbackWrapper = SplitListenerWrapper(activity, executor, callback)
+ splitChangeCallbacks.add(callbackWrapper)
+ if (splitInfoEmbeddingCallback.lastInfo != null) {
+ callbackWrapper.accept(splitInfoEmbeddingCallback.lastInfo!!)
+ } else {
+ callbackWrapper.accept(emptyList())
+ }
+ }
+ }
+
+ override fun unregisterSplitListenerForActivity(
+ consumer: Consumer<List<SplitInfo>>
+ ) {
+ globalLock.withLock {
+ for (callbackWrapper in splitChangeCallbacks) {
+ if (callbackWrapper.callback == consumer) {
+ splitChangeCallbacks.remove(callbackWrapper)
+ break
+ }
+ }
+ }
+ }
+
+ /**
+ * Extension callback implementation of the split information. Keeps track of last reported
+ * values.
+ */
+ internal inner class EmbeddingCallbackImpl : EmbeddingCallbackInterface {
+ var lastInfo: List<SplitInfo>? = null
+ override fun onSplitInfoChanged(splitInfo: List<SplitInfo>) {
+ lastInfo = splitInfo
+ for (callbackWrapper in splitChangeCallbacks) {
+ callbackWrapper.accept(splitInfo)
+ }
+ }
+ }
+
+ override fun isSplitSupported(): Boolean {
+ return embeddingExtension != null
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
new file mode 100644
index 0000000..3a239ca
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/MatcherUtils.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.content.ComponentName
+import android.util.Log
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Internal utils used for matching activities with embedding rules.
+ */
+@ExperimentalWindowApi
+internal object MatcherUtils {
+ /** Checks component match allowing wildcard patterns. */
+ internal fun areComponentsMatching(
+ activityComponent: ComponentName?,
+ ruleComponent: ComponentName
+ ): Boolean {
+ if (activityComponent == null) {
+ return ruleComponent.packageName == "*" && ruleComponent.className == "*"
+ }
+ require(
+ !activityComponent.toString().contains("*")
+ ) { "Wildcard can only be part of the rule." }
+
+ val packagesMatch = activityComponent.packageName == ruleComponent.packageName ||
+ wildcardMatch(activityComponent.packageName, ruleComponent.packageName)
+ val classesMatch = activityComponent.className == ruleComponent.className ||
+ wildcardMatch(activityComponent.className, ruleComponent.className)
+
+ if (sDebugMatchers) {
+ Log.d(
+ sMatchersTag,
+ "Checking match of $activityComponent with rule " +
+ "component $ruleComponent, " + "packages match: $packagesMatch, " +
+ "classes match: $classesMatch"
+ )
+ }
+ return packagesMatch && classesMatch
+ }
+
+ /**
+ * Checks if the provided name matches the pattern with a wildcard.
+ * @return {@code true} if the pattern contains a wildcard, and the pattern matches the
+ * provided name.
+ */
+ private fun wildcardMatch(name: String, pattern: String): Boolean {
+ if (!pattern.contains("*")) {
+ return false
+ }
+ if (pattern == "*") {
+ return true
+ }
+ require(
+ !(
+ pattern.indexOf("*") != pattern.lastIndexOf("*") ||
+ !pattern.endsWith("*")
+ )
+ ) { "Name pattern with a wildcard must only contain a single wildcard in the end" }
+ return name.startsWith(pattern.substring(0, pattern.length - 1))
+ }
+
+ internal const val sDebugMatchers = SplitController.sDebug
+ internal const val sMatchersTag = "SplitRuleResolution"
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitController.kt b/window/window/src/main/java/androidx/window/embedding/SplitController.kt
new file mode 100644
index 0000000..90cbe20
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitController.kt
@@ -0,0 +1,155 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import android.content.Context
+import androidx.core.util.Consumer
+import androidx.window.core.ExperimentalWindowApi
+import java.util.concurrent.Executor
+import java.util.concurrent.locks.ReentrantLock
+import kotlin.concurrent.withLock
+
+/**
+ * Controller class that will be used to get information about the currently active activity splits,
+ * as well as provide interaction points to customize them and form new splits. A split is a pair of
+ * containers that host activities in the same or different tasks, combined under the same parent
+ * window of the hosting task.
+ * <p>A pair of activities can be put into split by providing a static or runtime split rule and
+ * launching activity in the same task and process using [android.content.Context.startActivity].
+ * <p>This class should be configured before [android.app.Application.onCreate] for upcoming
+ * activity launches using the split rules statically defined in an XML using
+ * [androidx.startup.Initializer] and [Companion.initialize]. See Jetpack App Startup reference
+ * for more information.
+ */
+@ExperimentalWindowApi
+class SplitController private constructor() {
+ private val embeddingBackend: EmbeddingBackend = ExtensionEmbeddingBackend.getInstance()
+ private var staticSplitRules: Set<EmbeddingRule> = emptySet()
+
+ /**
+ * Returns a copy of the currently applied split configurations.
+ */
+ fun getSplitRules(): Set<EmbeddingRule> {
+ return embeddingBackend.getSplitRules().toSet()
+ }
+
+ /**
+ * Registers a new runtime rule. Will be cleared automatically when the process is stopped.
+ */
+ fun registerRule(rule: EmbeddingRule) {
+ embeddingBackend.registerRule(rule)
+ }
+
+ /**
+ * Unregisters a runtime rule that was previously registered via [SplitController.registerRule].
+ */
+ fun unregisterRule(rule: EmbeddingRule) {
+ embeddingBackend.unregisterRule(rule)
+ }
+
+ /**
+ * Unregisters all runtime rules added with [registerRule].
+ */
+ fun clearRegisteredRules() {
+ embeddingBackend.setSplitRules(staticSplitRules)
+ }
+
+ /**
+ * Registers a listener for updates about the active split state(s) that this
+ * activity is part of. An activity can be in zero, one or more active splits.
+ * More than one active split is possible if an activity created multiple
+ * containers to side, stacked on top of each other. Or it can be in two
+ * different splits at the same time - in a secondary container for one (it was
+ * launched to the side) and in the primary for another (it launched another
+ * activity to the side). The reported splits in the list are ordered from
+ * bottom to top by their z-order, more recent splits appearing later.
+ * Guaranteed to be called at least once to report the most recent state.
+ */
+ fun addSplitListener(
+ activity: Activity,
+ executor: Executor,
+ consumer: Consumer<List<SplitInfo>>
+ ) {
+ embeddingBackend.registerSplitListenerForActivity(activity, executor, consumer)
+ }
+
+ /**
+ * Unregisters a listener for updates about the active split states.
+ */
+ fun removeSplitListener(
+ consumer: Consumer<List<SplitInfo>>
+ ) {
+ embeddingBackend.unregisterSplitListenerForActivity(consumer)
+ }
+
+ /**
+ * Indicates whether the split functionality is supported on the device. Note
+ * that the device might enable splits in all conditions, but it should be
+ * available in some states that the device supports. An example can be a
+ * foldable device with multiple screens can choose to collapse all splits for
+ * apps running on a small display, but enable when running on a larger
+ * one - on such devices this method will always return "true".
+ * If the split is not supported, activities will be launched on top, following
+ * the regular model.
+ */
+ fun isSplitSupported(): Boolean {
+ return embeddingBackend.isSplitSupported()
+ }
+
+ private fun setStaticSplitRules(staticRules: Set<EmbeddingRule>) {
+ staticSplitRules = staticRules
+ embeddingBackend.setSplitRules(staticRules)
+ }
+
+ companion object {
+ @Volatile
+ private var globalInstance: SplitController? = null
+ private val globalLock = ReentrantLock()
+
+ internal const val sDebug = false
+
+ /**
+ * Gets the shared instance of the class.
+ */
+ @JvmStatic
+ fun getInstance(): SplitController {
+ if (globalInstance == null) {
+ globalLock.withLock {
+ if (globalInstance == null) {
+ globalInstance = SplitController()
+ }
+ }
+ }
+ return globalInstance!!
+ }
+
+ /**
+ * Initializes the shared class instance with the split rules statically defined in an
+ * app-provided XML. The rules will be kept for the lifetime of the application process.
+ * <p>It's recommended to set the static rules via an [androidx.startup.Initializer], so
+ * that they are applied early in the application startup before any activities appear.
+ */
+ @JvmStatic
+ fun initialize(context: Context, staticRuleResourceId: Int) {
+ val parser = SplitRuleParser()
+ val configs = parser.parseSplitRules(context, staticRuleResourceId)
+ val controllerInstance = getInstance()
+ controllerInstance.setStaticSplitRules(configs ?: emptySet())
+ }
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt b/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
new file mode 100644
index 0000000..86ce7b4
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitInfo.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import androidx.window.core.ExperimentalWindowApi
+
+/** Describes a split pair of two containers with activities. */
+@ExperimentalWindowApi
+class SplitInfo internal constructor(
+ val primaryActivityStack: ActivityStack,
+ val secondaryActivityStack: ActivityStack,
+ val splitRatio: Float
+) {
+ operator fun contains(activity: Activity): Boolean {
+ return primaryActivityStack.contains(activity) ||
+ secondaryActivityStack.contains(activity)
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is SplitInfo) return false
+
+ if (primaryActivityStack != other.primaryActivityStack) return false
+ if (secondaryActivityStack != other.secondaryActivityStack) return false
+ if (splitRatio != other.splitRatio) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = primaryActivityStack.hashCode()
+ result = 31 * result + secondaryActivityStack.hashCode()
+ result = 31 * result + splitRatio.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
new file mode 100644
index 0000000..9116198
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairFilter.kt
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.app.Activity
+import android.content.ComponentName
+import android.content.Intent
+import android.util.Log
+import androidx.window.core.ExperimentalWindowApi
+import androidx.window.embedding.MatcherUtils.areComponentsMatching
+import androidx.window.embedding.MatcherUtils.sDebugMatchers
+import androidx.window.embedding.MatcherUtils.sMatchersTag
+
+/**
+ * Filter used to find if a pair of activities should be put in a split. Applied to the base /
+ * primary activity and an intent starting a secondary activity.
+ */
+@ExperimentalWindowApi
+class SplitPairFilter(
+ /**
+ * Component name of the primary activity in the split. Must be non-empty. Can contain a single
+ * wildcard at the end.
+ * Supported formats: "package/class", "package/*", "package/suffix.*",
+ * "*/*"
+ */
+ val primaryActivityName: ComponentName,
+ /**
+ * Component name in the intent for the secondary activity in the split. Must be non-empty.
+ * Can contain a single wildcard at the end.
+ * Supported formats:
+ * <li>package/class</li>
+ * <li>package/\*</li>
+ * <li>package/suffix.\*</li>
+ * <li>\*\/\*</li>
+ */
+ val secondaryActivityName: ComponentName,
+ /**
+ * Action used for secondary activity launch.
+ */
+ val secondaryActivityIntentAction: String?
+) {
+ fun matchesActivityPair(primaryActivity: Activity, secondaryActivity: Activity): Boolean {
+ // Check if the activity component names match
+ var match = areComponentsMatching(primaryActivity.componentName, primaryActivityName) &&
+ areComponentsMatching(secondaryActivity.componentName, secondaryActivityName)
+ // If the intent is not empty - check that the rest of the filter fields match
+ if (secondaryActivity.intent != null) {
+ match = match && matchesActivityIntentPair(primaryActivity, secondaryActivity.intent)
+ }
+
+ if (sDebugMatchers) {
+ val matchString = if (match) "MATCH" else "NO MATCH"
+ Log.d(
+ sMatchersTag,
+ "Checking filter $this against activity pair: (${primaryActivity.componentName}, " +
+ "${secondaryActivity.componentName}) - $matchString"
+ )
+ }
+ return match
+ }
+
+ fun matchesActivityIntentPair(
+ primaryActivity: Activity,
+ secondaryActivityIntent: Intent
+ ): Boolean {
+ val inPrimaryActivityName = primaryActivity.componentName
+ val match = if (
+ !areComponentsMatching(inPrimaryActivityName, primaryActivityName)
+ ) {
+ false
+ } else if (
+ !areComponentsMatching(secondaryActivityIntent.component, secondaryActivityName)
+ ) {
+ false
+ } else {
+ secondaryActivityIntentAction == null ||
+ secondaryActivityIntentAction == secondaryActivityIntent.action
+ }
+ if (sDebugMatchers) {
+ val matchString = if (match) "MATCH" else "NO MATCH"
+ Log.w(
+ sMatchersTag,
+ "Checking filter $this against activity-intent pair: " +
+ "(${primaryActivity.componentName}, $secondaryActivityIntent) - $matchString"
+ )
+ }
+ return match
+ }
+
+ init {
+ val primaryPackageName = primaryActivityName.packageName
+ val primaryClassName = primaryActivityName.className
+ val secondaryPackageName = secondaryActivityName.packageName
+ val secondaryClassName = secondaryActivityName.className
+ require(
+ !(primaryPackageName.isEmpty() || secondaryPackageName.isEmpty())
+ ) { "Package name must not be empty" }
+ require(
+ !(primaryClassName.isEmpty() || secondaryClassName.isEmpty())
+ ) { "Activity class name must not be empty." }
+ require(
+ !(
+ primaryPackageName.contains("*") &&
+ primaryPackageName.indexOf("*") != primaryPackageName.length - 1
+ )
+ ) { "Wildcard in package name is only allowed at the end." }
+ require(
+ !(
+ primaryClassName.contains("*") &&
+ primaryClassName.indexOf("*") != primaryClassName.length - 1
+ )
+ ) { "Wildcard in class name is only allowed at the end." }
+ require(
+ !(
+ secondaryPackageName.contains("*") &&
+ secondaryPackageName.indexOf("*") != secondaryPackageName.length - 1
+ )
+ ) { "Wildcard in package name is only allowed at the end." }
+ require(
+ !(
+ secondaryClassName.contains("*") &&
+ secondaryClassName.indexOf("*") != secondaryClassName.length - 1
+ )
+ ) { "Wildcard in class name is only allowed at the end." }
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is SplitPairFilter) return false
+
+ if (primaryActivityName != other.primaryActivityName) return false
+ if (secondaryActivityName != other.secondaryActivityName) return false
+ if (secondaryActivityIntentAction != other.secondaryActivityIntentAction) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = primaryActivityName.hashCode()
+ result = 31 * result + secondaryActivityName.hashCode()
+ result = 31 * result + (secondaryActivityIntentAction?.hashCode() ?: 0)
+ return result
+ }
+
+ override fun toString(): String {
+ return "SplitPairFilter{primaryActivityName=$primaryActivityName, " +
+ "secondaryActivityName=$secondaryActivityName, " +
+ "secondaryActivityAction=$secondaryActivityIntentAction}"
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
new file mode 100644
index 0000000..408c408
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPairRule.kt
@@ -0,0 +1,112 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.util.LayoutDirection
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Split configuration rules for activity pairs. Define when activities that were launched on top of
+ * each other should be shown side-by-side, and the visual properties of such splits. Can be set
+ * either statically via [SplitController.Companion.initialize] or at runtime via
+ * [SplitController.registerRule]. The rules can only be applied to activities that
+ * belong to the same application and are running in the same process. The rules are always
+ * applied only to activities that will be started after the rules were set.
+ */
+@ExperimentalWindowApi
+class SplitPairRule(
+ /**
+ * Filters used to choose when to apply this rule.
+ */
+ filters: Set<SplitPairFilter>,
+
+ /**
+ * When all activities are finished in the secondary container, the activity in the primary
+ * container that created the split should also be finished.
+ */
+ val finishPrimaryWithSecondary: Boolean = false,
+
+ /**
+ * When all activities are finished in the primary container, the activities in the secondary
+ * container in the split should also be finished.
+ */
+ val finishSecondaryWithPrimary: Boolean = true,
+
+ /**
+ * If there is an existing split with the same primary container, indicates whether the
+ * existing secondary container on top and all activities in it should be destroyed when a new
+ * split is created using this rule. Otherwise the new secondary will appear on top by default.
+ */
+ val clearTop: Boolean = false,
+
+ minWidth: Int = 0,
+ minSmallestWidth: Int = 0,
+ splitRatio: Float = 0.5f,
+ @LayoutDir
+ layoutDir: Int = LayoutDirection.LOCALE,
+) : SplitRule(
+ minWidth,
+ minSmallestWidth,
+ splitRatio,
+ layoutDir
+) {
+ /**
+ * Read-only filters used to choose when to apply this rule.
+ */
+ val filters: Set<SplitPairFilter> = filters.toSet()
+
+ /**
+ * Creates a new immutable instance by adding a filter to the set.
+ */
+ internal operator fun plus(filter: SplitPairFilter): SplitPairRule {
+ val newSet = mutableSetOf<SplitPairFilter>()
+ newSet.addAll(filters)
+ newSet.add(filter)
+ return SplitPairRule(
+ newSet.toSet(),
+ finishPrimaryWithSecondary,
+ finishSecondaryWithPrimary,
+ clearTop,
+ minWidth,
+ minSmallestWidth,
+ splitRatio,
+ layoutDirection
+ )
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is SplitPairRule) return false
+
+ if (!super.equals(other)) return false
+ if (filters != other.filters) return false
+ if (finishPrimaryWithSecondary != other.finishPrimaryWithSecondary) return false
+ if (finishSecondaryWithPrimary != other.finishSecondaryWithPrimary) return false
+ if (clearTop != other.clearTop) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = super.hashCode()
+ result = 31 * result + filters.hashCode()
+ result = 31 * result + finishPrimaryWithSecondary.hashCode()
+ result = 31 * result + finishSecondaryWithPrimary.hashCode()
+ result = 31 * result + clearTop.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
new file mode 100644
index 0000000..3b7ffdd
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitPlaceholderRule.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.content.Intent
+import android.util.LayoutDirection
+import androidx.window.core.ExperimentalWindowApi
+
+/**
+ * Configuration rules for split placeholders.
+ */
+@ExperimentalWindowApi
+class SplitPlaceholderRule(
+ /**
+ * Filters used to choose when to apply this rule.
+ */
+ filters: Set<ActivityFilter>,
+
+ /**
+ * Intent to launch the placeholder activity.
+ */
+ val placeholderIntent: Intent,
+
+ minWidth: Int = 0,
+ minSmallestWidth: Int = 0,
+ splitRatio: Float = 0.5f,
+ @LayoutDir
+ layoutDirection: Int = LayoutDirection.LOCALE
+) : SplitRule(
+ minWidth,
+ minSmallestWidth,
+ splitRatio,
+ layoutDirection
+) {
+ /**
+ * Read-only filters used to choose when to apply this rule.
+ */
+ val filters: Set<ActivityFilter> = filters.toSet()
+
+ /**
+ * Creates a new immutable instance by adding a filter to the set.
+ */
+ internal operator fun plus(filter: ActivityFilter): SplitPlaceholderRule {
+ val newSet = mutableSetOf<ActivityFilter>()
+ newSet.addAll(filters)
+ newSet.add(filter)
+ return SplitPlaceholderRule(
+ newSet.toSet(),
+ placeholderIntent,
+ minWidth,
+ minSmallestWidth,
+ splitRatio,
+ layoutDirection
+ )
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is SplitPlaceholderRule) return false
+ if (!super.equals(other)) return false
+
+ if (!super.equals(other)) return false
+ if (filters != other.filters) return false
+ if (placeholderIntent != other.placeholderIntent) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = super.hashCode()
+ result = 31 * result + filters.hashCode()
+ result = 31 * result + placeholderIntent.hashCode()
+ return result
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitRule.kt b/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
new file mode 100644
index 0000000..947659f
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitRule.kt
@@ -0,0 +1,117 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.graphics.Rect
+import android.os.Build
+import android.util.LayoutDirection
+import android.view.WindowMetrics
+import androidx.annotation.DoNotInline
+import androidx.annotation.IntDef
+import androidx.annotation.RequiresApi
+import androidx.window.core.ExperimentalWindowApi
+import kotlin.math.min
+
+/**
+ * Split configuration rules for activities that are launched to side in a split.
+ * Define the visual properties of the split. Can be set either statically via
+ * [SplitController.Companion.initialize] or at runtime via
+ * [SplitController.registerRule]. The rules can only be applied to activities that
+ * belong to the same application and are running in the same process. The rules are always
+ * applied only to activities that will be started after the rules were set.
+ */
+@ExperimentalWindowApi
+open class SplitRule internal constructor(
+ /**
+ * The smallest value of width of the parent window when the split should be used, in pixels.
+ * When the window size is smaller than requested here, activities in the secondary container
+ * will be stacked on top of the activities in the primary one, completely overlapping them. If
+ * not set, the system will default to splitting at 600dp.
+ */
+ val minWidth: Int = 0,
+
+ /**
+ * The smallest value of the smallest possible width of the parent window in any rotation
+ * when the split should be used, in pixels. When the window size is smaller than requested
+ * here, activities in the secondary container will be stacked on top of the activities in
+ * the primary one, completely overlapping them. If not set, the system will default to
+ * splitting at sw600dp.
+ */
+ val minSmallestWidth: Int = 0,
+
+ /**
+ * Defines what part of the width should be given to the primary activity. Defaults to an
+ * equal width split.
+ */
+ val splitRatio: Float = 0.5f,
+
+ /**
+ * The layout direction for the split.
+ */
+ @LayoutDir
+ val layoutDirection: Int = LayoutDirection.LOCALE
+) : EmbeddingRule() {
+
+ @IntDef(LayoutDirection.LTR, LayoutDirection.RTL, LayoutDirection.LOCALE)
+ @Retention(AnnotationRetention.SOURCE)
+ // Not called LayoutDirection to avoid conflict with android.util.LayoutDirection
+ internal annotation class LayoutDir
+
+ /**
+ * Verifies if the provided parent bounds allow to show the split containers side by side.
+ */
+ fun checkParentMetrics(parentMetrics: WindowMetrics): Boolean {
+ if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
+ return false
+ }
+ val bounds = Api30Impl.getBounds(parentMetrics)
+ val validMinWidth = (minWidth == 0 || bounds.width() >= minWidth)
+ val validSmallestMinWidth = (
+ minSmallestWidth == 0 ||
+ min(bounds.width(), bounds.height()) >= minSmallestWidth
+ )
+ return validMinWidth && validSmallestMinWidth
+ }
+
+ @RequiresApi(30)
+ internal object Api30Impl {
+ @DoNotInline
+ fun getBounds(windowMetrics: WindowMetrics): Rect {
+ return windowMetrics.bounds
+ }
+ }
+
+ override fun equals(other: Any?): Boolean {
+ if (this === other) return true
+ if (other !is SplitRule) return false
+
+ if (minWidth != other.minWidth) return false
+ if (minSmallestWidth != other.minSmallestWidth) return false
+ if (splitRatio != other.splitRatio) return false
+ if (layoutDirection != other.layoutDirection) return false
+
+ return true
+ }
+
+ override fun hashCode(): Int {
+ var result = minWidth
+ result = 31 * result + minSmallestWidth
+ result = 31 * result + splitRatio.hashCode()
+ result = 31 * result + layoutDirection
+ return result
+ }
+}
\ No newline at end of file
diff --git a/window/window/src/main/java/androidx/window/embedding/SplitRuleParser.kt b/window/window/src/main/java/androidx/window/embedding/SplitRuleParser.kt
new file mode 100644
index 0000000..0f97894
--- /dev/null
+++ b/window/window/src/main/java/androidx/window/embedding/SplitRuleParser.kt
@@ -0,0 +1,304 @@
+/*
+ * Copyright 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES 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.window.embedding
+
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.content.res.XmlResourceParser
+import android.util.LayoutDirection
+
+import androidx.window.R
+import androidx.window.core.ExperimentalWindowApi
+
+import org.xmlpull.v1.XmlPullParser
+
+/**
+ * Parses the static split rules defined in XML.
+ */
+@ExperimentalWindowApi
+internal class SplitRuleParser {
+
+ internal fun parseSplitRules(context: Context, staticRuleResourceId: Int): Set<EmbeddingRule>? {
+ return parseSplitXml(context, staticRuleResourceId)
+ }
+
+ private fun parseSplitXml(context: Context, splitResourceId: Int): Set<EmbeddingRule>? {
+ val resources = context.resources
+ val parser: XmlResourceParser
+ try {
+ parser = resources.getXml(splitResourceId)
+ } catch (e: Resources.NotFoundException) {
+ // Can't find the XML defining the split config
+ return null
+ }
+
+ val splitRuleConfigs = HashSet<EmbeddingRule>()
+
+ val depth = parser.depth
+ var type = parser.next()
+ var lastSplitPairConfig: SplitPairRule? = null
+ var lastSplitPlaceholderConfig: SplitPlaceholderRule? = null
+ var lastSplitActivityConfig: ActivityRule? = null
+ while (type != XmlPullParser.END_DOCUMENT &&
+ (type != XmlPullParser.END_TAG || parser.depth > depth)
+ ) {
+ if (parser.eventType != XmlPullParser.START_TAG || "split-config" == parser.name) {
+ type = parser.next()
+ continue
+ }
+ when (parser.name) {
+ "SplitPairRule" -> {
+ val splitConfig = parseSplitPairRule(context, parser)
+ lastSplitPairConfig = splitConfig
+ splitRuleConfigs.add(lastSplitPairConfig)
+ lastSplitPlaceholderConfig = null
+ lastSplitActivityConfig = null
+ }
+ "SplitPlaceholderRule" -> {
+ val placeholderConfig = parseSplitPlaceholderRule(context, parser)
+ lastSplitPlaceholderConfig = placeholderConfig
+ splitRuleConfigs.add(lastSplitPlaceholderConfig)
+ lastSplitActivityConfig = null
+ lastSplitPairConfig = null
+ }
+ "SplitPairFilter" -> {
+ if (lastSplitPairConfig == null) {
+ throw IllegalArgumentException(
+ "Found orphaned SplitPairFilter outside of SplitPairRule"
+ )
+ }
+ val splitFilter = parseSplitPairFilter(context, parser)
+ splitRuleConfigs.remove(lastSplitPairConfig)
+ lastSplitPairConfig += splitFilter
+ splitRuleConfigs.add(lastSplitPairConfig)
+ }
+ "ActivityRule" -> {
+ val activityConfig = parseSplitActivityRule(context, parser)
+ splitRuleConfigs.add(activityConfig)
+ lastSplitPairConfig = null
+ lastSplitPlaceholderConfig = null
+ lastSplitActivityConfig = activityConfig
+ }
+ "ActivityFilter" -> {
+ if (lastSplitActivityConfig == null && lastSplitPlaceholderConfig == null) {
+ throw IllegalArgumentException(
+ "Found orphaned ActivityFilter"
+ )
+ }
+ val activityFilter = parseActivityFilter(context, parser)
+ if (lastSplitActivityConfig != null) {
+ splitRuleConfigs.remove(lastSplitActivityConfig)
+ lastSplitActivityConfig += activityFilter
+ splitRuleConfigs.add(lastSplitActivityConfig)
+ } else if (lastSplitPlaceholderConfig != null) {
+ splitRuleConfigs.remove(lastSplitPlaceholderConfig)
+ lastSplitPlaceholderConfig += activityFilter
+ splitRuleConfigs.add(lastSplitPlaceholderConfig)
+ }
+ }
+ }
+ type = parser.next()
+ }
+
+ return splitRuleConfigs
+ }
+
+ private fun parseSplitPairRule(
+ context: Context,
+ parser: XmlResourceParser
+ ): SplitPairRule {
+ val ratio: Float
+ val minWidth: Int
+ val minSmallestWidth: Int
+ val layoutDir: Int
+ val finishPrimaryWithSecondary: Boolean
+ val finishSecondaryWithPrimary: Boolean
+ val clearTop: Boolean
+ context.theme.obtainStyledAttributes(
+ parser,
+ R.styleable.SplitPairRule,
+ 0,
+ 0
+ ).apply {
+ ratio = getFloat(R.styleable.SplitPairRule_splitRatio, 0.0f)
+ minWidth = getDimension(R.styleable.SplitPairRule_splitMinWidth, 0.0f).toInt()
+ minSmallestWidth = getDimension(R.styleable.SplitPairRule_splitMinSmallestWidth, 0.0f)
+ .toInt()
+ layoutDir = getInt(
+ R.styleable.SplitPairRule_splitLayoutDirection,
+ LayoutDirection.LOCALE
+ )
+ finishPrimaryWithSecondary =
+ getBoolean(R.styleable.SplitPairRule_finishPrimaryWithSecondary, false)
+ finishSecondaryWithPrimary =
+ getBoolean(R.styleable.SplitPairRule_finishSecondaryWithPrimary, true)
+ clearTop =
+ getBoolean(R.styleable.SplitPairRule_clearTop, false)
+ }
+ return SplitPairRule(
+ emptySet(),
+ finishPrimaryWithSecondary,
+ finishSecondaryWithPrimary,
+ clearTop,
+ minWidth,
+ minSmallestWidth,
+ ratio,
+ layoutDir
+ )
+ }
+
+ private fun parseSplitPlaceholderRule(
+ context: Context,
+ parser: XmlResourceParser
+ ): SplitPlaceholderRule {
+ val placeholderActivityIntentName: String?
+ val ratio: Float
+ val minWidth: Int
+ val minSmallestWidth: Int
+ val layoutDir: Int
+ context.theme.obtainStyledAttributes(
+ parser,
+ R.styleable.SplitPlaceholderRule,
+ 0,
+ 0
+ ).apply {
+ placeholderActivityIntentName = getString(
+ R.styleable.SplitPlaceholderRule_placeholderActivityName
+ )
+ ratio = getFloat(R.styleable.SplitPlaceholderRule_splitRatio, 0.0f)
+ minWidth = getDimension(R.styleable.SplitPlaceholderRule_splitMinWidth, 0.0f).toInt()
+ minSmallestWidth = getDimension(
+ R.styleable.SplitPlaceholderRule_splitMinSmallestWidth,
+ 0.0f
+ ).toInt()
+ layoutDir = getInt(
+ R.styleable.SplitPlaceholderRule_splitLayoutDirection,
+ LayoutDirection.LOCALE
+ )
+ }
+ val packageName = context.applicationContext.packageName
+ val placeholderActivityClassName = buildClassName(
+ packageName,
+ placeholderActivityIntentName
+ )
+
+ return SplitPlaceholderRule(
+ emptySet(),
+ Intent().setComponent(placeholderActivityClassName),
+ minWidth,
+ minSmallestWidth,
+ ratio,
+ layoutDir
+ )
+ }
+
+ private fun parseSplitPairFilter(
+ context: Context,
+ parser: XmlResourceParser
+ ): SplitPairFilter {
+ val primaryActivityName: String?
+ val secondaryActivityIntentName: String?
+ val secondaryActivityAction: String?
+ context.theme.obtainStyledAttributes(
+ parser,
+ R.styleable.SplitPairFilter,
+ 0,
+ 0
+ ).apply {
+ primaryActivityName = getString(R.styleable.SplitPairFilter_primaryActivityName)
+ secondaryActivityIntentName = getString(
+ R.styleable.SplitPairFilter_secondaryActivityName
+ )
+ secondaryActivityAction = getString(
+ R.styleable.SplitPairFilter_secondaryActivityAction
+ )
+ }
+ val packageName = context.applicationContext.packageName
+ val primaryActivityClassName = buildClassName(packageName, primaryActivityName)
+ val secondaryActivityClassName = buildClassName(packageName, secondaryActivityIntentName)
+ return SplitPairFilter(
+ primaryActivityClassName,
+ secondaryActivityClassName,
+ secondaryActivityAction
+ )
+ }
+
+ private fun parseSplitActivityRule(
+ context: Context,
+ parser: XmlResourceParser
+ ): ActivityRule {
+ val alwaysExpand: Boolean
+ context.theme.obtainStyledAttributes(
+ parser,
+ R.styleable.ActivityRule,
+ 0,
+ 0
+ ).apply {
+ alwaysExpand = getBoolean(R.styleable.ActivityRule_alwaysExpand, false)
+ }
+ return ActivityRule(emptySet(), alwaysExpand)
+ }
+
+ private fun parseActivityFilter(
+ context: Context,
+ parser: XmlResourceParser
+ ): ActivityFilter {
+ val activityName: String?
+ val activityIntentAction: String?
+ context.theme.obtainStyledAttributes(
+ parser,
+ R.styleable.ActivityFilter,
+ 0,
+ 0
+ ).apply {
+ activityName = getString(R.styleable.ActivityFilter_activityName)
+ activityIntentAction = getString(R.styleable.ActivityFilter_activityAction)
+ }
+ val packageName = context.applicationContext.packageName
+ return ActivityFilter(
+ buildClassName(packageName, activityName),
+ activityIntentAction
+ )
+ }
+
+ private fun buildClassName(pkg: String, clsSeq: CharSequence?): ComponentName {
+ if (clsSeq == null || clsSeq.isEmpty()) {
+ throw IllegalArgumentException("Activity name must not be null")
+ }
+ val cls = clsSeq.toString()
+ val c = cls[0]
+ if (c == '.') {
+ return ComponentName(pkg, pkg + cls)
+ }
+ var pkgString = pkg
+ var clsString = cls
+ val pkgDividerIndex = cls.indexOf('/')
+ if (pkgDividerIndex > 0) {
+ pkgString = cls.substring(0, pkgDividerIndex)
+ clsString = cls.substring(pkgDividerIndex + 1)
+ }
+ if (clsString != "*" && clsString.indexOf('.') < 0) {
+ val b = StringBuilder(pkgString)
+ b.append('.')
+ b.append(clsString)
+ return ComponentName(pkgString, b.toString())
+ }
+ return ComponentName(pkgString, clsString)
+ }
+}
diff --git a/window/window/src/main/java/androidx/window/layout/ExtensionWindowBackend.kt b/window/window/src/main/java/androidx/window/layout/ExtensionWindowBackend.kt
index df9eacc..63facfcad 100644
--- a/window/window/src/main/java/androidx/window/layout/ExtensionWindowBackend.kt
+++ b/window/window/src/main/java/androidx/window/layout/ExtensionWindowBackend.kt
@@ -39,16 +39,17 @@
) var windowExtension: ExtensionInterfaceCompat?
) : WindowBackend {
- init {
- windowExtension?.setExtensionCallback(ExtensionListenerImpl())
- }
-
/**
* List of all registered callbacks for window layout info. Not protected by [globalLock] to
* allow iterating and callback execution without holding the global lock.
*/
@VisibleForTesting
- val windowLayoutChangeCallbacks = CopyOnWriteArrayList<WindowLayoutChangeCallbackWrapper>()
+ val windowLayoutChangeCallbacks: CopyOnWriteArrayList<WindowLayoutChangeCallbackWrapper>
+
+ init {
+ windowLayoutChangeCallbacks = CopyOnWriteArrayList<WindowLayoutChangeCallbackWrapper>()
+ windowExtension?.setExtensionCallback(ExtensionListenerImpl())
+ }
override fun registerLayoutChangeCallback(
activity: Activity,
diff --git a/window/window/src/main/res/values/attrs.xml b/window/window/src/main/res/values/attrs.xml
new file mode 100644
index 0000000..46d4255
--- /dev/null
+++ b/window/window/src/main/res/values/attrs.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ Copyright 2021 The Android Open Source Project
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT 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>
+ <!-- Defines what part of the width should be given to the primary activity. Defaults to an
+ equal width split. -->
+ <attr name="splitRatio" format="float" />
+ <!-- The smallest value of width of the parent window when the split should be used. -->
+ <attr name="splitMinWidth" format="dimension" />
+ <!-- The smallest value of the smallest-width (sw) of the parent window in any rotation when
+ the split should be used. -->
+ <attr name="splitMinSmallestWidth" format="dimension" />
+ <attr name="splitLayoutDirection" format="enum">
+ <enum name="locale" value="0" />
+ <enum name="ltr" value="1" />
+ <enum name="rtl" value="2" />
+ </attr>
+
+ <!-- Split configuration rules for activity pairs. Must contain at least one SplitPairFilter.
+ See androidx.window.embedding.SplitPairRule for complete documentation. -->
+ <declare-styleable name="SplitPairRule">
+ <!-- When all activities are finished in the secondary container, the activity in the
+ primary container that created the split should also be finished. Defaults to "false". -->
+ <attr name="finishPrimaryWithSecondary" format="boolean" />
+ <!-- When all activities are finished in the primary container, the activities in the
+ secondary container in the split should also be finished. Defaults to "true". -->
+ <attr name="finishSecondaryWithPrimary" format="boolean" />
+ <!-- If there is an existing split with the same primary container, indicates whether the
+ existing secondary container on top and all activities in it should be destroyed when a new
+ split is created using this rule. Otherwise the new secondary will appear on top. Defaults
+ to "false". -->
+ <attr name="clearTop" format="boolean" />
+ <attr name="splitRatio"/>
+ <attr name="splitMinWidth"/>
+ <attr name="splitMinSmallestWidth"/>
+ <attr name="splitLayoutDirection"/>
+ </declare-styleable>
+
+ <!-- Configuration rules for split placeholders. Must contain at least one ActivityFilter for
+ the primary activity for which the rule should be applied.
+ See androidx.window.embedding.SplitPlaceholderRule for complete documentation. -->
+ <declare-styleable name="SplitPlaceholderRule">
+ <!-- Component name of the placeholder activity in the split. Must be non-empty. -->
+ <attr name="placeholderActivityName" format="string" />
+ <attr name="splitRatio"/>
+ <attr name="splitMinWidth"/>
+ <attr name="splitMinSmallestWidth"/>
+ <attr name="splitLayoutDirection"/>
+ </declare-styleable>
+
+ <!-- Filter used to find if a pair of activities should be put in a split. -->
+ <declare-styleable name="SplitPairFilter">
+ <!-- Component name of the primary activity in the split. Must be non-empty. Can contain a
+ wildcard at the end or instead of package name and/or class name. -->
+ <attr name="primaryActivityName" format="string" />
+ <!-- Component name of the secondary activity in the split. Must be non-empty. Can contain a
+ wildcard at the end or instead of package name and/or class name. -->
+ <attr name="secondaryActivityName" format="string" />
+ <!-- Action used for secondary activity launch. May be empty. Must not contain wildcards.
+ -->
+ <attr name="secondaryActivityAction" format="string" />
+ </declare-styleable>
+
+ <!-- Layout configuration rules for individual activities. Takes precedence over
+ SplitPairRule. Must contain at least one ActivityFilter.
+ See androidx.window.layout.ActivityRule for complete documentation. -->
+ <declare-styleable name="ActivityRule">
+ <!-- Whether the activity should always be expanded on launch. -->
+ <attr name="alwaysExpand" format="boolean" />
+ </declare-styleable>
+
+ <!-- Filter for ActivityRule. -->
+ <declare-styleable name="ActivityFilter">
+ <!-- Component name of the primary activity in the split. Must be non-empty. Can contain a
+ single wildcard at the end. -->
+ <attr name="activityName" format="string" />
+ <!-- Action used for activity launch. May be empty. Must not contain wildcards.
+ -->
+ <attr name="activityAction" format="string" />
+ </declare-styleable>
+</resources>
\ No newline at end of file